Bonjour,
cela fait plusieurs jours que je bute sur ce problème et mes connaissances Excel ne sont pas suffisantes pour le résoudre.
Lorsque j'exécute une macro depuis une invite de commande sous windows 11 j'obtiens une erreur 1004. Si j'exécute la même macro manuellement, tout se passe bien.
Que me manque-t-il pour que cela fonctionne correctement dans les deux cas ?
Pour les besoins de cette question, j'ai simplifié au maximum. Le classeur Excel contient une feuille avec 10 lignes. La macro se contente d'afficher le nombre de lignes. Dans la réalité, j'ai plusieurs feuilles et la macro réalise une mise à jour de ces feuilles.
J'utilise l'invite de commande pour automatiser ces mises à jour en lançant une procédure batch programmée.
L'erreur 1004 a lieu sur la ligne en gras
Erreur d'exécution, '1004': la méthode 'Sheets' de l'objet '_Global' a échoué
Code macro Nblig dans Module1
Code de Workbook_open dans ThisWorkbook
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Sub Nblig() Dim num Sheets("Feuil1").Select num = ActiveSheet.UsedRange.Rows.Count MsgBox "Nombre de lignes " & num Application.Quit End Sub
Ligne d'appel dans l'invite de commande Windows
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 Private Declare PtrSafe Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As LongPtr Private Declare PtrSafe Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As LongPtr) As Long Private Declare PtrSafe Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As LongPtr) As Long Private Function GetCmd() As String Dim lpCmd As LongPtr lpCmd = GetCommandLine() GetCmd = Space$(lstrlen(ByVal lpCmd)) lstrcpy ByVal GetCmd, ByVal lpCmd End Function Private Sub Workbook_Open() Dim macmdline As Variant Dim monparam As Variant 'déclare une variable Dim macmd As Variant 'déclare une variable macmdline = GetCmd 'affecte la valeur de la ligne de commande If Not IsNull(macmdline) Then 'si la variable est nulle If Len(macmdline) > 0 Then 'on s'assure qu'il y a eu une ligne de commande passée If InStr(macmdline, "/cmd") > 0 Then macmdline = Replace(macmdline, ThisWorkbook.FullName, "", , , vbTextCompare) monparam = Split(macmdline, "/cmd") MsgBox monparam(1) macmd = Split(monparam(1), " ") 'MsgBox "0=>" & macmd(0) & "<=" Application.Run Mid(macmd(0), 2) End If End If End If End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 call "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" /cmd/Nblig "test.xlsm"
Partager