Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Excel et la gestion des erreurs

5 réponses
Avatar
Ptit Louis
Bonjour,
Sur plusieurs PC, tous en 2003, le fait d'ouvrir par VBA un classeur déjà
utilisé sur un autre poste (ou indisponible pour x raison) ne génère pas
d'erreur (Err=0), et l'interception de cette erreur n'étant pas possible (et
donc pas traitable ou traitée), le fichier est alors ouvert en lecture seule,
et là bonjour les dégâts.
Quelqu'un a-t'il une petite idée?
Merci !

5 réponses

Avatar
Modeste
Bonsour® Ptit Louis avec ferveur ;o))) vous nous disiez :
Sur plusieurs PC, tous en 2003, le fait d'ouvrir par VBA un classeur déjà
utilisé sur un autre poste (ou indisponible pour x raison) ne génère pas
d'erreur (Err=0), et l'interception de cette erreur n'étant pas possible (et
donc pas traitable ou traitée), le fichier est alors ouvert en lecture seule,
et là bonjour les dégâts.


If ActiveWorkbook.ReadOnly Then

--
--
@+
;o)))

Avatar
Ptit Louis
Bonjour,
... Certes, mais Excel DOIT générer l'erreur 70 (Errp, ce qui signifie :
Fichier non disponible), ce qu'il ne fait pas : Err=0, ce qui veut dire
"classeur disponible", ce qui n'est manifestement pas le cas! preuve
supplémentaire : l'ouverture en "Lecture seule", ce qui signifie qu'il a bien
vu l'indisponibilité, mais ne la signale pas !
Je ne souhaite pas "adapter" le code selon les humeurs d'Excel et le lieu de
fonctionnement de mes programmes, il faudrait comprendre pourquoi l'erreur
n'est pas générée (ce qui l'empêche d'apparaître) ce qui serait plus subtile.


Bonsour® Ptit Louis avec ferveur ;o))) vous nous disiez :
Sur plusieurs PC, tous en 2003, le fait d'ouvrir par VBA un classeur déjà
utilisé sur un autre poste (ou indisponible pour x raison) ne génère pas
d'erreur (Err=0), et l'interception de cette erreur n'étant pas possible (et
donc pas traitable ou traitée), le fichier est alors ouvert en lecture seule,
et là bonjour les dégâts.


If ActiveWorkbook.ReadOnly Then

--
--
@+
;o)))






Avatar
Modeste
Bonsour® Ptit Louis avec ferveur ;o))) vous nous disiez :

Bonjour,
... Certes, mais Excel DOIT générer l'erreur 70 (Errp, ce qui signifie :
Fichier non disponible), ce qu'il ne fait pas : Err=0, ce qui veut dire
"classeur disponible", ce qui n'est manifestement pas le cas! preuve
supplémentaire : l'ouverture en "Lecture seule", ce qui signifie qu'il a bien
vu l'indisponibilité, mais ne la signale pas !
Je ne souhaite pas "adapter" le code selon les humeurs d'Excel et le lieu de
fonctionnement de mes programmes, il faudrait comprendre pourquoi l'erreur
n'est pas générée (ce qui l'empêche d'apparaître) ce qui serait plus subtile.


je persiste : si le fichier s'ouvre en lecture seule c'est qu'il est disponible
"en lecture ...." !!!
d'ailleurs err 70 c'est Permission refusée (on a effectivement bien le droit de
l'ouvrir en lecture seule)
l'erreur 70 ne sera retournée que si l'on fait une action interdite : ecrire
....
(ce que fait l'instruction Lock dans le code ci-dessous)

Ange Ounis avait commis cette macro pour tester si un classeur est déja
ouvert en partagé
en trappant l'erreur lecture seule
;o)))
'====================== ' This function checks to see if a file is open or not. If the file is
' already open, it returns True. If the file is not open, it returns
' False. Otherwise, a run-time error will occur because there is
' some other problem accessing the file.

Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer


On Error Resume Next ' Turn error checking off.
filenum = FreeFile() ' Get a free file number.
' Attempt to open the file and lock it.
Open filename For Input Lock Read As #filenum
Close filenum ' Close the file.
errnum = Err ' Save the error number that occurred.
On Error GoTo 0 ' Turn error checking back on.


' Check to see which error occurred.
Select Case errnum


' No error occurred.
' File is NOT already open by another user.
Case 0
IsFileOpen = False


' Error number for "Permission Denied."
' File is already opened by another user.
Case 70
IsFileOpen = True


' Another error occurred, file is being queried.
Case Else
Error errnum
End Select


End Function


'***********


Function IsFileOpen2(sFileName As String) As Boolean
On Error GoTo FileIsOpen:
Open sFileName For Random Lock Read Write As #1
IsFileOpen2 = False
Close #1
Exit Function
FileIsOpen:
IsFileOpen2 = True
Close
End Function


'======================


--
--
@+
;o)))

Avatar
Ptit Louis
Bonjour,
le programme de test que j'ai écrit voici plusieurs années (il a été publié
sur un site et amélioré encore depuis) fonctionne sans ennuis sur plusieurs
centaines de PC est très proche de celui proposé.
Sur les PC en cause, en cas d'incident l'erreur (70 attendue) est toujours
égale à 0, surles autres, en cas d'indisponibilité (test simultané dans la
même configuration), l'erreur 70 est bien présente!


Bonsour® Ptit Louis avec ferveur ;o))) vous nous disiez :

Bonjour,
... Certes, mais Excel DOIT générer l'erreur 70 (Errp, ce qui signifie :
Fichier non disponible), ce qu'il ne fait pas : Err=0, ce qui veut dire
"classeur disponible", ce qui n'est manifestement pas le cas! preuve
supplémentaire : l'ouverture en "Lecture seule", ce qui signifie qu'il a bien
vu l'indisponibilité, mais ne la signale pas !
Je ne souhaite pas "adapter" le code selon les humeurs d'Excel et le lieu de
fonctionnement de mes programmes, il faudrait comprendre pourquoi l'erreur
n'est pas générée (ce qui l'empêche d'apparaître) ce qui serait plus subtile.


je persiste : si le fichier s'ouvre en lecture seule c'est qu'il est disponible
"en lecture ...." !!!
d'ailleurs err 70 c'est Permission refusée (on a effectivement bien le droit de
l'ouvrir en lecture seule)
l'erreur 70 ne sera retournée que si l'on fait une action interdite : ecrire
.....
(ce que fait l'instruction Lock dans le code ci-dessous)

Ange Ounis avait commis cette macro pour tester si un classeur est déja
ouvert en partagé
en trappant l'erreur lecture seule
;o)))
'====================== > ' This function checks to see if a file is open or not. If the file is
' already open, it returns True. If the file is not open, it returns
' False. Otherwise, a run-time error will occur because there is
' some other problem accessing the file.

Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer


On Error Resume Next ' Turn error checking off.
filenum = FreeFile() ' Get a free file number.
' Attempt to open the file and lock it.
Open filename For Input Lock Read As #filenum
Close filenum ' Close the file.
errnum = Err ' Save the error number that occurred.
On Error GoTo 0 ' Turn error checking back on.


' Check to see which error occurred.
Select Case errnum


' No error occurred.
' File is NOT already open by another user.
Case 0
IsFileOpen = False


' Error number for "Permission Denied."
' File is already opened by another user.
Case 70
IsFileOpen = True


' Another error occurred, file is being queried.
Case Else
Error errnum
End Select


End Function


'***********


Function IsFileOpen2(sFileName As String) As Boolean
On Error GoTo FileIsOpen:
Open sFileName For Random Lock Read Write As #1
IsFileOpen2 = False
Close #1
Exit Function
FileIsOpen:
IsFileOpen2 = True
Close
End Function


'====================== >


--
--
@+
;o)))






Avatar
Modeste
Bonsour® Ptit Louis avec ferveur ;o))) vous nous disiez :
Sur plusieurs PC, tous en 2003, le fait d'ouvrir par VBA un classeur déjà
utilisé sur un autre poste (ou indisponible pour x raison) ne génère pas
d'erreur (Err=0), et l'interception de cette erreur n'étant pas possible (et
donc pas traitable ou traitée), le fichier est alors ouvert en lecture seule,
et là bonjour les dégâts.


s'assurer des priviléges de partage de chaque PC
- voir l'administrateur réseau
s'assurer da la version Excel sur les PC concernés
- par exemple :
Il n'aime pas [A65536] pour Range("A65536")
l'utilisation des crochets "[ ]" est natif dans excel depuis l'origine

par contre A65536 n'existe que depuis XL 2000 avant il n'y avait que 32768
lignes

l'interception d'une erreur doit etre possible quand bien même elle ne serait
pas générée par EXCEL.
s'assurer par ailleurs de la gestion d'erreur, il convient de détecter le code
erreur dans une routine spécifique
eviter : on error resume next
mais plutot :

sub ptitlouis()
on error goto trterr
.....le code qui va bien !!!
exit sub

trterr:
select case err
case xxx
traitement x
case yyy
resume next
case zzz
Msg = "L'erreur # " & Str(Err.Number) & " a été générée par " _
& Err.Source & Chr(13) & Err.Description
MsgBox Msg, , "Erreur", Err.Helpfile, Err.HelpContext
end select
end sub

--
--
@+
;o)))