Macro Excel si fichier ouvert message et arrêt de la macro

Résolu
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

  1. 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
    1. 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,
      0
  2. Bonjour,
    Merci, pas de doublon, relire encore une fois mon message qui se trouve ici.

    0
    1. 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.
      0
  3. 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
    0
    1. 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
      0
      1. 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.
        0
    2. Bonjour,
      Merci pour les informations.
      Pouvez-vous me renvoyer la macro originale ?

      0
      1. 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
        0
      2. 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
        0
    3. 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
      0
      1. 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
        0
    4. 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

      0
      1. 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
        0
    5. 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
      0
      1. 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"
        

        0
        1. 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
          0
      2. 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.
        0