FAQ Visual Basic

FAQ Visual Basic Consultez toutes les FAQ
Nombre d'auteurs : 50, nombre de questions : 300, dernière mise à jour : 15 juin 2021
Sommaire→Système→Fichiers- Comment savoir si un fichier existe ?
- Comment compter les fichiers dans un répertoire ?
- Comment savoir si un fichier est ouvert ?
- Comment copier un fichier ?
- Comment copier un fichier actuellement ouvert par une application?
- Comment renommer un fichier ou un répertoire ?
- Comment détruire un fichier ?
- Comment envoyer un fichier à la corbeille ?
- Comment connaître les dates de création, de dernière modification et de dernier accès d'un fichier ?
- Comment obtenir le numéro de version d'un fichier (si disponible) ?
- Comment récupérer la taille d'un fichier ?
- Comment convertir une taille de fichier donnée en octets en une unité adaptée ?
- Comment copier un répertoire ?
- Comment supprimer un répertoire ?
- Comment obtenir le contenu d'un répertoire ?
- Comment scanner un répertoire et tous ses sous-répertoires ?
- Comment obtenir la taille d'un répertoire ?
- Comment ouvrir une fenêtre de sélection de répertoire ?
- Comment modifier la fenêtre de sélection de répertoire ?
- Quelle référence dois-je ajouter à mon projet pour pouvoir utiliser le FileSystemObject ?
- Comment récupérer le répertoire d'un fichier à partir de son chemin complet ?
- Afficher la boîte de dialogue ouvrir afin de récupérer le nom et le chemin du fichier sélectionné
- Comment avec l'API GetOpenFileNameA ouvrir plusieurs fichiers à la fois ?
- Afficher la boîte de dialogue Enregistrer sous afin de récupérer le nom et le chemin du fichier sélectionné
- Comment obtenir le chemin relatif d'un fichier ?
- Comment récupérer le nom d'un fichier à partir d'un chemin complet ?
- Comment récupérer l'extension d'un fichier à partir d'un chemin complet ?
- Comment compresser et décompresser des fichiers ?
- Comment déterminer le type d'un lecteur ?
- Comment savoir si un CD se trouve dans l'un des lecteurs du système (2 codes)?
- Comment récupérer l'espace Total/Libre/Utilisé d'un disque ?
- Comment récupérer la vidéo d'une WebCam ?
- Comment lire/modifier les attributs d'un fichier/répertoire par l'API Windows ?
- Comment jouer des fichiers wav sans lecteurs (WMP ou MID) ?
- Comment récupérer l'icône associé à un fichier ?
- Comment lire ou écrire les propriétés avancées d'un fichier ?
- Comment lire un fichier avec un charset UTF 8 ?
- Comment compter les occurrences d'une chaîne dans un fichier ?
If Dir("c:\temp\Erreurs.tmp", vbHidden) <> "" Then
'le fichier existe (vbHidden permet de le retrouver même s'il est caché)
End IfCi-joint vous trouverez une Fonction à ajouter dans un nouveau module qui vous permettra de compter le nombre de fichiers d'une ou plusieurs extensions voulues dans répertoire donné :
Function nbfich(chemin As String, ParamArray termin() As Variant) As Long
Dim fichier As String
Dim extension As Variant
Dim compteur As Long
For Each extension In termin
fichier = dir(chemin & "\*." & extension)
Do Until fichier = ""
compteur = compteur + 1
fichier = dir
Loop
Next extension
nbfich = compteur
End FunctionVoici comment appeler cette Fonction :
nbfich("c:\mesimages","gif","bmp","pcx")Vous pouvez mettre une ou plusieurs extensions séparées par des virgules.
Au moyen d'une fonction qui tente d'ouvrir un fichier en écriture, en cas d'erreur retournée, cela indique que le fichier est déjà ouvert, dans le cas contraire, on considère qu'il est fermé.
Function IsFileOpen(ByVal strFic As String) As Boolean
Dim fic As Integer
On Error Resume Next
fic = FreeFile()
Open strFic For Input Access Read Lock Read Write As fic
If Err.Number = 0 Then
IsFileOpen = False
Close fic
Else
IsFileOpen = True
End If
End Function'Copie le fichier "c:\temp\Erreurs.tmp" en "c:\temp\Erreurs.bak"
FileCopy "c:\temp\Erreurs.tmp", "c:\temp\Erreurs.bak"La méthode habituellement utilisée pour copier un fichier, FileCopy, échoue si le fichier en cours est actuellement ouvert (violation de partage). Pour contourner ce problème, il faut faire appel à une API du kernel nommée CopyFile. Dans l'exemple ci-dessous, cette méthode est utilisée pour sauvegarder une base Access alors même que celle-ci est ouverte.
Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" _
(ByVal lpExistingFileName As String, ByVal lpNewFileName As String, _
ByVal bFailIfExists As Long) As Long
'bFailIfExists doit etre à false pour permettre 'l'overwriting
Private Sub Form_Load()
Dim Nouvfich As String
CommonDialog1.Filter = "Base de données (*.mdb)|*.mdb"
On Error GoTo erreur
CommonDialog1.ShowSave
Nouvfich = CommonDialog1.FileName
CopyFile App.Path & "\tests.mdb", Nouvfich, False
erreur:
If Err = 32755 Then
Exit Sub
End If
End Sub'Renomme "c:\temp\Erreurs.tmp" en "c:\temp\Erreurs.bak"
Name "c:\temp\Erreurs.tmp" As "c:\temp\Erreurs.bak"
'Renomme le répertoire "c:\temp" en "c:\var"
Name "c:\temp" As "c:\var"Kill "c:\Erreurs.tmp"Le fichier doit exister sinon une erreur d'exécution a lieu.
En utilisant les API Windows. Copiez ce code source dans un module standard :
Private Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Long
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As String
End Type
Private Const FO_DELETE As Long = &H3
Private Const FOF_ALLOWUNDO As Long = &H40
Private Declare Function SHFileOperation Lib "Shell32.dll" Alias "SHFileOperationA" _
(lpFileOp As SHFILEOPSTRUCT) As Long
Public Function DansCorbeille(fichier As String, handle As Long) As Boolean
Dim DelFileOp As SHFILEOPSTRUCT
Dim Result As Long
With DelFileOp
.hwnd = handle
.wFunc = FO_DELETE
.pFrom = fichier & vbNullChar & vbNullChar
.fFlags = FOF_ALLOWUNDO
End With
Result = SHFileOperation(DelFileOp)
DansCorbeille = (Result = 0) And (DelFileOp.fAnyOperationsAborted = 0)
End FunctionLa fonction DansCorbeille renvoie True si l'envoi du fichier dans la corbeille a été effectué. Ses paramètres sont le chemin complet du fichier et le handle de la fenêtre utilisé pour afficher les éventuelles boîtes de dialogue d'avertissement ou de demande de confirmation. Ce deuxième paramètre peut être une valeur nulle. Voici un exemple d'utilisation de cette fonction :
If DansCorbeille("C:\lettre.doc", Me.hwnd) Then
MsgBox "Le fichier a été déplacé dans la corbeille"
Else
MsgBox "Le fichier n'a pas pu être déplacé dans la corbeille"
End IfEn passant soit par les API, soit par le FileSystemObject. En natif, VB ne donne accès qu'à la date de dernière modification, via la fonction FileDateTime(). Si vous choisissez de passer par les API, voici les déclarations nécessaires :
Private Const MAX_PATH = 260
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Private Const INVALID_HANDLE_VALUE = -1
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" _
(ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" _
(lpFileTime As FILETIME, _
lpSystemTime As SYSTEMTIME) As Long
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" _
(lpFileTime As FILETIME, _
lpLocalFileTime As FILETIME) As LongLes dates d'un fichier sont récupérées par la fonction FindFirstFile qui attend en paramètres le nom du fichier et une structure WIN32_FIND_DATA qui reçoit les informations obtenues. Les dates de création, de dernière modification et de dernier accès sont stockées respectivement dans les champs ftCreationTime, ftLastWriteTime et ftLastAccessTime, tous de type FILETIME. Pour avoir des dates sous une forme exploitable, quelques conversions sont nécessaires. Notre fonction FileTimeToDate() convertit une date de type FILETIME en type Date.
Private Function FileTimeToDate(ft As FILETIME) As Date
Dim datelocale As FILETIME, datesys As SYSTEMTIME
If FileTimeToLocalFileTime(ft, datelocale) = 0 Then Exit Function
If FileTimeToSystemTime(datelocale, datesys) = 0 Then Exit Function
FileTimeToDate = CDate(datesys.wDay & " " & datesys.wMonth & " " & datesys.wYear & " " & _
datesys.wHour & ":" & datesys.wMinute & ":" & datesys.wSecond)
End FunctionLa partie principale du code est assez simple :
Dim findData As WIN32_FIND_DATA, hFind As Long
hFind = FindFirstFile("c:\autoexec.bat", findData)
If hFind = INVALID_HANDLE_VALUE Then Exit Sub
FindClose hFind
MsgBox "Crée le : " & FileTimeToDate(findData.ftCreationTime)
MsgBox "Modifié le : " & FileTimeToDate(findData.ftLastWriteTime)
MsgBox "Accédé le : " & FileTimeToDate(findData.ftLastAccessTime)Pour terminer, voici la version avec le FileSystemObject :
Dim fso As FileSystemObject, f As File
Set fso = New FileSystemObject
On Error GoTo fin
Set f = fso.GetFile("c:\autoexec.bat")
MsgBox "Crée le : " & f.DateCreated
MsgBox "Modifié le : " & f.DateLastModified
MsgBox "Accédé le : " & f.DateLastAccessed
Set f = Nothing
fin:
Set fso = NothingLien : Quelle référence dois-je ajouter à mon projet pour pouvoir utiliser le FileSystemObject ?
Cette fonction reçoit le chemin complet d'un fichier en paramètre et renvoie le numéro de version du fichier, s'il existe, sinon renvoie une chaîne vide :
(concerne essentiellement les fichiers .dll, .ocx, .exe et autres fichiers du système)
Collez ce code dans un module standard :
'-- Déclarations de structure et des fonctions de l'API Windows
Private Type VS_FIXEDFILEINFO
dwSignature As Long
dwStrucVersionl As Integer ' e.g. = &h0000 = 0
dwStrucVersionh As Integer ' e.g. = &h0042 = .42
dwFileVersionMSl As Integer ' e.g. = &h0003 = 3
dwFileVersionMSh As Integer ' e.g. = &h0075 = .75
dwFileVersionLSl As Integer ' e.g. = &h0000 = 0
dwFileVersionLSh As Integer ' e.g. = &h0031 = .31
dwProductVersionMSl As Integer ' e.g. = &h0003 = 3
dwProductVersionMSh As Integer ' e.g. = &h0010 = .1
dwProductVersionLSl As Integer ' e.g. = &h0000 = 0
dwProductVersionLSh As Integer ' e.g. = &h0031 = .31
dwFileFlagsMask As Long ' = &h3F for version "0.42"
dwFileFlags As Long ' e.g. VFF_DEBUG Or VFF_PRERELEASE
dwFileOS As Long ' e.g. VOS_DOS_WINDOWS16
dwFileType As Long ' e.g. VFT_DRIVER
dwFileSubtype As Long ' e.g. VFT2_DRV_KEYBOARD
dwFileDateMS As Long ' e.g. 0
dwFileDateLS As Long ' e.g. 0
End Type
Private Declare Function GetFileVersionInfo Lib "Version.dll" Alias "GetFileVersionInfoA" _
(ByVal lptstrFilename As String, ByVal dwhandle As Long, ByVal dwlen As Long, lpData As Any) As Long
Private Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias "GetFileVersionInfoSizeA" _
(ByVal lptstrFilename As String, lpdwHandle As Long) As Long
'-- Renvoie le numero de version d'un fichier au format String : x.xx.xxxx.xxxx
Public Function GetFileVerInfo(sFullPath As String) As String
Dim rc As Long, lDummy As Long, sBuffer() As Byte
Dim lBufferLen As Long, lVerPointer As Long, udtVerBuffer As VS_FIXEDFILEINFO
Dim lVerbufferLen As Long
'*** Obtient la taille du buffer ****
lBufferLen = GetFileVersionInfoSize(sFullPath, lDummy)
If lBufferLen < 1 Then
GetFileVerInfo = "" ' No Version Info available!
Exit Function
End If
'**** Stocke les informations dans la structure udtVerBuffer ****
ReDim sBuffer(lBufferLen)
rc = GetFileVersionInfo(sFullPath, 0&, lBufferLen, sBuffer(0))
rc = VerQueryValue(sBuffer(0), "\", lVerPointer, lVerbufferLen)
MoveMemory udtVerBuffer, lVerPointer, Len(udtVerBuffer)
'**** Renvoie les information de numéro de version ****
GetFileVerInfo = Format$(udtVerBuffer.dwFileVersionMSh) & "." & _
Format$(udtVerBuffer.dwFileVersionMSl) & "." & _
Format$(udtVerBuffer.dwFileVersionLSh) & "." & _
Format$(udtVerBuffer.dwFileVersionLSl)
End FunctionExemple :
Msgbox GetFileVerInfo("C:\windows\Explorer.exe")Debug.Print FileLen("nomdufichier") 'Affiche en octets la taille du fichierLien : Comment convertir une taille de fichier donnée en octets en une unité adaptée ?
La commande FileLen vue ci-dessus, retourne la taille du fichier en octets, mais un fichier de 5368709120 octets ne nous dit rien.
On sait que :
1Ko = 1024o
1Mo = 1024Ko
1Go = 1024Mo
etc...
Pour convertir en une unité compréhensible, nous allons diviser la taille par 1024, si celle-ci est supérieure à 1024.
Si le nombre obtenu est toujours supérieur à 1024, on redivise par 1024, et ainsi de suite...
La fonction suivante permet cette conversion jusqu'aux Yo (yotta-octet = 2^80 octects).
Function Unite(ByVal Taille As Double) As String
Dim TabUnite 'On déclare une variable qui va être un tableau
Dim i As Integer 'Un compteur
TabUnite = Array("o", "Ko", "Mo", "Go", "To", "Po", "Eo", "Zo", "Yo") 'Le tbaleau de unités
i = 0 'Initialisation du compteur
Do While Taille >= 1024 And i < 8 'Début de la boucle
Taille = Taille / 1024 'On divise
i = i + 1 'on rajoute 1 au compteur
Loop
'On retourne la taille convertie avec l'unité dans une string
Unite = Round(Taille, 2) & " " & TabUnite(i)
End FunctionExemple :
MsgBox Unite(FileLen("chemindufichier"))Ce source copie le contenu du répertoire c:\sources dans le répertoire c:\oldsources. Passer la valeur True en troisième paramètre de CopyFolder indique que les fichiers existants devront être écrasés.
Dim fso As FileSystemObject
Set fso = New FileSystemObject
fso.CopyFolder "c:\sources", "c:\oldsources", True
Set fso = NothingLien : Quelle référence dois-je ajouter à mon projet pour pouvoir utiliser le FileSystemObject ?
Avec RmDir, mais vous ne pouvez l'utiliser que pour supprimer des répertoires vides.
RmDir "c:\temp"Pour supprimer un répertoire qui contient fichiers ou répertoires, utilisez le FileSystemObject, qui est disponible seulement si vous avez inclus la librairie Microsoft Scripting Runtime dans les références de votre projet.
Dim fso as FileSystemObject
Set fso = New FileSystemObject
fso.DeleteFolder "c:\temp", TrueLa valeur True passée au deuxième paramètre permet de supprimer le répertoire dans le cas où il aurait l'attribut lecture seule. Ce paramètre est optionnel, et a la valeur False par défaut.
Lien : Quelle référence dois-je ajouter à mon projet pour pouvoir utiliser le FileSystemObject ?
Dim rep As String
'obtient le premier fichier ou répertoire qui est dans "c:\"
rep = Dir("c:\*.*", vbDirectory)
'boucle tant que le répertoire n'a pas été entièrement parcouru
Do While (rep <> "")
'teste si c'est un fichier ou un répertoire
If (GetAttr("c:\" & rep) And vbDirectory) = vbDirectory Then
MsgBox "Répertoire " & rep
Else
MsgBox "Fichier " & rep
End If
'passe à l'élément suivant
rep = Dir
Loop
Nécessite d'activer la référence Microsoft Scripting Runtime (scrrun.dll)
Il y a possibilité d'agir sur chaque fichier listé !
Private Sub Command1_Click()
Dim fso As FileSystemObject, dossier As Folder, sousdossier As Folder, fichier As File
Set fso = New FileSystemObject
Set dossier = fso.GetFolder("c:\essai")
scan dossier
End Sub
Public Sub scan(ByVal dossier As Folder)
For Each fichier In dossier.Files
Debug.Print fichier
Next
For Each sousdossier In dossier.SubFolders
Debug.Print sousdossier
scan sousdossier
Next
End SubVoici une méthode simple utilisant le FileSystemObject. Placez ce code dans un module :
Public Enum UniteMemoire
octets = 1
kiloOctets = 2
megaOctets = 3
End Enum
Public Function TailleRepertoire(f As Folder, Optional unite As UniteMemoire = 1) As Long
Dim s As Long
s = f.Size
Select Case unite
Case 2:
TailleRepertoire = Int(s / 1024)
Case 3:
TailleRepertoire = Int(s / 1048576)
Case Else:
TailleRepertoire = s
End Select
End FunctionUn exemple d'utilisation :
Private Sub Test()
Dim fs As FileSystemObject, f As Folder, strTaille As String
Set fs = New FileSystemObject
Set f = fs.GetFolder("c:\windows")
strTaille = Format(TailleRepertoire(f), "##,##0 octets") & vbCrLf & _
Format(TailleRepertoire(f, kiloOctets), "##,##0 Ko") & vbCrLf & _
Format(TailleRepertoire(f, megaOctets), "##,##0 Mo")
MsgBox strTaille
End SubLien : Quelle référence dois-je ajouter à mon projet pour pouvoir utiliser le FileSystemObject ?
Pour cela vous devez ajouter ces déclarations au début de votre module :
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, _
ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, _
ByVal lpString2 As String) As Long
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End TypeLa fonction suivante ouvre la fenêtre de sélection de répertoire standard de Windows et renvoie le chemin du répertoire sélectionné. Les paramètres attendus sont le titre à afficher et l'identifiant de la fenêtre parente.
Public Function SelectFolder(Titre As String, Handle As Long) As String
Dim lpIDList As Long
Dim strBuffer As String
Dim strTitre As String
Dim tBrowseInfo As BrowseInfo
strTitre = Titre
With tBrowseInfo
.hWndOwner = Handle
.lpszTitle = lstrcat(strTitre, "")
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
End With
lpIDList = SHBrowseForFolder(tBrowseInfo)
If (lpIDList) Then
strBuffer = String(260, vbNullChar)
SHGetPathFromIDList lpIDList, strBuffer
SelectFolder = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
End If
End FunctionCette ligne fait appel à la fonction écrite ci-dessus pour ouvrir la fenêtre de sélection de répertoire et afficher le répertoire sélectionné :
MsgBox SelectFolder("Sélectionnez un répertoire :", Me.hWnd)
Vous trouverez dans la faq : Comment ouvrir une fenêtre de sélection de répertoire ?
Une solution utilisant la fonction SHBrowseForFolder de l'Api shell32,
pour afficher la fenêtre de sélection de répertoire.
Cette fonction prends en paramètre de type BrowseInfo, la modification de la fenêtre de sélection de répertoire est obtenu grâce à la propriété uFlag de ce paramètre .
Et donc une modification de la ligne de code :
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN| Nom | Valeur | Conséquence |
|---|---|---|
| BIF_RETURNONLYFSDIRS | &H0001 | Autorise seulement la sélection d'éléments du système de fichier ( pas d'imprimante...) |
| BIF_DONTGOBELOWDOMAIN | &H0002 | Limite la sélection dans réseau au nom de domaines sans ouverture possible |
| BIF_STATUSTEXT | &H0004 | Rajoute une zone état dont le texte peu ensuite être modifié par des appels à SendMessage |
| BIF_EDITBOX | &H0010 | Rajout d'une zone d'édition sur la boîte de dialogue parcourir, permettant la saisie d'un répertoire (existant) |
| BIF_VALIDATE | &H0020 | Utilisé conjointement avec BIF_EDITBOX, appel de la fonction callback : BrowseCallbackProc, avec le message : BFFM_VALIDATEFAILED, si répertoire saisie invalide. |
| BIF_NEWDIALOGSTYLE | &H0040 | Boîte de dialogue nouveau style,support glisser déposer, taille modifiable, bouton créer nouveau dossier, menu contextuel. |
| BIF_BROWSEINCLUDEURLS | &H0080 | Permet la sélection d'un fichier par son URL, nécessite les flags : BIF_USENEWUI et BIF_BROWSEINCLUDEFILES. |
| BIF_USENEWUI | &H0050 | Nouvelle interface y compris la zone d'édition, équivalent à : BIF_EDITBOX OR BIF_NEWDIALOGSTYLE. |
| BIF_UAHINT | &H0100 | Lorsque combiné avec BIF_NEWDIALOGSTYLE, ajoute un texte d'aide ("Pour afficher... cliquez sur + ") , en lieu et place de la zone d'édition, si BIF_EDITBOX et actif celui-ci l'emporte. |
| BIF_NONEWFOLDERBUTTON | &H0200 | Supprime l'affichage du bouton nouveau dossier. |
| BIF_NOTRANSLATETARGETS | &H0400 | Sur sélection d'un raccourci, renvoi le raccourci lui même plutôt que sa cible. |
| BIF_BROWSEFORCOMPUTER | &H1000 | Autorise seulement le choix d'un ordinateur. |
| BIF_BROWSEFORPRINTER | &H2000 | Autorise seulement le choix d'une imprimante. |
| BIF_BROWSEINCLUDEFILES | &H4000 | Permet la sélection des fichiers. |
| BIF_SHAREABLE | &H8000 | Utilisé conjointement avec BIF_NEWDIALOGSTYLE, affiche la liste des ressources partagées par les ordinateurs distants. |
implémentation
Le code vu précédemment ici peut-être adapté :
rajouter tout d'abords la déclaration des constantes utiles :
Public Const BIF_RETURNONLYFSDIRS = &H0001
Public Const BIF_DONTGOBELOWDOMAIN = &H0002
Public Const BIF_STATUSTEXT = &H0004
Public Const BIF_EDITBOX = &H0010
Public Const BIF_NEWDIALOGSTYLE = &H0040
Public Const BIF_NONEWFOLDERBUTTON = &H0200
(...)
Modifier :
Dans l'entête de la fonction :
Public Function SelectFolder(Titre As String, Handle As Long, Optional ByVal uFlags As Long = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN) As String
Dans le corps de la fonction :
.ulFlags = uFlags
et en appelant la fonction SelectFolder :
Avec affichage du bouton de création de dossier :
MsgBox SelectFolder ("Titre", Me.hwnd, BIF_NEWDIALOGSTYLE)Sans affichage du bouton de création de dossier :
MsgBox SelectFolder ("Titre", Me.hwnd, BIF_NEWDIALOGSTYLE+ BIF_NONEWFOLDERBUTTON)Dans le Menu Projet >> Références >> Ajoutez la librairie Microsoft Scripting Runtime. Le fichier correspondant se nomme scrrun.dll
Cette fonction reçoit le chemin complet d'un fichier en paramètre et renvoie le chemin du répertoire :
Public Function ExtractFilePath(ByVal sFullPath As String) As String
If Right(sFullPath, 1) = "\" Then
ExtractFilePath = sFullPath
Else
ExtractFilePath = Left(sFullPath, InStrRev(sFullPath, "\"))
End If
End FunctionLien : Comment récupérer le nom d'un fichier à partir d'un chemin complet ?
Lien : Comment récupérer l'extension d'un fichier à partir d'un chemin complet ?
Cette fonction propose plusieurs arguments utiles pour personnaliser votre boîte de dialogue, ils sont expliqués dans le code.
Code à placer dans un module :
'Déclaration de l'API
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
'Structure du fichier
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
'Constantes
Private Const OFN_READONLY = &H1
Private Const OFN_OVERWRITEPROMPT = &H2
Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_NOCHANGEDIR = &H8
Private Const OFN_SHOWHELP = &H10
Private Const OFN_ENABLEHOOK = &H20
Private Const OFN_ENABLETEMPLATE = &H40
Private Const OFN_ENABLETEMPLATEHANDLE = &H80
Private Const OFN_NOVALIDATE = &H100
Private Const OFN_ALLOWMULTISELECT = &H200
Private Const OFN_EXTENSIONDIFFERENT = &H400
Private Const OFN_PATHMUSTEXIST = &H800
Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_CREATEPROMPT = &H2000
Private Const OFN_SHAREAWARE = &H4000
Private Const OFN_NOREADONLYRETURN = &H8000
Private Const OFN_NOTESTFILECREATE = &H10000
Private Const OFN_SHAREFALLTHROUGH = 2
Private Const OFN_SHARENOWARN = 1
Private Const OFN_SHAREWARN = 0
Public Function OuvrirUnFichier(Handle As Long, _
Titre As String, _
TypeRetour As Byte, _
Optional TitreFiltre As String, _
Optional TypeFichier As String, _
Optional RepParDefaut As String) As String
'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
'la boîte de dialogue de sélection d'un fichier.
'Explication des paramètres
'Handle = le handle de la fenêtre (Me.Hwnd)
'Titre = Titre de la boîte de dialogue
'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
'1 = Chemin complet + Nom du fichier
'2 = Nom fichier seulement
'TitreFiltre = Titre du filtre
'Exemple: Fichier Access
'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
'TypeFichier = Extention du fichier (Sans le .)
'Exemple: MDB
'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
'RepParDefaut = Répertoire d'ouverture par defaut
'Exemple: C:\windows\system32
'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application
Dim StructFile As OPENFILENAME
Dim sFiltre As String
'Construction du filtre en fonction des arguments spécifiés
If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
End If
sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
'Configuration de la boîte de dialogue
With StructFile
.lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
.hwndOwner = Handle 'Identification du handle de la fenêtre
.lpstrFilter = sFiltre 'Application du filtre
.lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
.nMaxFile = 254 'Taille maximale du fichier
.lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
.nMaxFileTitle = 254 'Taille maximale du nom du fichier
.lpstrTitle = Titre 'Titre de la boîte de dialogue
.flags = OFN_HIDEREADONLY 'Option de la boite de dialogue
If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
.lpstrInitialDir = App.path
Else: .lpstrInitialDir = RepParDefaut
End If
End With
If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
Select Case TypeRetour
Case 1: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFile, InStr(1, StructFile.lpstrFile, vbNullChar)-1))
Case 2: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFileTitle, InStr(1, StructFile.lpstrFileTitle, vbNullChar)-1))
End Select
End If
End FunctionExemple pour appeler la fonction depuis le code d'un formulaire :
MsgBox OuvrirUnFichier(Me.Hwnd, "Parcourir", 1, "Fichier Word", "doc")Lien : Afficher la boîte de dialogue Enregistrer sous afin de récupérer le nom et le chemin du fichier sélectionné
Lien : Utilise le contrôle Common Dialog pour récupérer le chemin d'un fichier
Lien : Comment avec l'API GetOpenFileNameA ouvrir plusieurs fichiers à la fois ?
Il suffit de mettre l'attribut flags à la valeur suivante :
openfile.flags = &H200 'MultiselectEnsuite, la variable fichier est un string qui va contenir les noms.
C:\autoexec.bat nouveau.txtA vous de travailler cette chaîne pour obtenir le résultat souhaité.
Lien : Afficher la boîte de dialogue ouvrir afin de récupérer le nom et le chemin du fichier sélectionné
Note : Les arguments de cette fonction sont expliqués dans le code.
Code à placer dans un module :
'Déclaration de l API
Private Declare Function GetSaveFileName Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) _
As Long
'Structure du fichier
Private Type OPENFILENAME
lStructSize As Long
hWndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Function EnregistrerUnFichier(Handle As Long, Titre As String, _
NomFichier As String, Chemin As String) As String
'EnregistrerUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
la boîte de dialogue d'enregistrement d'un fichier.
'Explication des paramètres
'Handle = le handle de la fenêtre (Me.Hwnd)
'Titre = Titre de la boîte de dialogue
'NomFichier = Nom par défaut du fichier à enregistrer
'Chemin = Chemin par défaut du fichier à enregistrer
Dim structSave As OPENFILENAME
With structSave
.lStructSize = Len(structSave)
.hWndOwner = Handle
.nMaxFile = 255
.lpstrFile = NomFichier & String$(255 - Len(NomFichier), 0)
.lpstrInitialDir = Chemin
.lpstrFilter = "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0) 'Définition du filtre (aucun)
.Flags = &H4 'Option de la boite de dialogue
End With
If (GetSaveFileName(structSave)) Then
EnregistrerUnFichier = Mid$(structSave.lpstrFile, 1, InStr(1, structSave.lpstrFile, vbNullChar) - 1)
End If
End FunctionExemple pour appeler la fonction depuis le code d'un formulaire :
MsgBox EnregistrerUnFichier(Me.hwnd, "Enrégistrer sous", "Test.doc", "C:\")Lien : Afficher la boîte de dialogue ouvrir afin de récupérer le nom et le chemin du fichier sélectionné
Lien : Utilise le contrôle Common Dialog pour récupérer le chemin d'un fichier
Pour obtenir le chemin relatif d'un fichier par rapport à un répertoire, vous pouvez utiliser la fonction suivante :
Function GetRelativePath(ByVal strPath As String, Optional ByVal strPathCurrent As String)
Dim tmpCurr() As String
Dim tmpP() As String
Dim i As Integer
Dim iIndex As Integer
' par défaut on considère que c'est relatif par rapport au chemin courant de la base
' pour VB6, on utilise le chemin de l'application :
If strPathCurrent = "" Then strPathCurrent = App.Path 'CurrentProject.Path
If Right(strPathCurrent, 1) = "\" Then strPathCurrent = Left(strPathCurrent, Len(strPathCurrent) - 1)
' on passe tout en minuscule pour éviter les erreurs de comparaison minuscule et majuscule
strPath = LCase(strPath)
strPathCurrent = LCase(strPathCurrent)
If Left(strPath, 1) = Left(strPathCurrent, 1) Then
' on recherche la partie commune aux deux chemins
tmpP = VBA.Split(strPath, "\")
tmpCurr = VBA.Split(strPathCurrent, "\")
For iIndex = 0 To IIf(UBound(tmpP) > UBound(tmpCurr), UBound(tmpCurr), UBound(tmpP))
If tmpP(iIndex) <> tmpCurr(iIndex) Then
Exit For
Else
i = iIndex
End If
Next iIndex
If i = UBound(tmpCurr) Then
' c'est un sous répertoire
For iIndex = i + 1 To UBound(tmpP)
GetRelativePath = GetRelativePath & tmpP(iIndex) & "\"
Next iIndex
GetRelativePath = Left(GetRelativePath, Len(GetRelativePath) - 1)
Else
' il faut remonter de UBound(tmpCurr) - i
For iIndex = 1 To UBound(tmpCurr) - i
GetRelativePath = GetRelativePath & "..\"
Next iIndex
For iIndex = i + 1 To UBound(tmpP)
GetRelativePath = GetRelativePath & tmpP(iIndex) & "\"
Next iIndex
GetRelativePath = Left(GetRelativePath, Len(GetRelativePath) - 1)
End If
Else
' deux lecteurs différents
GetRelativePath = strPath
End If
End FunctionLe premier paramètre correspond au chemin du fichier ou du dossier, le second correspond au chemin courant.
Exemple :
?getrelativepath("c:\toto\tata\test.xls","c:\tintin")
..\toto\tata\test.xls
?getrelativepath("c:\toto\tata\test.xls","c:\toto\tata")
\test.xlsCette fonction reçoit le chemin complet d'un fichier en paramètre et renvoie le nom du fichier :
Public Function ExtractFileName(ByVal sFullPath As String) As String
If InStr(sFullPath, "\") = 0 Or Right(sFullPath, 1) = "\" Then
ExtractFileName = ""
Exit Function
End If
ExtractFileName = Mid(sFullPath, InStrRev(sFullPath, "\") + 1)
End FunctionLien : Comment récupérer le répertoire d'un fichier à partir de son chemin complet ?
Lien : Comment récupérer l'extension d'un fichier à partir d'un chemin complet ?
Cette fonction reçoit le chemin complet d'un fichier en paramètre et renvoie l'extension du fichier, si elle existe, sinon renvoie une chaîne vide :
(Nécessite la fonction ExtractFileName)
Public Function ExtractFileExt(ByVal sFullPath As String) As String
Dim sName As String
sName = ExtractFileName(sFullPath)
If InStr(sName, ".") = 0 Then
ExtractFileExt = ""
Else
ExtractFileExt = Mid(sName, InStrRev(sName, ".") + 1)
End If
End FunctionLien : Comment récupérer le nom d'un fichier à partir d'un chemin complet ?
Lien : Comment récupérer le répertoire d'un fichier à partir de son chemin complet ?
VB n'inclut pas de composant permettant de compresser des fichiers. Il est possible de s'en sortir en exécutant, via la fonction Shell, un programme de type pkzip. Mais une solution plus pratique est d'utiliser une librairie ou un active-x. Ici nous utiliserons la zlib, qui a l'avantage d'être gratuite, open source et de créer des zips standards. Le code à écrire en VB pour la manipuler étant assez conséquent, nous allons aussi importer les classes VB d'Andrew McMillan disponibles dans les fichiers zipclass.zip et ZipExtractionClass.zip (la zlib est aussi dans ces zips).
Après avoir téléchargé ces 2 fichiers, importez les classes dans votre projet et copiez le fichier zlib.dll dans le répertoire de votre projet ou dans le répertoire système.
Voici comment créer un fichier zip :
Dim z As ZipClass
Set z = New ZipClass
z.AddFile "c:\test.doc"
z.AddFile "c:\test.jpg"
z.WriteZip "c:\test.zip", True
Set z = NothingEt comment faire une extraction :
Dim zip As ZipExtractionClass
Set zip = New ZipExtractionClass
If zip.OpenZip("C:\Test\Test.zip") Then
If zip.Extract("C:\Test\Extract", True, True) Then
MsgBox "Extraction terminée.", vbInformation
End If
zip.CloseZip
End If
Set zip = NothingLien : La zlib
Lien : La création d'un zip par Andrew McMillan
Lien : L'extraction d'un zip par Andrew McMillan
Le FileSystemObject vous permet de le faire facilement :
Public Function TypeLecteur(ByVal drvpath) As String
Dim fs As FileSystemObject, d As drive, t As String
Set fs = New FileSystemObject
On Error GoTo fail
Set d = fs.GetDrive(drvpath)
Select Case d.DriveType
Case 0: t = "Inconnu"
Case 1: t = "Amovible"
Case 2: t = "Fixe"
Case 3: t = "Réseau"
Case 4: t = "CD-ROM"
Case 5: t = "Disque RAM"
End Select
fin:
TypeLecteur = t
Exit Function
fail:
t = "Introuvable"
Resume fin
End FunctionCette fonction attend en argument la lettre d'un lecteur et renvoie son type en toutes lettres. Par exemple :
MsgBox TypeLecteur("c")Lien : Quelle référence dois-je ajouter à mon projet pour pouvoir utiliser le FileSystemObject ?
Voici une fonction qui vous renvoie le premier lecteur qui contient un CD, ou une chaîne vide s'il n'y en a aucun. Vous devez ajouter le FileSystemObject dans les références du projet.
Public Function LecteurAvecCD() As String
Dim fso As FileSystemObject, lecteur As Drive
Dim strPath As String, strLecteurCD As String
Set fso = New FileSystemObject
For Each lecteur In fso.Drives
If lecteur.DriveType = 4 Then
On Error GoTo suite
strPath = Dir(lecteur.path)
strLecteurCD = lecteur.path
Exit For
End If
suite:
Next
Set fso = Nothing
LecteurAvecCD = strLecteurCD
End FunctionSans utilisation de FSO (FileSystemObject), placez ce code dans un module :
Private Declare Function GetVolumeInformation Lib "kernel32.dll" Alias "GetVolumeInformationA" ( _
ByVal lpRootPathName As String, _
ByVal lpVolumeNameBuffer As String, _
ByVal nVolumeNameSize As Long, _
ByRef lpVolumeSerialNumber As Long, _
ByRef lpMaximumComponentLength As Long, _
ByRef lpFileSystemFlags As Long, _
ByVal lpFileSystemNameBuffer As String, _
ByVal nFileSystemNameSize As Long) As Long
Public Function Test_Lecteur(Lecteur As String) As Long
Dim VolNameBuffer As String
VolNameBuffer = String(255, ".")
Test_Lecteur = GetVolumeInformation(Lecteur, VolNameBuffer, 255, 0, 0, 0, 0, 255)
End FunctionAppel de la procédure :
Dim result As Long
result = Test_Lecteur("D:\")
If result = 0 Then
MsgBox "Lecteur Vide"
Else
MsgBox "CD présent dans le lecteur"
End IfLien : Quelle référence dois-je ajouter à mon projet pour pouvoir utiliser le FileSystemObject ?
1) En utilisant l'API Windows :
Private Declare Function GetDiskFreeSpace Lib "kernel32.dll" Alias "GetDiskFreeSpaceA" ( _
ByVal lpRootPathName As String, _
ByRef lpSectorsPerCluster As Long, _
ByRef lpBytesPerSector As Long, _
ByRef lpNumberOfFreeClusters As Long, _
ByRef lpTtoalNumberOfClusters As Long) As Long
Private Function conversion(nombre As Currency) As String
Const KB As Double = 1024
Const MB As Double = KB * 1024
Const GB As Double = MB * 1024
If nombre <= 999 Then
conversion = Str(nombre) & " bytes"
ElseIf nombre <= KB * 999 Then
conversion = Format((nombre / KB), "0.00") & " KB"
ElseIf nombre <= MB * 999 Then
conversion = Format((nombre / MB), "0.00") & " MB"
ElseIf nombre <= GB * 999 Then
conversion = Format((nombre / GB), "0.00") & " GB"
End If
End Function
Public Function Espace_Disque() As String
Dim SectorsPerCluster As Long
Dim BytesPerCluster As Long
Dim NumberOfFreeClusters As Long
Dim TtoalNumberOfClusters As Long
Dim Espace_Libre As Currency
Dim Espace_Total As Currency
Dim Espace_Utilise As Currency
GetDiskFreeSpace "C:\", SectorsPerCluster, _
BytesPerSector, _
NumberOfFreeClusters, _
TtoalNumberOfClusters
Espace_Libre = NumberOfFreeClusters * BytesPerSector * SectorsPerCluster
Espace_Total = BytesPerSector * TtoalNumberOfClusters * SectorsPerCluster
Espace_Utilise = Espace_Total - Espace_Libre
Espace_Disque = "Espace Libre : " & conversion(Espace_Libre) & vbCrLf & _
"Espace Total : " & conversion(Espace_Total) & vbCrLf & _
"Espace Utilisé : " & conversion(Espace_Utilise)
End Function2) En utilisant le FileSystemObject :
' Ajouter la référence à Microsoft Scripting Runtime à votre projet
Sub InfoEspaceDisques()
Dim fso As New FileSystemObject, d As Drive, txt As String
For Each d In fso.Drives
'If d.DriveType = 2 Or d.DriveType = 5 or d.DriveType = 3 Then
If d.DriveType = Fixed Or d.DriveType = RamDisk Or _
d.DriveType = Remote Then
txt = txt & "Disk " & d.DriveLetter & "(" & d.VolumeName & ")" & vbTab
txt = txt & "Total : " & d.TotalSize & vbTab
txt = txt & "Libre : " & d.FreeSpace & vbCrLf
Debug.Print txt
End If
Next
Set fso = Nothing
End SubPlacez un contrôle Timer et ce code :
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hwndParent As Long, _
ByVal nID As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any) As Long
Private Const WM_USER As Long = &H400
Private Const WM_CAP_DRIVER_CONNECT As Long = WM_USER + 10
Private Const WM_CAP_DRIVER_DISCONNECT As Long = WM_USER + 11
Private Const WM_CAP_GRAB_FRAME As Long = WM_USER + 60
Private Const WM_CAP_EDIT_COPY As Long = WM_USER + 30
Private iResult As Long
Private Sub Form_Load()
Timer1.Interval = 50
iResult = capCreateCaptureWindow("Capture", _
0, 0, 0, _
Picture1.ScaleWidth, _
Picture1.ScaleHeight, _
Me.hwnd, 0)
SendMessage iResult, WM_CAP_DRIVER_CONNECT, 0, 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
SendMessage iResult, WM_CAP_DRIVER_DISCONNECT, 0, 0
End Sub
Private Sub Timer1_Timer()
Clipboard.Clear
SendMessage iResult, WM_CAP_GRAB_FRAME, 0, 0
SendMessage iResult, WM_CAP_EDIT_COPY, 0, 0
Picture1.Picture = Clipboard.GetData
End SubEn complément des fonctions SetAttr et GetAttr, ces fonctions de l'API Windows permettent de modifier ou de lire les attributs d'un fichier, non accessibles par VB6 :
Private Const FILE_ATTRIBUTE_READONLY As Long = &H1 'Fichier en lecture seule.
Private Const FILE_ATTRIBUTE_HIDDEN As Long = &H2 'Fichier caché.
Private Const FILE_ATTRIBUTE_SYSTEM As Long = &H4 'Fichier système.
Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10 'L'élément est un répertoire.
Private Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20 'Le fichier a l'attribut archive.
Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80 'Le fichier n'a pas d'attribut.
Private Const FILE_ATTRIBUTE_TEMPORARY As Long = &H100 'Fichier temporaire.
Private Const FILE_ATTRIBUTE_COMPRESSED As Long = &H800 'Fichier (répertoire) compressé.
Private Const FILE_ATTRIBUTE_ENCRYPTED As Long = &H4000 ' Fichier crypté
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" _
(ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" _
(ByVal lpFileName As String) As LongModifier les attributs d'un fichier :
Private Sub Command1_Click()
MsgBox SetFileAttributes("C:\str.txt", FILE_ATTRIBUTE_SYSTEM)
End SubLire les attributs d'un fichier :
If GetFileAttributes("C:\test.ini") And FILE_ATTRIBUTE_ENCRYPTED Then MsgBox "Fichier crypté"Ce code intègre un son wav sans utiliser Windows média player ou mdi.
Private Const SND_APPLICATION = &H80 ' look for application specific association
Private Const SND_ALIAS = &H10000 ' name is a WIN.INI [sounds] entry
Private Const SND_ALIAS_ID = &H110000 ' name is a WIN.INI [sounds] entry identifier
Private Const SND_ASYNC = &H1 ' play asynchronously
Private Const SND_FILENAME = &H20000 ' name is a file name
Private Const SND_LOOP = &H8 ' loop the sound until next sndPlaySound
Private Const SND_MEMORY = &H4 ' lpszSoundName points to a memory file
Private Const SND_NODEFAULT = &H2 ' silence not default, if sound not found
Private Const SND_NOSTOP = &H10 ' don't stop any currently playing sound
Private Const SND_NOWAIT = &H2000 ' don't wait if the driver is busy
Private Const SND_PURGE = &H40 ' purge non-static events for task
Private Const SND_RESOURCE = &H40004 ' name is a resource name or atom
Private Const SND_SYNC = &H0 ' play synchronously (default)
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As LongArrêter le son :
Private Sub Arreter_Click()
PlaySound 0&, ByVal 0&, SND_FILENAME Or SND_ASYNC
End SubJouer le son :
Private Sub Jouer_Click()
PlaySound "C:\WINDOWS\MEDIA\test.WAV", ByVal 0&, SND_FILENAME Or SND_ASYNC
End SubCe code nécessite d'activer la référence "Standard OLE Types" :
Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" _
(ByVal pszPath As Any, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, _
ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
Public Declare Function OleCreatePictureIndirect _
Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, _
ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Public 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
Public Type PicBmp
Size As Long
tType As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type
Public Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Public Type SHFILEINFO
hicon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * 260
szTypeName As String * 80
End Type
Public Function GetIconFromFile(FileName As String, IconIndex As Long, _
UseLargeIcon As Boolean) As IPicture
'**************************************************************
'Necessite d'activer la reference "Standard OLE Types"
'**************************************************************
Dim b As SHFILEINFO
Dim retval As Long
Dim pic As PicBmp
Dim IPic As IPicture
Dim IID_IDispatch As GUID
retval = SHGetFileInfo(FileName, 0, b, Len(b), &H100)
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With pic
.Size = Len(b)
.tType = 3 'vbPicTypeIcon
.hBmp = b.hicon
End With
Call OleCreatePictureIndirect(pic, IID_IDispatch, 1, IPic)
Set GetIconFromFile = IPic
End Function
Nécessite d'activer la référence DSO OLE Document Propeties Reader 2.1 (dsofile.dll)
Lien Microsoft pour téléchargement
dll qui encapsule les interfaces "IPropertyStorage" et "IPropertySetStorage".
Sub LitEcritProprieteAvancees()
Dim dso As New DSOFile.OleDocumentProperties
Dim docP As DSOFile.SummaryProperties
Dim stFichier As String
stFichier = App.Path & "\monfic.txt"
dso.Open stFichier
Set docP = dso.SummaryProperties
docP.Comments = docP.Comments & IIf(docP.Comments <> "", vbCrLf, "") & "Ajout ou Modification à : " & Now
dso.Save
End SubEn utilisant un objet ADODB.stream, ajouter pour cela la référence à "Microsoft ActiveX Data Object " version 2.5 ou supérieure.
' Ajouter la référence Microsoft ActiveX Data Objects 2.5 ou +
Dim stream As New ADODB.stream
stream.Charset = "UTF-8"
stream.Open
stream.LoadFromFile "c:\tmp\testUTF8.txt"
MsgBox stream.ReadText
stream.CloseC'est faisable grâce aux RegExp, pensez à ajouter la référence Microsoft Regular Expressions 5.5 :
Function CountMatches(ByVal strFic As String, ByVal strSearch As String) As Long
Dim reg As VBScript_RegExp_55.RegExp
Dim Matches As VBScript_RegExp_55.MatchCollection
Dim Fic As Integer
Dim strBuff As String * 20000
Dim strBorder As String
' instanciation
Set reg = New VBScript_RegExp_55.RegExp
reg.Global = True
reg.IgnoreCase = True
reg.Multiline = True
reg.Pattern = "(" & strSearch & ")"
' gestion fichier
Reset
Fic = FreeFile
Open strFic For Binary Access Read As #Fic
Do While Not EOF(Fic)
strBorder = Right(strBuff, Len(strSearch) - 1)
Get #Fic, , strBuff
strBorder = strBorder & strBuff
Set Matches = reg.Execute(strBorder)
CountMatches = CountMatches + Matches.Count
Loop
Close #Fic
' libération
Set reg = Nothing
Set Matches = Nothing
End FunctionExemple :
?countmatches("c:\temp\long.txt"," ")
7500Lien : Les Expressions Rationnelles et Access par la pratique



