Passer des paramètres dans une macro via une ligne de commande DOS

noisetheater

XLDnaute Nouveau
Bonjour à tous,

Tout d'abord je travaille sur XP Pro avec Excel Xp

Ma demande porte sur des précisions sur un site que j'ai trouvé sur le net qui permet de faire passer des parmètres dans une macro via une ligne de commande, voici le texte :

Les options de démarrage d'Excel ne permettent pas de transmettre des paramètres personnalisés au logiciel (cf. Options de démarrage d'Excel) . La technique suivante, non documentée, permet de réaliser cette opération.

Le truc consiste à lancer Excel avec une option valide, par exemple /e (empêchant le chargement d'un classeur vide au démarrage) et à greffer immédiatement après cette option les paramètres personnels. En effet, les caractères qui suivent les options de démarrage, jusqu'au premier espace rencontré, sont ignorés par Excel. Ils ne génèrent donc pas d'erreur et sont exploitables par macro, via la fonction API GetCommandLine.

Les paramètres doivent être placés entre Excel.exe et le nom du fichier.

Par exemple, si l'on veut démarrer Excel en ouvrant le classeur "C:\Temp\Test.xls" en lui transmettant les paramètres "alain", "pierre" et "paul", la ligne de commande devrait être de ce type :

Excel.exe /e/alain/pierre/paul "C:\Temp\Test.xls"

Les paramètres doivent suivre immédiatement /e et ne doivent comprendre aucun espace.
Leur récupération peut s'opérer immédiatement après le lancement d'Excel par le biais d'une macro Workbook_Open ou Auto_Open placé dans le classeur ouvert. Cette macro doit récupérer le contenu de la ligne de commande par GetCommandLine et utiliser les fonctions de chaîne de caractères pour localiser et séparer les paramètres personnels.

A titre d'exemple, la macro suivante récupère les paramètres dans une variable tableau (CmdArgs) et copie ce tableau dans la première feuille de calcul du classeur.

Private Declare Function GetCommandLine _
Lib "kernel32" Alias "GetCommandLineA" _
() As Long
Private Declare Function lstrlen _
Lib "kernel32" Alias "lstrlenA" _
(lpString As Any) As Long
Private Declare Function lstrcpy _
Lib "kernel32" Alias "lstrcpyA" _
(lpString1 As Any, lpString2 As Any) As Long
Private Function GetCmd() As String 'Tony Proctor microsoft.public.vb.winapi
Dim lpCmd As Long
lpCmd = GetCommandLine()
GetCmd = Space$(lstrlen(ByVal lpCmd))
lstrcpy ByVal GetCmd, ByVal lpCmd
End Function
Private Sub Workbook_Open()

' L. Longre, complété par Alain Cros

Dim CmdLine As String 'Ligne de Commande
Dim CmdArgs() As String 'Tableau des paramétres de Commande
Dim ArgNb As Integer 'Nombre de paramétres
Dim Pos1 As Integer

CmdLine = GetCmd 'Lire la ligne de Commande
Pos1 = InStr(1, CmdLine, ThisWorkbook.FullName, vbTextCompare)
If Pos1 <> 0 Then CmdLine = Mid(CmdLine, 1, Pos1 - 1) Else Exit Sub
If Right(CmdLine, 1) = """" Then Pos1 = 2 Else Pos1 = 1
CmdLine = Mid(CmdLine, 1, Len(CmdLine) - Pos1)
CmdLine = Mid(CmdLine, InStr(1, CmdLine, " /e", _
vbTextCompare) + 4, Len(CmdLine)) & "/"
'CmdLine ne contient plus que les paramétres

Do Until Len(CmdLine) < 2
Pos1 = InStr(1, CmdLine, "/")
ArgNb = ArgNb + 1
ReDim Preserve CmdArgs(1 To ArgNb)
CmdArgs(ArgNb) = Mid(CmdLine, 1, Pos1 - 1)
CmdLine = Mid(CmdLine, Pos1 + 1, Len(CmdLine))
Loop

For Pos1 = 1 To ArgNb
CmdLine = CmdLine & "Argument " & Pos1 & " : " & CmdArgs(Pos1) & vbCrLf
Next Pos1

MsgBox CmdLine

End Sub

Ma connaissance en matière de prog VB étant limité je ne sais pas comment faire pour que la macro "comparatif" contenue dans mon classeur doit être paramètrée pour récupérer ces paramètres.
Dans mon cas particulier je voudrais faire en sorte que les fichiers (Excel) que j'ouvre dans ma macro soit définis par la ligne de commande.Je pense que c'est contenu dans le code que j'ai joint mais j'aurais besoin d'aide pour y voir plus clair, merci d'avance pour votre aide.
 

Discussions similaires

Statistiques des forums

Discussions
313 243
Messages
2 096 509
Membres
106 644
dernier inscrit
7frd5