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

Résolu
Nilec Messages postés 1 Statut Membre -  
Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   -
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. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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. nilec
       
      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. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,
    test fichier ouvert:
    https://support.microsoft.com/en-us/help/291295/
    0
    1. Nilec
       
      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.
      0
  3. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    Bonjour,
    Merci, pas de doublon, relire encore une fois mon message qui se trouve ici.

    0
    1. Nilec
       
      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
  4. Le Pingou
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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. nilec
       
      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
  7. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    Bonjour,
    Merci pour les informations.
    Pouvez-vous me renvoyer la macro originale ?

    0
    1. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
       
      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. Nilec
       
      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
  8. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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. Nilec
       
      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
  9. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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. nilec
       
      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
  10. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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
  11. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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. nilec
       
      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
  12. Le Pingou Messages postés 12276 Date d'inscription   Statut Contributeur Dernière intervention   1 478
     
    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