Lancer une macro dans une macro
Bonjour,
Je suis en train de crée une macro pour automatiser un peut plus mon travail. J'arrive a faire faire à ma macro presque tout, sauf le fait de lancer une autre macro dans les tâches que je lui demande.
La macro complète (je suis plutôt fière de ce que j'ai réussi à faire, pour un débutant) :
Sub Test_copie()
Sheets("PDJ inclus").Select
Dim ligne
ligne = Evaluate("max(if(J:J<>"""",row(J:J),0))")
Range("A10:L10").Resize(ligne - 9).Select
Selection.Copy
Sheets("Impression Liste PDJ").Select
Workbooks.Open Filename:="\\NTSERVER1\office\Pointage PDJ Amelys\Pointage PDJ Vide COPIER avant d'utiliser.xlsm"
ActiveSheet.Range("A10").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Pointage").Select
Call Trier
Dim laDate As Date, lAnnee As String, leMois As String, leNom As String
laDate = Date
leMois = Format((laDate), "MM")
lejour = Format((laDate), "dd")
leNom = "Pointage PDJ " & lejour & "-" & leMois
MsgBox leNom
Dim vdir As String
vdir = "\\NTSERVER1\office\Pointage PDJ Amelys\"
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=vdir + leNom
ActiveWorkbook.Close True
Application.DisplayAlerts = False
End SubLa partie qui coince est la fonction "call" au milieu de la macro. La macro que je veux lancé s'appelle "Trier" et est enregistré sur le document que je fait ouvrir et enregistré.
Sinon, je devrais recopier la macro "Trier" dans celle-ci, ce qui alourdira la macro de beaucoup. Le but est aussi que j'apprenne une nouvelle façon de faire.
Merci d'avance pour votre aide.
bonjour Ti_ti
https://exceloffthegrid.com/how-to-run-a-macro-from-another-workbook/
je suppose
Run "'Pointage PDJ Vide COPIER avant d'utiliser.xlsm'!Trier"
Malheureusement, rien ne marche. J'ai aussi essayé Application.Run comme le dit le guide que t'as mis en lien, mais toujours le même message d'erreur "erreur d'exécution '1004'.
J'ai essayé de modifier les paramètre du sécurité pour les macro, pensant que la macro est bloqué (normalement j'ai le petit message où je doit cliquer pour les activer). Mais même en mettant tout autoriser ça ne change rien, toujours le même message d'erreur disant qu'il n'arrive pas à lancer la macro.
Je ne comprend pas du tout pourquoi
re,
et si vous essayez à lancer la macro en manuel après ce message, cela fonctionne ? Ce n'est pas que vous vous trouvez dans une mauvaise feuille ou fichier ou ...
Donc avec ALT+F8 vous sélectionnez la macro sans la lancer et puis avec F8 vous la exécutez pas à pas. Cela blocque dès le début ?
Le blocage ce fait sur la ligne de lancement de la macro spécifiquement. Si je supprime cette ligne et lance la macro, tout fonctionne
je ne sais pas, cela a quelque chose à faire avec le reseau ?
macro dans titi1 & les 2 fichiers sont tous les 2 sur mon disque dur. Si cela fonctionne chez vous, alors il faut une fois déplacer titi2 vers ce reseau (peut-être protégé ou ....).
Sub Test_copie()
Dim WB As Workbook
'Sheets("PDJ inclus").Select
'Dim ligne
'ligne = Evaluate("max(if(J:J<>"""",row(J:J),0))")
'Range("A10:L10").Resize(ligne - 9).Select
'Selection.Copy
'Sheets("Impression Liste PDJ").Select
'Set wb = Workbooks.Open(Filename:="\\NTSERVER1\office\Pointage PDJ Amelys\Pointage PDJ Vide COPIER avant d'utiliser.xlsm")
Set WB = Workbooks.Open(Filename:=ThisWorkbook.Path & "\titi2.xlsm") 'l'autre fichier
'4 fois la même macro
Run "'" & WB.Name & "'!trier" 'macro dans l'autre fichier
Run WB.Name & "!trier" 'macro dans l'autre fichier
Run "titi2.xlsm!trier"
Application.Run "titi2.xlsm!trier"
End SubRe,
Malheureusement, rien ne fonctionne.
En effet, les 2 documents sont enregistré sur un serveur. Le "Classeur-209" est enregistré plus profondément dedans et donc avec plus de restrictions d'accès (pour des question de sécurité interne). C'est peut-être ça la cause.
Dans le doute, je joint les documents (j'ai remplacé toutes les informations sensible qu'il peut y avoir). Peut-être que ça aidera à mieux comprendre ce qu'il se passe.
La macro concernée s'appelle "Test_copie".
Bonjour à tous,
Je n'ai pas d'accès serveurs. En revanche, cela fonctionne localement, le code s'exécute et le trie se fait.
Ici "Trier", module4 : contenu dans le fichier "Pointag ...." sur le serveur
Plus bas : "Test_copie", module5 : contenu dans le fichier "classeur-209 ....." local.
Vérifer les noms du chemin réseau et du fichier sur le réseau.
Sub Trier()
Dim ws As Worksheet
Set ws = ActiveWorkbook.Worksheets("Pointage")
Dim sortRanges As Variant
sortRanges = Array("B2:B221", "F2:F221", "J2:J221", "N2:N221", "R2:R221", "V2:V221")
Dim i As Integer
For i = LBound(sortRanges) To UBound(sortRanges)
ws.Sort.SortFields.Clear
ws.Sort.SortFields.Add2 Key:=ws.Range(sortRanges(i)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ws.Sort
.SetRange ws.Range(sortRanges(i))
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next i
ws.Range("A2").Select
End SubSub Test_copie()
On Error GoTo ErrorHandler ' Gestion des erreurs
' Activer la feuille "PDJ inclus"
Sheets("PDJ inclus").Activate
' Définir la variable de ligne et trouver la dernière ligne non vide de la colonne J
Dim ligne As Long
ligne = Evaluate("MAX(IF(J:J<>"""",ROW(J:J),0))")
' Copier la plage de données de A10 à L10 jusqu'à la dernière ligne non vide
Sheets("PDJ inclus").Range("A10:L10").Resize(ligne - 9).Copy
' Activer la feuille "Impression Liste PDJ"
Sheets("Impression Liste PDJ").Activate
' Ouvrir le classeur cible
Dim targetWorkbook As Workbook
' chemin réseau ' nom fichier
Set targetWorkbook = Workbooks.Open(Filename:="\\NTSERVER1\office\Pointage PDJ Amelys\pointage-pdj-vide-copier-avant-d-utiliser.xlsm")
' Coller les valeurs copiées dans la feuille "Copie Liste PDJ"
With targetWorkbook.Worksheets("Copie Liste PDJ").Range("A10")
.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End With
' Test de la présence de la macro
If Not MacroExists(targetWorkbook, "Trier") Then
MsgBox "La macro 'Trier' n'existe pas."
GoTo CleanExit
End If
' Exécuter la macro de tri dans le classeur cible
' nom fichier
Application.Run "'pointage-pdj-vide-copier-avant-d-utiliser.xlsm'!Trier"
' Définir les variables de date pour nommer le fichier
Dim laDate As Date, leMois As String, leJour As String, leNom As String
laDate = Date
leMois = Format(laDate, "MM")
leJour = Format(laDate, "dd")
leNom = "Pointage PDJ " & leJour & "-" & leMois
' Afficher le nom du fichier dans une boîte de dialogue
MsgBox leNom
' Définir le répertoire de sauvegarde
Dim vdir As String
vdir = "\\NTSERVER1\office\Pointage PDJ Amelys\" ' chemin réseau
' Désactiver les alertes de sauvegarde
Application.DisplayAlerts = False
' Sauvegarder le classeur cible sous le nouveau nom
targetWorkbook.SaveAs Filename:=vdir & leNom
' Fermer le classeur cible et réactiver les alertes
targetWorkbook.Close SaveChanges:=True
Application.DisplayAlerts = True
' Sortie propre de la subroutine
Exit Sub
ErrorHandler:
' Gérer les erreurs
MsgBox "Une erreur s'est produite : " & Err.Description
Application.DisplayAlerts = True
CleanExit:
' Réactiver les alertes si elles étaient désactivées
Application.DisplayAlerts = True
End Sub
Function MacroExists(wb As Workbook, macroName As String) As Boolean
Dim vbComp As Object
Dim vbModule As Object
Dim line As String
Dim found As Boolean
found = False
For Each vbComp In wb.VBProject.VBComponents
Set vbModule = vbComp.CodeModule
For i = 1 To vbModule.CountOfLines
line = vbModule.Lines(i, 1)
If InStr(1, line, "Sub " & macroName, vbTextCompare) > 0 Then
found = True
Exit For
End If
Next i
If found Then
Exit For
End If
Next vbComp
MacroExists = found
End FunctionBizz
Bonjour,
Merci pour le macro (je retient comment tu a refait la macro "Trier")
Malheureusement, j'ai un nouveau msg d'erreur la macro "Test_copie" (Si j'ai bien compris, c'est la msg généré par "ErrorHandler")
Ce msg arrive sur la partie de test de la présence de la macro.
Si j'enlève cette partie, j'ai se msg quand elle essaie de lancé la macro "Trier"
Encore une foi, si j'enlève l'exécution de la macro, tout fonctionne correctement.
J'en déduit que c'est un problème lié au fait que les document sont enregistré sur un serveur et au droit d'accès de ces dernier.
Ducoup, j'ai contourné le problème et ai intégré ta version simplifier de "Trier" dans la macro "Test_copie" comme ceci :
Sub Test_copie()
On Error GoTo ErrorHandler ' Gestion des erreurs
' Activer la feuille "PDJ inclus"
Sheets("PDJ inclus").Activate
' Définir la variable de ligne et trouver la dernière ligne non vide de la colonne J
Dim ligne As Long
ligne = Evaluate("MAX(IF(J:J<>"""",ROW(J:J),0))")
' Copier la plage de données de A10 à L10 jusqu'à la dernière ligne non vide
Sheets("PDJ inclus").Range("A10:L10").Resize(ligne - 9).Copy
' Activer la feuille "Impression Liste PDJ"
Sheets("Impression Liste PDJ").Activate
' Ouvrir le classeur cible
Dim targetWorkbook As Workbook
' chemin réseau ' nom fichier
Set targetWorkbook = Workbooks.Open(Filename:="\\NTSERVER1\office\Pointage PDJ Amelys\Pointage PDJ Vide COPIER avant d'utiliser.xlsm")
' Coller les valeurs copiées dans la feuille "Copie Liste PDJ"
With targetWorkbook.Worksheets("Copie Liste PDJ").Range("A10")
.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End With
' insertion du contenu de la macro "Trier" pour remplacer la macro incompatible
Dim ws As Worksheet
Set ws = targetWorkbook.Worksheets("Pointage")
ws.Activate
Dim sortRanges As Variant
sortRanges = Array("B2:B221", "F2:F221", "J2:J221", "N2:N221", "R2:R221", "V2:V221")
Dim i As Integer
For i = LBound(sortRanges) To UBound(sortRanges)
ws.Sort.SortFields.Clear
ws.Sort.SortFields.Add2 Key:=ws.Range(sortRanges(i)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ws.Sort
.SetRange ws.Range(sortRanges(i))
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next i
ws.Range("A2").Select
' Définir les variables de date pour nommer le fichier
Dim laDate As Date, leMois As String, leJour As String, leNom As String
laDate = Date
leMois = Format(laDate, "MM")
leJour = Format(laDate, "dd")
leNom = "Pointage PDJ " & leJour & "-" & leMois
' Afficher le nom du fichier dans une boîte de dialogue
MsgBox leNom
' Définir le répertoire de sauvegarde
Dim vdir As String
vdir = "\\NTSERVER1\office\Pointage PDJ Amelys\" ' chemin réseau
' Désactiver les alertes de sauvegarde
Application.DisplayAlerts = False
' Sauvegarder le classeur cible sous le nouveau nom
targetWorkbook.SaveAs Filename:=vdir & leNom
' Fermer le classeur cible et réactiver les alertes
targetWorkbook.Close SaveChanges:=True
Application.DisplayAlerts = True
' Sortie propre de la subroutine
Exit Sub
ErrorHandler:
' Gérer les erreurs
MsgBox "Une erreur s'est produite : " & Err.Description
Application.DisplayAlerts = True
End Sub
Function MacroExists(wb As Workbook, macroName As String) As Boolean
Dim vbComp As Object
Dim vbModule As Object
Dim line As String
Dim found As Boolean
found = False
For Each vbComp In wb.VBProject.VBComponents
Set vbModule = vbComp.CodeModule
For i = 1 To vbModule.CountOfLines
line = vbModule.Lines(i, 1)
If InStr(1, line, "Sub " & macroName, vbTextCompare) > 0 Then
found = True
Exit For
End If
Next i
If found Then
Exit For
End If
Next vbComp
MacroExists = found
End FunctionPar contre, j'ai une question quand à la partie "Function". C'est la première foi que je lis une tel macro et ne comprend pas ce qu'elle fait. Je ne serait pas contre une petite explication.