OVH Cloud OVH Cloud

Ouverture de classeur par VBA

5 réponses
Avatar
Michel RAMEAUX
Bonjour,
Je souhaite ouvrir par VBA des classeurs situés dans un répertoire en
réseau.
Si l'un de ces classeur est actuellement utilisé, je ne veux pas de
l'information style "Toto.xls est utilisé par Pierre".
Je veux capter cette erreur (1004 trouvée après ouverture du classeur),
prévenir l'utilisateur et faire qu'il ne puisse pas choisir l'option "Ouvrir
en lecture seule", et dérouter le code pour ne pas avoir de surprises au
moment de la fermeture qui engendrera la perte des informations saisies via
le code.
Je souhaite quelque chose du style :
Si (tous les classeurs sont dispo; continuer car tout va bien; au moins 1
classeur est non disponible donc arret de la macro)
Merci de votre aide.

5 réponses

Avatar
Clément Marcotte
Bonjour,

Select case err.number
case 1004
msgbox "Un des fichiers n'est pas disponible. Fin du programme"
end
case else
end select


"Michel RAMEAUX" a écrit dans le message
de news:
Bonjour,
Je souhaite ouvrir par VBA des classeurs situés dans un répertoire
en

réseau.
Si l'un de ces classeur est actuellement utilisé, je ne veux pas de
l'information style "Toto.xls est utilisé par Pierre".
Je veux capter cette erreur (1004 trouvée après ouverture du
classeur),

prévenir l'utilisateur et faire qu'il ne puisse pas choisir l'option
"Ouvrir

en lecture seule", et dérouter le code pour ne pas avoir de
surprises au

moment de la fermeture qui engendrera la perte des informations
saisies via

le code.
Je souhaite quelque chose du style :
Si (tous les classeurs sont dispo; continuer car tout va bien; au
moins 1

classeur est non disponible donc arret de la macro)
Merci de votre aide.









Avatar
michdenis
Bonsoir Michel,


Voici une façon de faire qui fut élaborée par des usagers du MPFE et publiée ici même :



----------Début de copie----------


Moi j'ai un eu problème similaire en réseau NT avec Excel 2000.
Suite à l'aide de plusieurs sur ce forum, (encore merci à El-Joker, Frédéric
Sigonneau et Thierry Rural, voir ficelle "Macro Workbooks.Open sur fichier
déjà en cours de lecture" du 10/12/2001 11:54) j'ai fini par réussir à faire
çà...

Pour ce genre de fichiers qui sont souvent ouverts (pas longtemps) par
d'autres utilisateur, j'ai créé une interface d'ouverture, (en fait un
personnal.xls dans le startup).
Cette interface (non hiden) contient les boutons d'ouverture directe des
fichiers en question.
Dans l'exemple le bouton d'ouverture de "Demand.xls" lance la macro
"CallDemands"

C'est radical! si le fichier est ouvert = Message (et il s'ouvre pas) sinon
il s'ouvre.

Voici le code : (à mettre dans un module standard du personnal.xls)

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

On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
Case Else
Error errnum
End Select
End Function

Sub CallDemands()
Dim Msg, Style, Title
If IsFileOpen("P:DevelopmentsDemand.xls") Then
MsgBox "File Already in use" & Chr(13) & "Please Try Latter"
Else
Workbooks.Open "P:DevelopmentsDemand.xls"
End If
End Sub

----------Fin de copie----------


Salutations!






"Michel RAMEAUX" a écrit dans le message de news:
Bonjour,
Je souhaite ouvrir par VBA des classeurs situés dans un répertoire en
réseau.
Si l'un de ces classeur est actuellement utilisé, je ne veux pas de
l'information style "Toto.xls est utilisé par Pierre".
Je veux capter cette erreur (1004 trouvée après ouverture du classeur),
prévenir l'utilisateur et faire qu'il ne puisse pas choisir l'option "Ouvrir
en lecture seule", et dérouter le code pour ne pas avoir de surprises au
moment de la fermeture qui engendrera la perte des informations saisies via
le code.
Je souhaite quelque chose du style :
Si (tous les classeurs sont dispo; continuer car tout va bien; au moins 1
classeur est non disponible donc arret de la macro)
Merci de votre aide.
Avatar
Michel RAMEAUX
Cela marche très bien, merci. Je ne connaissais pas la méthode Open...

En fait il faut tenir compte que :
1 - le fichier soit présent dans son répertoire,
2 - le fichier soit ou non ouvert localement.
3 - le fichier soit ou non ouvert à distance.

"michdenis" a écrit dans le message news:

Bonsoir Michel,


Voici une façon de faire qui fut élaborée par des usagers du MPFE et
publiée ici même :




----------Début de copie----------


Moi j'ai un eu problème similaire en réseau NT avec Excel 2000.
Suite à l'aide de plusieurs sur ce forum, (encore merci à El-Joker,
Frédéric

Sigonneau et Thierry Rural, voir ficelle "Macro Workbooks.Open sur fichier
déjà en cours de lecture" du 10/12/2001 11:54) j'ai fini par réussir à
faire

çà...

Pour ce genre de fichiers qui sont souvent ouverts (pas longtemps) par
d'autres utilisateur, j'ai créé une interface d'ouverture, (en fait un
personnal.xls dans le startup).
Cette interface (non hiden) contient les boutons d'ouverture directe des
fichiers en question.
Dans l'exemple le bouton d'ouverture de "Demand.xls" lance la macro
"CallDemands"

C'est radical! si le fichier est ouvert = Message (et il s'ouvre pas)
sinon

il s'ouvre.

Voici le code : (à mettre dans un module standard du personnal.xls)

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

On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
Case Else
Error errnum
End Select
End Function

Sub CallDemands()
Dim Msg, Style, Title
If IsFileOpen("P:DevelopmentsDemand.xls") Then
MsgBox "File Already in use" & Chr(13) & "Please Try Latter"
Else
Workbooks.Open "P:DevelopmentsDemand.xls"
End If
End Sub

----------Fin de copie----------


Salutations!






"Michel RAMEAUX" a écrit dans le message de
news:

Bonjour,
Je souhaite ouvrir par VBA des classeurs situés dans un répertoire en
réseau.
Si l'un de ces classeur est actuellement utilisé, je ne veux pas de
l'information style "Toto.xls est utilisé par Pierre".
Je veux capter cette erreur (1004 trouvée après ouverture du classeur),
prévenir l'utilisateur et faire qu'il ne puisse pas choisir l'option
"Ouvrir

en lecture seule", et dérouter le code pour ne pas avoir de surprises au
moment de la fermeture qui engendrera la perte des informations saisies
via

le code.
Je souhaite quelque chose du style :
Si (tous les classeurs sont dispo; continuer car tout va bien; au moins 1
classeur est non disponible donc arret de la macro)
Merci de votre aide.










Avatar
Michel RAMEAUX
En remerciement, et pour tous ceux qui veulent ouvrir un classeur en réseau,
voici ce qui fonctionne :test d'existence du dossier dans le répertoire
choisi, test de la disponibilité sur le réseau, test de l'ouverture locale.
J'accepte les remarques.

Sub DémoOuvrirFichier()
' Classeur nécessaire :
Chemin Workbooks("Gestion.xls").Worksheets("Données").Range("A1").Value
Chemin2 = "Suivi"
Fichier = "Données.xls"
' Test de l'existence du fichier et son chemin
Call ExisteFichier(Chemin, Chemin2, Fichier)
If Trouvé = False Then
Call FichierAbsent
GoTo FichierAbsent ' Le Fichier n'existe pas : traitement de
l'erreur
Exit Sub
End If
' Test d'Ouverture du classeur
Call OuvrirFichier(Chemin, Chemin2, Fichier)
' Traitement
If Occupé = True Then
GoTo FichierUtilisé ' Traitement de l'erreur
Exit Sub
Else
If OuvertLocal = True Then
MsgBox "Tout va bien, mais le fichier est ouvert localement"
Exit Sub
Else
MsgBox "Tout va bien. On ouvre le fichier"
End If
End If
Exit Sub
FichierAbsent:
MsgBox "Le fichier n'existe pas" ' Placer ici le code
Exit Sub
FichierUtilisé:
MsgBox "Le fichier n'est pas disponible" ' Placer ici le code
End Sub
'-----------------------------------
Private Function ExisteFichier(Chemin, Chemin2, Fichier) As Boolean
If Dir(Chemin & "" & Chemin2 & "" & Fichier) = "" Then
Trouvé = False ' Le Fichier n'existe pas
Mess = MsgBox("Le dossier - " & UCase(Fichier) & " - n'existe " & _
"pas ou a été déplacé." & vbCrLf & vbCrLf & _
"Impossible de continuer.", vbOKOnly, "Ouverture des dossiers")
Else
Trouvé = True ' Le Fichier existe
End If
End Function
'-----------------------------------
Private Function OuvrirFichier(Chemin, Chemin2, Fichier) As Boolean
Dim FileNum As Integer
Dim ErrNum As Integer

' Le Fichier est-il déja disponible sur le PC (en local)?
On Error Resume Next
Set W = Workbooks(Fichier)
If Err = 0 Then
Debug.Print Err
OuvertLocal = True ' Fichier Ouvert en local
Exit Function
Else
Debug.Print Err ' Err=9
OuvertLocal = False ' Fichier non ouvert en local
End If
If OuvertLocal = False Then
' Le Fichier n'est pas ouvert localement, est-il disponible sur le réseau?
On Error Resume Next
FileNum = FreeFile()
Open (Chemin & "" & Chemin2 & "" & Fichier) For Input Lock Read As
#FileNum
Close FileNum
ErrNum = Err
On Error GoTo 0
Select Case ErrNum
Case 0
Occupé = False ' Fichier non utilisé
Case 70
Occupé = True ' Fichier utilisé
Mess = MsgBox("Le dossier - " & UCase(Fichier) & " - n'est
pas " & _
"disponible. Merci de renouveler votre demande
ultérieurement.", _
vbOKOnly, "Ouverture des dossiers")
Case Else
Error ErrNum
End Select
End If
End Function

Les déclarations des variables sont à faire à bon escient.

Bonne continuation...




"michdenis" a écrit dans le message news:

Bonsoir Michel,


Voici une façon de faire qui fut élaborée par des usagers du MPFE et
publiée ici même :




----------Début de copie----------


Moi j'ai un eu problème similaire en réseau NT avec Excel 2000.
Suite à l'aide de plusieurs sur ce forum, (encore merci à El-Joker,
Frédéric

Sigonneau et Thierry Rural, voir ficelle "Macro Workbooks.Open sur fichier
déjà en cours de lecture" du 10/12/2001 11:54) j'ai fini par réussir à
faire

çà...

Pour ce genre de fichiers qui sont souvent ouverts (pas longtemps) par
d'autres utilisateur, j'ai créé une interface d'ouverture, (en fait un
personnal.xls dans le startup).
Cette interface (non hiden) contient les boutons d'ouverture directe des
fichiers en question.
Dans l'exemple le bouton d'ouverture de "Demand.xls" lance la macro
"CallDemands"

C'est radical! si le fichier est ouvert = Message (et il s'ouvre pas)
sinon

il s'ouvre.

Voici le code : (à mettre dans un module standard du personnal.xls)

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

On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
Case Else
Error errnum
End Select
End Function

Sub CallDemands()
Dim Msg, Style, Title
If IsFileOpen("P:DevelopmentsDemand.xls") Then
MsgBox "File Already in use" & Chr(13) & "Please Try Latter"
Else
Workbooks.Open "P:DevelopmentsDemand.xls"
End If
End Sub

----------Fin de copie----------


Salutations!






"Michel RAMEAUX" a écrit dans le message de
news:

Bonjour,
Je souhaite ouvrir par VBA des classeurs situés dans un répertoire en
réseau.
Si l'un de ces classeur est actuellement utilisé, je ne veux pas de
l'information style "Toto.xls est utilisé par Pierre".
Je veux capter cette erreur (1004 trouvée après ouverture du classeur),
prévenir l'utilisateur et faire qu'il ne puisse pas choisir l'option
"Ouvrir

en lecture seule", et dérouter le code pour ne pas avoir de surprises au
moment de la fermeture qui engendrera la perte des informations saisies
via

le code.
Je souhaite quelque chose du style :
Si (tous les classeurs sont dispo; continuer car tout va bien; au moins 1
classeur est non disponible donc arret de la macro)
Merci de votre aide.










Avatar
michdenis
Bonsoir Michel,

Merci pour ce retour d'information.


Cela a l'air très bien même si je n'ai pas l'environnement pour effectuer un petit test !


Salutations!




"Michel RAMEAUX" a écrit dans le message de news:%
En remerciement, et pour tous ceux qui veulent ouvrir un classeur en réseau,
voici ce qui fonctionne :test d'existence du dossier dans le répertoire
choisi, test de la disponibilité sur le réseau, test de l'ouverture locale.
J'accepte les remarques.

Sub DémoOuvrirFichier()
' Classeur nécessaire :
Chemin Workbooks("Gestion.xls").Worksheets("Données").Range("A1").Value
Chemin2 = "Suivi"
Fichier = "Données.xls"
' Test de l'existence du fichier et son chemin
Call ExisteFichier(Chemin, Chemin2, Fichier)
If Trouvé = False Then
Call FichierAbsent
GoTo FichierAbsent ' Le Fichier n'existe pas : traitement de
l'erreur
Exit Sub
End If
' Test d'Ouverture du classeur
Call OuvrirFichier(Chemin, Chemin2, Fichier)
' Traitement
If Occupé = True Then
GoTo FichierUtilisé ' Traitement de l'erreur
Exit Sub
Else
If OuvertLocal = True Then
MsgBox "Tout va bien, mais le fichier est ouvert localement"
Exit Sub
Else
MsgBox "Tout va bien. On ouvre le fichier"
End If
End If
Exit Sub
FichierAbsent:
MsgBox "Le fichier n'existe pas" ' Placer ici le code
Exit Sub
FichierUtilisé:
MsgBox "Le fichier n'est pas disponible" ' Placer ici le code
End Sub
'-----------------------------------
Private Function ExisteFichier(Chemin, Chemin2, Fichier) As Boolean
If Dir(Chemin & "" & Chemin2 & "" & Fichier) = "" Then
Trouvé = False ' Le Fichier n'existe pas
Mess = MsgBox("Le dossier - " & UCase(Fichier) & " - n'existe " & _
"pas ou a été déplacé." & vbCrLf & vbCrLf & _
"Impossible de continuer.", vbOKOnly, "Ouverture des dossiers")
Else
Trouvé = True ' Le Fichier existe
End If
End Function
'-----------------------------------
Private Function OuvrirFichier(Chemin, Chemin2, Fichier) As Boolean
Dim FileNum As Integer
Dim ErrNum As Integer

' Le Fichier est-il déja disponible sur le PC (en local)?
On Error Resume Next
Set W = Workbooks(Fichier)
If Err = 0 Then
Debug.Print Err
OuvertLocal = True ' Fichier Ouvert en local
Exit Function
Else
Debug.Print Err ' Err=9
OuvertLocal = False ' Fichier non ouvert en local
End If
If OuvertLocal = False Then
' Le Fichier n'est pas ouvert localement, est-il disponible sur le réseau?
On Error Resume Next
FileNum = FreeFile()
Open (Chemin & "" & Chemin2 & "" & Fichier) For Input Lock Read As
#FileNum
Close FileNum
ErrNum = Err
On Error GoTo 0
Select Case ErrNum
Case 0
Occupé = False ' Fichier non utilisé
Case 70
Occupé = True ' Fichier utilisé
Mess = MsgBox("Le dossier - " & UCase(Fichier) & " - n'est
pas " & _
"disponible. Merci de renouveler votre demande
ultérieurement.", _
vbOKOnly, "Ouverture des dossiers")
Case Else
Error ErrNum
End Select
End If
End Function

Les déclarations des variables sont à faire à bon escient.

Bonne continuation...




"michdenis" a écrit dans le message news:

Bonsoir Michel,


Voici une façon de faire qui fut élaborée par des usagers du MPFE et
publiée ici même :




----------Début de copie----------


Moi j'ai un eu problème similaire en réseau NT avec Excel 2000.
Suite à l'aide de plusieurs sur ce forum, (encore merci à El-Joker,
Frédéric

Sigonneau et Thierry Rural, voir ficelle "Macro Workbooks.Open sur fichier
déjà en cours de lecture" du 10/12/2001 11:54) j'ai fini par réussir à
faire

çà...

Pour ce genre de fichiers qui sont souvent ouverts (pas longtemps) par
d'autres utilisateur, j'ai créé une interface d'ouverture, (en fait un
personnal.xls dans le startup).
Cette interface (non hiden) contient les boutons d'ouverture directe des
fichiers en question.
Dans l'exemple le bouton d'ouverture de "Demand.xls" lance la macro
"CallDemands"

C'est radical! si le fichier est ouvert = Message (et il s'ouvre pas)
sinon

il s'ouvre.

Voici le code : (à mettre dans un module standard du personnal.xls)

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

On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
Case Else
Error errnum
End Select
End Function

Sub CallDemands()
Dim Msg, Style, Title
If IsFileOpen("P:DevelopmentsDemand.xls") Then
MsgBox "File Already in use" & Chr(13) & "Please Try Latter"
Else
Workbooks.Open "P:DevelopmentsDemand.xls"
End If
End Sub

----------Fin de copie----------


Salutations!






"Michel RAMEAUX" a écrit dans le message de
news:

Bonjour,
Je souhaite ouvrir par VBA des classeurs situés dans un répertoire en
réseau.
Si l'un de ces classeur est actuellement utilisé, je ne veux pas de
l'information style "Toto.xls est utilisé par Pierre".
Je veux capter cette erreur (1004 trouvée après ouverture du classeur),
prévenir l'utilisateur et faire qu'il ne puisse pas choisir l'option
"Ouvrir

en lecture seule", et dérouter le code pour ne pas avoir de surprises au
moment de la fermeture qui engendrera la perte des informations saisies
via

le code.
Je souhaite quelque chose du style :
Si (tous les classeurs sont dispo; continuer car tout va bien; au moins 1
classeur est non disponible donc arret de la macro)
Merci de votre aide.