VBA
Werken met bestanden en mappen zonder FileSystemObject te gebruiken
Zoeken…
Opmerkingen
Het Scripting.FileSystemObject
is veel robuuster dan de oudere methoden in dit onderwerp. In bijna alle gevallen verdient het de voorkeur.
Bepalen of mappen en bestanden bestaan
bestanden:
Om te bepalen of een bestand bestaat, geeft u de bestandsnaam gewoon door aan de functie Dir$
en test u of het een resultaat oplevert. Merk op dat Dir$
pathName
ondersteunt, dus om te testen op een specifiek bestand, moet de doorgegeven pathName
worden getest om ervoor te zorgen dat deze ze niet bevat. Het onderstaande voorbeeld geeft een foutmelding - als dit niet het gewenste gedrag is, kan de functie worden gewijzigd om eenvoudig False
te retourneren.
Public Function FileExists(pathName As String) As Boolean
If InStr(1, pathName, "*") Or InStr(1, pathName, "?") Then
'Exit Function 'Return False on wild-cards.
Err.Raise 52 'Raise error on wild-cards.
End If
FileExists = Dir$(pathName) <> vbNullString
End Function
Mappen (Dir $ -methode):
De functie Dir$()
kan ook worden gebruikt om te bepalen of er een map bestaat door vbDirectory
door te geven voor de parameter optionele attributes
. In dit geval moet de doorgegeven waarde pathName
eindigen op een pathName
( \
), omdat overeenkomende bestandsnamen valse positieven veroorzaken. Houd er rekening mee dat jokertekens alleen zijn toegestaan na het laatste padscheidingsteken, dus de onderstaande voorbeeldfunctie geeft een runtime-fout 52 - "Onjuiste bestandsnaam of -nummer" als de invoer een jokerteken bevat. Als dit niet het gewenste gedrag is, uncomment On Error Resume Next
bovenaan de functie. Onthoud ook dat Dir$
relatieve bestandspaden ondersteunt (bijv. ..\Foo\Bar
), zodat de resultaten alleen geldig zijn zolang de huidige werkmap niet wordt gewijzigd.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Uncomment the "On Error" line if paths with wild-cards should return False
'instead of raising an error.
'On Error Resume Next
If pathName = vbNullString Or Right$(pathName, 1) <> "\" Then
Exit Function
End If
FolderExists = Dir$(pathName, vbDirectory) <> vbNullString
End Function
Mappen (ChDir-methode):
De ChDir
instructie kan ook worden gebruikt om te testen of er een map bestaat. Merk op dat deze methode de omgeving waarin VBA wordt uitgevoerd tijdelijk zal veranderen, dus als dat een overweging is, moet in plaats daarvan de Dir$
-methode worden gebruikt. Het heeft het voordeel dat het veel minder vergevingsgezind is met zijn parameter. Deze methode ondersteunt ook relatieve bestandspaden, dus heeft dezelfde waarschuwing als de Dir$
-methode.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Cache the current working directory
Dim cached As String
cached = CurDir$
On Error Resume Next
ChDir pathName
FolderExists = Err.Number = 0
On Error GoTo 0
'Change back to the cached working directory.
ChDir cached
End Function
Bestandsmappen maken en verwijderen
OPMERKING: Om het kort te houden, gebruiken de onderstaande voorbeelden de functie FolderExists uit het voorbeeld Bepalen of mappen en bestanden bestaan in dit onderwerp.
De MkDir
instructie kan worden gebruikt om een nieuwe map te maken. Het accepteert paden met stationsletters ( C:\Foo
), UNC-namen ( \\Server\Foo
), relatieve paden ( ..\Foo
) of de huidige werkmap ( Foo
).
Als de schijf- of UNC-naam wordt weggelaten (bijv. \Foo
), wordt de map op de huidige schijf gemaakt. Dit kan al dan niet hetzelfde station zijn als de huidige werkmap.
Public Sub MakeNewDirectory(ByVal pathName As String)
'MkDir will fail if the directory already exists.
If FolderExists(pathName) Then Exit Sub
'This may still fail due to permissions, etc.
MkDir pathName
End Sub
De RmDir
instructie kan worden gebruikt om bestaande mappen te verwijderen. Het accepteert paden in dezelfde vorm als MkDir
en gebruikt dezelfde relatie tot de huidige werkmap en schijf. Merk op dat de instructie vergelijkbaar is met de Windows rd
shell-opdracht, dus een runtime-fout 75 veroorzaakt: "Path / File access error" als de doelmap niet leeg is.
Public Sub DeleteDirectory(ByVal pathName As String)
If Right$(pathName, 1) <> "\" Then
pathName = pathName & "\"
End If
'Rmdir will fail if the directory doesn't exist.
If Not FolderExists(pathName) Then Exit Sub
'Rmdir will fail if the directory contains files.
If Dir$(pathName & "*") <> vbNullString Then Exit Sub
'Rmdir will fail if the directory contains directories.
Dim subDir As String
subDir = Dir$(pathName & "*", vbDirectory)
Do
If subDir <> "." And subDir <> ".." Then Exit Sub
subDir = Dir$(, vbDirectory)
Loop While subDir <> vbNullString
'This may still fail due to permissions, etc.
RmDir pathName
End Sub