Dlls & Apis & Librairies

Excel fait appel aux Dlls du système Windows, il n'y a pas de DLL Excel à proprement dit.
Vous pourrez trouvez des renseignements à ce sujet dans les fichiers d'aide Excel & VBA pour programmeurs VB & VBA.

Regardez ci-contre des infos sur l'API & Excel
: news
Pour la liste des fonctions et de leur emploi, il faut trouver le SDK Win32 (ou Excel 97 SDK ?).
Le SFK Win32 est un ensemble de fichiers d'aides fourni en principe avec tous les compilateurs (C++, Delphi...) pour Windows (attention fichier très volumineux).
Il vaut mieux -bien que ce ne soit pas absolument obligatoire- avoir quelques notions de langage C, les déclarations de fonctions, les types des arguments et les exemples de code étant présentés dans ce langage.

Le fichier d'aide des fonctions API de Win9x : ftp://ftp.borland.com/pub/delphi/techpubs/delphi2/win32.zip (~7Mo en zip/ 26 Mo ensuite).
Il existe également un fichier contenant les déclarations d'une grande partie des fonctions API "traduites" du C vers VB. Ce fichier s'appelle Win32api.txt et est livré avec VB.


Page web décrivant l'utilisation des fonctions API avec VB (et donc VBA)
http://technet.microsoft.com/cdonline/default-f.asp?target=http://technet.microsoft.com/cdonline/Content/Complete/Desk/VBA/TechNote/off506ef.htm
Voir la page Manipulating the Windows API du site : "The Programming Tips Archive"
Voir la page Programming Excel DLL's du même site
Ou encore http://msdn.microsoft.com/library/psdk/buildapp/win32api_7f8p.htm


Explication de la déclaration de variables BYREF : news, voir aussi la partie sur les variables ici xl_vba_1.htm
Utiliser les fonctions d'une dll : news
Comment se référer à une dll, où la stocker : news


Activer le screensaver : news
Changer le texte dans la barre des tâches : SHAppBarMessage-function


Vidéo capture : voir ici comme point dé départ : http://i.am/shrinkwrapvb/
Lire le port série (type rs232) : http://www.deja.com/getdoc.xp?AN=549183322&fmt=text et http://www.deja.com/getdoc.xp?AN=544135269&fmt=text


Comment passer à une fonction DLL l'adresse d'une procédure ?

(le vendredi 12 mai 2000 microsoft.public.fr.excel par L. L.)
Ex: retval=EnumWindows(AddressOf EnumWindowsProc, 0)
Evidemment le "AddressOf " du VB ne fonctionne pas sous Excel, par quoi faut-il le remplacer?
voir ici : http://www.trigeminal.com/lang/1036/codes.asp?ItemID=19#19


Interpréter un code de retour d'un programme externe à Excel : news
Créer des variables d'environnement : news
Plus d'infos sur : http://www.mvps.org/vb
400 exemples à télécharger sur : http://www.allapi.net


Tester le fonctionnement d'un programme

Declare Function FindWindowA Lib "User32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub Test()
Shell "Winmine.exe", vbMaximizedFocus
Do: Loop While FindWindowA(vbNullString, "Démineur")
MsgBox "Démineur fermé"
End Sub


ci-dessous, si la calculatrice est présente, elle est fermée à l'aide de la fonction PostMessage
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long _
, lParam As Any) As Long

Dim hWnd As Long
hWnd = FindWindow(vbNullString, "Calculatrice")
If hWnd Then PostMessage hWnd, &H10, 0&, 0&


Comment puis-je ouvrir un programme externe puis le fermer ? (par Nix)

Mettez ce code dans un Module :

Dim hProcess, nRet, Retour As Long
Const PROCESS_QUERY_INFORMATION = &H400

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Pour lancer le programme :

Retour = shell("LeProg.exe",1)

Pour Fermer le programme :

hProcess = OpenProcess(fdwAccess, False, Retour)
GetExitCodeProcess hProcess, nRet
Call TerminateProcess(hProcess, nRet)
Call CloseHandle(hProcess)


Déconnecter un lecteur réseau

Private Declare Function WNetAddConnectionA Lib "mpr.dll" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
Private Declare Function WNetCancelConnectionA Lib "mpr.dll" (ByVal lpszName As String, ByVal bForce As Long) As Long

Sub Test()
If WNetAddConnectionA("\\Toto\Disque dur", vbNullString, "Z:") = 0 _
Then MsgBox """\\Toto\Disque dur"" connecté au lecteur Z:"
' blablablablabla...
If WNetCancelConnectionA("Z:", True) Then MsgBox "Lecteur Z: déconnecté."
End Sub

Régler Excel sur « Toujours visible

Le code d'exemple suivant vous montre comment régler Microsoft Excel pour qu'il soit « toujours visible ». Vous empêchez ainsi les autres applications de s'afficher au-dessus de Microsoft Excel.

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Global Const HWND_TOPMOST = -1
Global Const HWND_NOTOPMOST = -2

Sub SetOnTop()
Dim WinHnd As Long, SUCCESS As Long
WinHnd = FindWindow("xlmain", Application.Caption)
SUCCESS = SetWindowPos(WinHnd, HWND_TOPMOST, 0, 0, 0, 0, Flags)
'La ligne suivant rebascule Microsoft Excel dans son mode normal
'd'opération après 20 secondes
Application.OnTime Now + TimeValue("00:00:20"), "NotOnTop"
End Sub

Sub NotOnTop()
Dim WinHnd As Long, SUCCESS As Long
WinHnd = FindWindow("xlmain", Application.Caption)
SUCCESS = SetWindowPos(WinHnd, HWND_NOTOPMOST, 0, 0, 0, 0, Flags)
End Sub

 


 

Actions & Infos Systèmes

Un fichier de Microsoft "XL: Macros to Return Windows and System Directories Paths" vous permettrait de connaître l'emplacement des dossiers systèmes Windows. J'ai le fichier

Excel est-il ouvert : existence.htm
Numéro de série de Windows : news

Connaître la Mémoire Vive : news
Taille du disque dur : lien externe
Qu'est-ce que le swap d'après Atif :-) news

Comment peut-ont activer une application à partir d'Excel 5 ou d'Excel 97 : news

Version d'Excel : dim myvers as string : myvers = application.version: msgbox ("Microsoft Excel" & " " & myvers)
Emplacement d'Excel

declare function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As String
Sub Test()
msgbox GetCommandLine
end Sub

Agir sur le système windows : éteindre, redémarrer .....

Private declare function ExitWindowsEx Lib "user32" (ByVal uFlags As long, _
ByVal dwReserved As long) As Boolean
Private Const EWX_POWEROFF = &H8 'Fermer et couper l'alim (si possible)
Private Const EWX_FORCE = &H4 'Ferme brutalement toutes les applis
Private Const EWX_SHUTDOWN = &H1 'Fermer
Private Const EWX_REBOOT = &H2 'Redémarrer
Private Const EWX_LOGOFF = &H0 'Ouvrir une nouvelle sesion

'se servir des déclarations ci-dessus pour les macros ci-dessous
Sub Quitter_Windows()
success = ExitWindowsEx(EXW_SHUTDOWN, 0)
end Sub
'Autre méthode pour : ret=Shell("C:\WINDOWS\runDLL32.EXE user.exe,ExitWindows",0)

function RestartWin() As Boolean
RestartWin = ExitWindowsEx(2, 0)
end function

Sub Système_RelancerTest()
if Not RestartWin then msgbox "Opération annulée"
end Sub

news (par D. L.), fonctionne aussi bien sous NT4/SP5 que Win95/OSR2

 

Modifier le label d'une disquette :

1ère méthode : Shell "label.exe a: Zaza"
2ième méthode (retourne zéro en cas d'erreur)

declare function SetVolumeLabel Lib "kernel32" Alias "SetVolumeLabelA"
(ByVal lpRootPathname As String, ByVal lpVolumename As String) As long

retval=SetVolumeLabel("a:\","zaza") 'utiliser cette instruction suivante pour nommer la disquette
retval=SetVolumeLabel("a:\",vbNullString) 'utiliser l'instruction suivante pour effacer le nom de la disquette


Nom du répertoire système
Voir aussi actionuser.htm

Option Explicit
Declare Function GetSystemDirectory Lib "kernel32" Alias
"GetSystemDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long

Sub Get_System_Directory()
Dim Sys_Dir As String, Res As Long
Res = GetSystemDirectory(Sys_Dir, 0&)
Sys_Dir = String(Res - 1, " ")
Res = GetSystemDirectory(Sys_Dir, Res)
MsgBox Sys_Dir
End Sub


Shell & Lignes de commande


Ouvrir un fichier : shell "dir c:\temp > " & MyFilename
Ouvrir l'exploreur :

dim param as String
param="explorer.exe /n,/e" & CDPath & "\Répertoire\fichier"
retval=Shell(param, 3)


Autre exemple : news
Exécuter une commande dos en cachant la fenêtre : Shell "D:\Mes documents\test.bat", vbHide
Envoyer un mail : Shell ("Start mailto:xlbysteph@free.fr")
Exécuter un fichier Bat : Shell "D:\Mes documents\test.bat", vbHide ' vbhide pour cacher la fenêtre DOS
Lancer la calculatrice : news
Lister le contenu d'une arborescence grâce à Shell, Dir & command.com : news
Utiliser shell & explorer pour afficher le contenu d'un répertoire : news & paramètres d'explorer
Activer l'hyperterminal : news


!!! Attendre que la commande shell est finie son travail : news


La commande "Shell execute"

elle permet d'ouvrir ou imprimer un fichier quelconque
exemple :
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Global Const SW_SHOWNORMAL = 1

Sub LaunchBMP()
ShellExecute 0, "Open", "ShellExecute 0, "Open",
"c:\adobe\reader\acrobat.pdf", "", "C:\", SW_SHOWNORMAL", "", "C:\",
SW_SHOWNORMAL
End Sub

autre exemple : news
Voir aussi l'article de Microsoft "How to Call the ShellExecute Windows API function"


Manipulation de bases de données

Il existe plusieurs techniques pour lire des fichiers issus d'une base de données.

Technique Manuelle

Sous Windows:
Menu Démarrer | Paramétres | Panneau de conf | Icône Source de données ODBC | onglet DNS Utilisateurs
- sélectionne le driver approprié
- clique sur le bouton configurer
- rempli les champs
Ensuite, les données sont disponibles depuis Excel : Menu Données |Données externes | Créer une requête

Si ça peut aider, dans C:\Windows\System\*.hlp se trouvent normalement les fichiers suivants

Aide du pilote ODBC SQL Drvssrvr.hlp
Aide SQL Msjetsql.hlp
Aide ODBC Odbcinst.hlp
Aide des pilotes de base de données ODBC Odbcjet.hlp
Pilotes de base de données Microsoft ODBC --> Nouveautés Odbcjtnw.hlp

OLE Automation

http://support.microsoft.com/support/kb/articles/q167/2/23.asp
Fichier d'aide sur l'automation dans Office 970
Microsoft Office 97 Automation Help File Available on MSL

http://support.microsoft.com/support/kb/articles/q153/7/48.asp
Appeler les fonctions d'Excel à partir d'Access
ACC: How to Call Excel functions from within Microsoft Access

http://support.microsoft.com/support/excel/content/Automation/automation.asp
Using Automation with Microsoft Excel 97

http://support.microsoft.com/support/kb/articles/q129/3/04.asp
ACC: Using Automation to Transfer Data to Microsoft Excel

http://support.microsoft.com/support/office/content/q140151/introd.asp
Office for Windows An Introduction to OLE Automation

NT OLE Module Excel

OLE Automation & Excel on Blazonry.Com (à vérifier)

Delphi 3 & OLE Automation

Microsoft a également écrit un article appelé "Definitions of the OLE 2.0 DLLs" qui expliquent es différentes DLL permettant les liaisons OLE

Exemple de collecte de données via le port série de Christian Herbé. http://www.chez.com/cherbe/rs232.html
For a free serial port control that has been used with scientific instruments and excel, try the following location: ftp://ftp.pti-can.com/public/Software/SID-101/cheapcomm.zip . C'est un contrôle activex inspiré par le contrôle MSCOMM32.OCX.
Both ASCII and Binary serial communications are supported. Sample in Excel VBA and Visual Basic is also available in theSID-101 directory. For Excel programmers needing serial communications, but no access to MSCOMM32.OCX, it works reasonably well.

 

 

DAO & ADO


ADO FAQ : http://www.able-consulting.com/ADO_Faq.htm
Microsoft ADO Newsgroup : news://msnews.microsoft.com/microsoft.public.data.ado
Qu'est ce que DAO a que ADO/ADOx/JRO n'a pas (et risque bien de ne jamais avoir!) http://www.trigeminal.com/usenet/usenet025.asp?1036
L'incontournable MSDN: http://msdn.microsoft.com/library/officedev/odeopg/deovroffice2000visualbasicprogrammersguide.htm
Comme livre sur Access-2000. Les volumes I et II Developer's Handbook Ils sont tous les deux sur mon bureau à portée de main ...: http://www.developershandbook.com/
Utilisation de l'ADO pour importer les données d'Access à Excel : http://www.microsoft.com/ExcelDev/Articles/movs104.htm

 


Exemple DAO 1

Set DB = OpenDatabase("C:\My Documents\Travel.xls", False, False, "Excel 8.0;")

DoEvents

Set rs = DB.OpenRecordset("select * from `Database`")
While Not rs.EOF
MsgBox rs.Fields(0).Value
rs.MoveNext
Wend

rs.Close
DB.Close


Exemple dAO 2

Const clName = 1
Const rwName = 2

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Row = rwName Then
If Target.Column = clName Then UpdateData
End If
End Sub

Private Sub UpdateData()
Dim db As DAO.database
Dim rs As DAO.Recordset
Dim sql As String
Set db = OpenDatabase("c:\MyTemp\db1.mdb")
sql = "select * from Table1 where Name = '" & Cells(rwName, clName) &
"'"
Set rs = db.OpenRecordset(sql, dbOpenForwardOnly)
Cells(rwName + 1, clName).CopyFromRecordset rs
End Sub


Ouvrir Word pour coller des données d'Excel

Sub StartWord()
MyAppID = Shell("C:\MSOFFICE\WINWORD\WINWORD.EXE", 1)
chan = DDEInitiate("winword", "document1")
Set Datarange = worksheets("SouceWorksheet").range("Yourrange")
Datarange.Copy
AppActivate MyAppID
DDEExecute chan, "[EditPasteSpecial .link = 0, .DisplayIcon = 0, .Class =
""Excel.Sheet.5"", .Datatype = ""RTF"", .Caption = ""Microsoft Excel 5.0
Worksheet""]"
DDEExecute chan, "[FilePrint]"
DDETerminate chan
end Sub