Macro Excel si fichier ouvert message et arrêt de la macro [Résolu/Fermé]

Signaler
Messages postés
1
Date d'inscription
lundi 27 avril 2015
Statut
Membre
Dernière intervention
27 avril 2015
-
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
-
Bonjour et merci d'avance pour votre aide,
J'ai une macro dans excel qui ouvre un fichier. J'ai un problème lorsque je tente d'ouvrir le fichier. Si le fichier est déjà ouvert par un autre utilisateur, je désire que dans ma macro il y a un message pour aviser qu'un autre utilisateur est dans le fichier et de réessayer plus tard et mettre fin à la macro pour ne pas entrer dans le débug.
Je suis très reconnaissante pour l'aide que vous pourrez m'apporter.
Merci Beaucoup
Nilec

11 réponses

Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
C'est une nouvelle procédure (macro) qui doit être placée dans le module à la suite de la vôtre, c'est-à-dire après la ligne :
End Sub
Petite remarque, j'ai l'impression que les résultats que vous obtiendrez dans le classeur [Liste des numéros.....] ne seront pas corrects. Entrer 3 à 4 enregistrements différents pour voir... !

2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57405 internautes nous ont dit merci ce mois-ci

Bon matin,
Je ne sais pas comment vous remercier. Il y a des mois que je cherchais sur le Web mais sans succès. Tous fonctionne à merveille. Un très grand MERCI pour l'aide que vous m'avez apporter.
Concernant votre remarque, les résultats que je voulais dans ce classeur sont exactement ce que je souhaitais. J'avais déjà exécuté la macro auparavant.
Encore une fois merci,
Messages postés
15267
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
8 août 2020
1 323
Bonjour,
test fichier ouvert:
https://support.microsoft.com/en-us/help/291295/
Bonjour,
Merci pour votre réponse, mais j'ai essayé et ça ne fonctionne pas. Peut-être que je n'arrive pas à mettre la commande à la bonne place.
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Merci, pas de doublon, relire encore une fois mon message qui se trouve ici.

Re-Bonjour,
Désolé, mais c'est la première fois que je participe à un forum. Si je comprends bien vous allez répondre à celui-ci. Voulez-vous que je remettre mon code de macro ?
Merci d'être patient avec moi.
Bonjour,
Merci, j'ai pris la macro sur l'autre poste.
Je vais vous donner le complément pour détecter l'état du fichier et sortir de la procédure s'il est ouvert en lecture.
Patience.


Salutations.
Le Pingou
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Je vous propose le code suivant que vous insérez après la ligne : Range("H2") = Chèque
' ******** déterter si fichier ouvert en lecture
Dim xlapp, oWk
Set xlapp = CreateObject("Excel.Application")
nomcla = "Liste des numéros ch émis année fiscale 2015.xlsm"
Rept = "U:\Cheque Émis\Original\Nicole\Macro\" ' votre répertoire
Set oWk = xlapp.Workbooks.Open(Rept & nomcla, , , , , , True, , , , True)
If oWk.ReadOnly Then
MsgBox "Le classeur est ouvert en lecture seule"
Set oWk = Nothing
Set xlapp = Nothing
Workbooks(nomcla).Close SaveChanges:=False
Exit Sub
End If
' *********
J'espère que cela marchera chez vous, chez moi petit test et c'est bon.


Salutations.
Le Pingou
Bonsoir,
J'ai copié le code à l'emplacement désigné. Si le fichier est ouvert, j'ai le message Le classeur est ouvert en lecture seule. Jusque là ça fonctionne, par contre le fichier semble s'ouvrir en lecture seule, et je ne vois plus le fichier qui était ouvert en écriture. Ensuite je ferme manuellement le fichier et j'ai toujours le message
Liste no chèque ...est verrouillée par un autre utilisateur...Et si je tente de rouler la macro à nouveau j'ai toujours ce message. Je dois donc fermer la session de mon ordi afin que le message disparaisse et que je puisse ré-ouvrir le fichier en écriture à nouveau. Il ne faudrait pas que la macro ferme le fichier si il est en utilisation car c'est un fichier qui peut-être utilisé par plusieurs personnes. Ce que je voudrais c'est simplement qu'il avise la personne qui roule la macro que le fichier est déjà en utilisation et de réessayer plus tard.
Merci beaucoup pour le temps que vous prenez à m'aider, je vous suis très reconnaissante.
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Merci pour les informations.
Pouvez-vous me renvoyer la macro originale ?

Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Petit complément, ou se trouve la macro (nom du classeur) .......
et que signifie : "='Louis Groleau 2015-01-21.xlsmcode'!R2C7" ......
Salutations.
Le Pingou
Bonjour,
ActiveCell.FormulaR1C1 = "='Louis Groleau 2015-01-21.xlsmcode'!R2C7"
Ceci est une formule qui va chercher la donnée du Fichier Louis Groleau... Ligne 2 colonne 7 )qui est est le no de période.
ActiveCell.FormulaR1C1 = "='Louis Groleau 2015-01-21.xlsmcode'!R2C7"
J'ai mis des commentaires dans la macro afin de vous guider
Voici la macro originale et j'ai ajouté le code que vous m'avez fait parvenir


Sub DonnéesCheque()
'Inscription du nom de l'usager dans le fichier Louis Groleau sur onglet chèque en C295
[chèque!C295] = Application.UserName

' Message box pour entrer le Nom, no employé la période et le type de chèque
Dim Nom As String
Dim NoEmployé As String
Dim Période As String
Dim Chèque As String
Nom = InputBox("Inscrire Prénom et Nom Employé", "Saisie du Nom")
Range("B2") = Nom
NoEmployé = InputBox("Inscrire No Employé", "Saisie du NoEmployé")

Range("F2") = NoEmployé

Période = InputBox("Inscrire No Période 2015-?? ", "Saisie du Période")

Range("G2") = Période

Chèque = InputBox("Choisir 1 avec dépôt ou 2 sans dépôt", "Saisie du Chèque")

Range("H2") = Chèque

' On ouvre le fichier Liste no ch émis afin trouver la prochaine ligne vide
' et d'inscrire le nos chèque dans le fichier louis groleau et d'inscrire nos
' données dans le fichier Liste des no ch émis ... dans les bonnes cellules ceci avec
' des formules. Puis on sauve et ferme le fichier liste des numéros ch émis


Workbooks.Open "U:\Cheque Émis\Original\Nicole\Macro\Liste des numéros ch émis année fiscale 2015.xlsm"
Ici c'est le bloc que j'ai ajouté le code que vous m'avez donné
Dim xlapp, oWk
Set xlapp = CreateObject("Excel.Application")
nomcla = "Liste des numéros ch émis année fiscale 2015.xlsm"
Rept = "U:\Cheque Émis\Original\Nicole\Macro\" ' votre répertoire
Set oWk = xlapp.Workbooks.Open(Rept & nomcla, , , , , , True, , , , True)
If oWk.ReadOnly Then
MsgBox "Le classeur est ouvert en lecture seule"
Set oWk = Nothing
Set xlapp = Nothing
Workbooks(nomcla).Close SaveChanges:=False
Exit Sub
End If

Range("h12:i12").Select
Selection.Copy
Range("A1048576").End(xlUp).Offset(1, 0).Select
ActiveCell.Offset(0, 10).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Select
ActiveCell.Offset(0, -10).Select
ActiveCell.FormulaR1C1 = "=TODAY()"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "='Louis Groleau 2015-01-21.xlsmcode'!R2C7" ' Ici formule = louis groleau... ligne 2 colonne 7
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "='Louis Groleau 2015-01-21.xlsmcode'!R2C6"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "='Louis Groleau 2015-01-21.xlsmcode'!R2C2"
ActiveCell.Offset(0, 4).Select
ActiveCell.FormulaR1C1 = _
"=IF('Louis Groleau 2015-01-21.xlsmcode'!R2C8=1,RC11+1,"""")"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = _
"=IF('Louis Groleau 2015-01-21.xlsmcode'!R2C8=2,RC[3]+1,"""")"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "='Louis Groleau 2015-01-21.xlsmcode'!R1C13"
ActiveCell.Offset(0, 3).Select
ActiveCell.FormulaR1C1 = "=IF(RC[-5]="""",RC[-4],RC[-5])"
Selection.Copy
Windows("#0000 Louis Groleau 2015-01-21.xlsm").Activate
Range("I2:K2").Select
Selection.PasteSpecial Paste:=xlPasteAllMergingConditionalFormats, Operation _
:=xlNone, SkipBlanks:=False, Transpose:=False
Windows("Liste des numéros ch émis année fiscale 2015.xlsm").Activate
Range("A1048576").End(xlUp).Offset(0, 0).Select
ActiveCell.Range(Cells(1, "A"), Cells(1, "M")).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Range(Cells(1, "K"), Cells(1, "M")).Select
Selection.ClearContents
Range("A13").Select
ActiveWorkbook.Save
ActiveWorkbook.Close

' On réactive le fichie Louis Gro... sélectionne la feuille chèque
' On vérifie si le nom de fichier existe déjà dans un répertoire qui sont indiqué dans
' des cellules spécifiques soit range B300, B301 et ensuite on enregistre le nouveau fichier
' On efface le bouton de macro
' On laisse le nouveau fichier ouvert pour que l'utilisateur puisse faire des changements

Windows("#0000 Louis Groleau 2015-01-21.xlsm").Activate
Sheets("chèque").Select
If Dir(Range("B300") & "\" & Range("b301") & ".xls") <> "" Then
If MsgBox(" ATTENTION ATTENTION ATTENTION FICHIER EXISTANT, OUI = ÉCRASER NON =VÉRIFIER NO DE PROJET ET RECOMMENCER ", vbYesNo) <> vbYes Then Exit Sub
Application.DisplayAlerts = False
End If
ActiveWorkbook.SaveAs (Range("B300") & "\" & Range("b301") & ".xls")
Sheets("code").Select
ActiveSheet.DrawingObjects.Delete
Range("D4").Select

End Sub

Encore une foi Merci
Nilec
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Merci pour le code.
Manque : dans quel classeur se trouve la macro (nom du classeur) ....... ??????
Donc le 'Louis Groleau 2015-01-21.xlsmcode'!R2C7" veut dire qu'il s'agit de la valeur de la cellule [$G$2] de la feuille ['Louis Groleau 2015-01-21.xlsmcode] du classeur ...[xxxxxxxxxxxxx.xlsm]
Et c'est le .xlsmcode qui m'a induit en erreur et fait hésiter car en général après le point (.) nous avons l'extension du classeur [xls, xlsx ou xlsm) et bien sur pas de (xlsmcode)

Note: le code transmis n'est pas introduit à la bonne place, il devait être juste après la ligne Range("H2") = Chèque

Salutations.
Le Pingou
Bonjour,
La macro est dans le fichier Louis Groleau ... et oui désolé j'ai mis le code à la bonne place juste après la ligne Range("H2") = Chèque. C'est probablement en faisant le ménage de la macro et en inscrivant les commentaires que je n'ai pas remis à la bonne place. Mais dans la macro le code est à l'endroit ou vous m'avez dit de le mettre.
Merci
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Donc pour être juste le fichier c'est le classeur [Lou....xlsm] et ceci ['Louis Groleau 2015-01-21.xlsmcode'] est le nom d'une feuille Oui / Non
Désolé, mais la macro n'est pas à la bonne place elle se trouve après : Workbooks.Open "U:\Cheque Émis\Original\Nicole\Macro\Liste des numéros ch émis année fiscale 2015.xlsm"
Au passage j'essaie de comprendre votre code, mais c'est la galère... par exemple d'où sort ce nom
"#0000 Louis Groleau 2015-01-21.xlsm" dans la ligne Windows("#0000 Louis Groleau 2015-01-21.xlsm").Activate

1. Le fichier principal c'est Louis Groleau 2015-01-21.xlsm. La macro est dans ce fichier. Ce fichier contient onglet code et chèque.
2. Dans la macro j'ai mis à la bonne place ce que vous m'avez envoyé
juste après la ligne Range("H2") = ChèqueSub DonnéesCheque()

Voir le bout de macro
'Inscription du nom de l'usager dans le fichier Louis Groleau sur onglet chèque en C295
[chèque!C295] = Application.UserName

' Message box pour entrer le Nom, no employé la période et le type de chèque
Dim Nom As String
Dim NoEmployé As String
Dim Période As String
Dim Chèque As String
Nom = InputBox("Inscrire Prénom et Nom Employé", "Saisie du Nom")
Range("B2") = Nom
NoEmployé = InputBox("Inscrire No Employé", "Saisie du NoEmployé")

Range("F2") = NoEmployé

Période = InputBox("Inscrire No Période 2015-?? ", "Saisie du Période")

Range("G2") = Période

Chèque = InputBox("Choisir 1 avec dépôt ou 2 sans dépôt", "Saisie du Chèque")

Range("H2") = Chèque

'Pour vérifier que personne n'est dans le fichier Liste ch émis

Dim xlapp, oWk
Set xlapp = CreateObject("Excel.Application")
nomcla = "Liste des numéros ch émis année fiscale 2015.xlsm"
Rept = "U:\Cheque Émis\Original\Nicole\Macro\" ' votre répertoire
Set oWk = xlapp.Workbooks.Open(Rept & nomcla, , , , , , True, , , , True)
If oWk.ReadOnly Then
MsgBox "Le classeur est ouvert en lecture seule"
Set oWk = Nothing
Set xlapp = Nothing
Workbooks(nomcla).Close SaveChanges:=False
Exit Sub
End If


' On ouvre le fichier Liste no ch émis afin trouver la prochaine ligne vide
' et d'inscrire le nos chèque dans le fichier louis groleau et d'inscrire nos
' données dans le fichier Liste des no ch émis ... dans les bonnes cellules ceci avec
' des formules. Puis on sauve et ferme le fichier liste des numéros ch émis


Workbooks.Open "U:\Cheque Émis\Original\Nicole\Macro\Liste des numéros ch émis année fiscale 2015.xlsm"


Je vous explique ce que fait la macro :
La macro est dans le fichier #0000 Louis Groleau ...
Nous sommes dans l'onglet code
Il y a un bouton pour rouler la macro dans cette onglet
En cliquant sur le bouton macro, un Input Box apparaît
Pour remplir les champs dans le fichier #0000 Louis Groleau onglet code range B2 pour le nom
F2 pour no employé G2 no de période

Lorsque ses cases sont complété, la macro ouvre le fichier
U:\Cheque Émis\Original\Nicole\Macro\Liste des numéros ch émis année fiscale 2015.xlsm

Et s'est ce fichier qui ne doit pas être ouvert par un autre utilisateur lorsque je roule la macro
sinon nous avons le message qui indique que le fichier est en utilisation
C'est ici que j'aimerais ajouter un code dans la macro qui m'aviserais que le fichier est en utilisation de réessayer plus tard et de mettre fin à la macro
afin de ne pas entrer dans le débug,

Après l'ouverture du fichier Liste des numéros ... , dans la macro il y a des formules pour amener les données qui ont été inscrite
dans les cases du fichier #0000 Louis Groleau ... à la prochaine ligne disponible dans le fichier de Liste de numéro chèque...

Lorsque toutes les données ont été transcrite dans le fichier Liste de numéro chèque ..., on ferme et enregistre le fichier
Liste de numéro chèque ...

Windows("#0000 Louis Groleau 2015-01-21.xlsm").Activate
Ici on n'est dans le fichier #0000 Louis Groleau ... on s'électionne la feuille Chèque
Dans la feuille chèque au range B300 se retrouve le Chemin :
Et en B301 s'est une formule qui donne le no employé, le nom et le no de période
Donc la macro se trouve à sauvegarder le fichier #000 Louis Groleau... sous les données en B301
Il y a aussi une condition que si le fichier nommé en B301 existe déjà d'aviser et que on répond Non pour écraser
alors sortie de la macro ( pour ne pas entrer dans le débug )

Ensuite je sélectionne la feuille code je supprime le bouton de la macro et je selectionne la cellule D4

J'espère qu'avec ses explications, vous pourrez plus comprendre le travail de la macro.
Merci beaucoup
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Merci c'est plus clair comme cela.
Pour une bonne compréhension :
On parle de classeur et de feuille qui sont les termes utiliser pour Excel et non pas de fichier et d'onglet.
Pour la suite : le code que j'ai proposé ne convient pas car vous travailles certainement avec un classeur non partagé. Il faut utiliser une autre procédure, patience.
.


Salutations.
Le Pingou
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Voici ma nouvelle proposition : la procédure qui suit à copier et coller dans le module qui contient déjà votre code.
Function Cla_Ouvert(ByRef clateste As String) As Boolean
Dim Fichier As Long
On Error GoTo Erreur
Fichier = FreeFile
Open clateste For Input Lock Read As #Fichier
    Close #Fichier
    Cla_Ouvert = False
    Exit Function
Erreur:
    Cla_Ouvert = True
End Function

Ensuite dans votre macro vous remplacer l'ancienne proposition par celle-ci :
nomcla = "Liste des numéros ch émis année fiscale 2015.xlsm"
repert = "C:\Users\PJP\Desktop\" ' mettre votre répertoire
If Cla_Ouvert(repert & nomcla) Then
   MsgBox "En court d'utilisation"
   Exit Sub
Else
   MsgBox "classeur est disponible"
   Workbooks.Open repert & nomcla
End If

Pour terminer vous supprimer cette ligne :
Workbooks.Open "U:\Cheque Émis\Original\Nicole\Macro\Liste des numéros ch émis année fiscale 2015.xlsm"

Bonsoir et Merci pour les codes. Par contre je ne sais pas ou placer la procédure Function. J'ai essayé a plusieurs place dans ma macro, mais ne trouve pas. Je n'ai jamais utilisé auparavant. Si vous voulez me guider, j'apprécierais. Je n'ai pas de formation j'ai appris en regardant sur le web et je regarde dans les livres pour trouver mes infos et comprendre. Je crois que j'ai fais des grands pas, mais j'ai encore beaucoup à apprendre.
Merci beaucoup pour votre aide
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Bonjour,
Content pour vous.
Cependant ma remarque se basait sur le code que vous avez mis à disposition qui visiblement n'est pas identique à celui que vous utilisez. Le code est boiteux mais il fonctionne donc c'est le principal.