jurassic pork
XLDnaute Occasionnel
Hello,
j'ai créer des dll (1 en 32 bits et 1 en 64 bits) pour appeler des fonctions écrites en dotnet à partir du VBA. Les fonctions sont à l'intérieur des dll mais les dll ne sont pas des assemblages mais l'équivalent des dll API windows (unmanagedExports). Ces fonctions permettent entre autres de lancer des commandes PowerShell et de récupérer le résultat, de trier des tableaux, de mélanger les éléments de tableaux, de faire des temporisations en millisecondes, de manipuler le presse papier (pas seulement le texte mais aussi les images), de faire des splits multi séparateurs et des replace spéciaux ( par regex). Les dlls sont très petites ( < 40k ) . Elles sont faciles à mettre en oeuvre puisqu'il suffit de faire une déclaration dans un module VBA comme ceci :
En pièce jointe il y a les dlls (dans le zip) et un classeur de démonstration. Voici par exemple ce que l'on peut faire dans le classeur :
Voici un exemple de code de comment appeler une fonction et récupérer le résultat :
Normalement au point de vue performance et temps d'exécution cela est rapide car on ne passe pas par la couche COM et le powershell est appelé par son assemblage dotnet pas par une commande console.
A vous de tester ce qui est proposé dans le classeur de démo et de me dire si cela fonctionne et avec quelle configuration (O.S et version d'Excel). Si cela ne fonctionne pas me le dire aussi avec les messages d'erreurs. Les fonctions dans les dll utilisent le framework dotnet de type 4.x qui normalement est installé (ou pré installé) sur tous les windows récents.
J'ai des doutes sur le fonctionnement des dll sur des O.S antérieurs à windows 8 et des Excel antérieurs à 2010. Moi j'ai testé en Windows 11 Excel 2019 32 bits et Excel 2021 64 bits. Merci d'avance pour les personnes qui vont faire les tests. Si cela s'avère positif, ces petites dlls pourront servir en complément. Je pourrais peut-être aussi les enrichir avec des fonctions qui manquent cruellement à VBA.
Les dlls ont une licence de type MIT.
Ami calmant, J.P
j'ai créer des dll (1 en 32 bits et 1 en 64 bits) pour appeler des fonctions écrites en dotnet à partir du VBA. Les fonctions sont à l'intérieur des dll mais les dll ne sont pas des assemblages mais l'équivalent des dll API windows (unmanagedExports). Ces fonctions permettent entre autres de lancer des commandes PowerShell et de récupérer le résultat, de trier des tableaux, de mélanger les éléments de tableaux, de faire des temporisations en millisecondes, de manipuler le presse papier (pas seulement le texte mais aussi les images), de faire des splits multi séparateurs et des replace spéciaux ( par regex). Les dlls sont très petites ( < 40k ) . Elles sont faciles à mettre en oeuvre puisqu'il suffit de faire une déclaration dans un module VBA comme ceci :
VB:
#If Win64 Then
Declare PtrSafe Function CreatePressePapierClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx64.dll" () As Object
Declare PtrSafe Function CreatePowerShellClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx64.dll" () As Object
Declare PtrSafe Function CreateUtilsClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx64.dll" () As Object
#Else
Declare PtrSafe Function CreatePressePapierClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx86.dll" () As Object
Declare PtrSafe Function CreatePowerShellClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx86.dll" () As Object
Declare PtrSafe Function CreateUtilsClass Lib "D:\Tmp\ClassesCSharpJP\ClassesCSharpJPx86.dll" () As Object
#End If
Voici un exemple de code de comment appeler une fonction et récupérer le résultat :
VB:
Sub TestPowerShell()
Dim Resultat
Dim Pwsh As Object
Set Pwsh = CreatePowerShellClass()
' On récupère la date du dernier boot de l ordinateur par une commande powershell wmi
Resultat = Pwsh.ExecuteCmd("Get-WmiObject win32_operatingsystem | " & _
"select @{LABEL=’LastBootUpTime’;EXPRESSION=" & _
"{$_.ConverttoDateTime($_.lastbootuptime)}} | Out-String")
Debug.Print Resultat
Worksheets("PowerShell").Range("A2") = Resultat
End Sub
A vous de tester ce qui est proposé dans le classeur de démo et de me dire si cela fonctionne et avec quelle configuration (O.S et version d'Excel). Si cela ne fonctionne pas me le dire aussi avec les messages d'erreurs. Les fonctions dans les dll utilisent le framework dotnet de type 4.x qui normalement est installé (ou pré installé) sur tous les windows récents.
J'ai des doutes sur le fonctionnement des dll sur des O.S antérieurs à windows 8 et des Excel antérieurs à 2010. Moi j'ai testé en Windows 11 Excel 2019 32 bits et Excel 2021 64 bits. Merci d'avance pour les personnes qui vont faire les tests. Si cela s'avère positif, ces petites dlls pourront servir en complément. Je pourrais peut-être aussi les enrichir avec des fonctions qui manquent cruellement à VBA.
Les dlls ont une licence de type MIT.
Ami calmant, J.P