Categories: VBA 语言教程

VBA操作文件和文件夹步骤

获取当前文件夹的名称(CurDir 函数)

当你使用文件时,经常会需要知道当前文件夹的名称,你使用CurDir函数轻易地获取该信息:
CurDir([drive])

Drive是一可选参数,如果你忽略它,VBA将使用当前驱动(drive)。

CurDir函数返回一个文件路径作为Variant(变量)。如果要返回作为字符串(String)的路径的话,就得使用CurDir$(这里的$是字符串的类型声明字符)。让我们在立即窗口里做些练习,练习使用这些函数吧:
1. 打开一个新工作簿,并且切换到VB编辑器窗口
2. 激活立即窗口并敲入下述代码:
?CurDir

当你按下回车,VB就显示当前文件夹名称,例如:
C:
如果你有第二个硬盘(或者光驱)的话,你可以获取D盘上的当前文件夹,例如:

?CurDir(“D:”)

如果你提供了一个并不存在的驱动字母的话,VB就将显示下述错误信息:“设备不可用”

3. 要储存当前驱动名称到变量myDrive,可以输入下述指令:
myDrive = Left(CurDir$,1)

当你按下回车键时,VB将当前驱动器的字母储存到变量myDrive
敲入下述指令并回车,可以检查变量myDrive的内容:

?myDrive

你还可以将上面的指令改为如下:

myDrive = left(CurDir$,1) & ":"

VB将返回驱动器字母,后面带有一个冒号。

更改文件或文件夹名称(Name 函数)

使用函数Name可以重命名文件或者文件夹,例如:
Name old_pathname As new_pathname

Old_pathname是你想用重命名的文件或文件夹的名称和路径,New_pathname则明确文件或文件夹的新名称和位置。使用函数Name,你可以将一个文件从一个文件夹移动到另外一个文件夹,但是,你不可以移动文件夹。

请在立即窗口里试演该函数(用你文件的实际名称替换示例名称)。这里有些需要考虑的注意事项:
①在New_pathname里的文件名称不要指向已经存在的文件
Name “C:System.1st ” As “C: est.txt”
因为文件C: est.txt已经存在于C盘,VB将显示错误信息:“文件已存在”,同样,如果你要重命名的文件不存在的话,就会出现“文件未找到”的错误信息。
②如果New_pathname已经存在,并且和Old_pathname不同,函数Name必要时将文件移动到新文件夹并且更改它的名称。
Name “C:System.1st ” As “D: est.txt”
因为文件test.txt在D盘的根目录下并不存在,VB将C:System.1st
移动到指定的驱动盘,然而,并不重命名该文件。(本段与上面的内容似乎矛盾,而且未能试验成功,未知是原书失误与否。读者应仔细验证)
③如果New_pathname和Old_pathname指向不同的目录,以及提供的文件名称相同,那么Name函数将指定的文件移到新地址,不用更改文件名。
Name “D: est.txt ” As “C:DOS est.txt”
上面的指令将test.txt移动到C盘下的DOS文件夹里。

技巧:你不能重命名开启的文件
在重命名文件之前,你必须关闭该文件。文件名称里不能包含通配符“*”或者“?”。

检查文件或文件夹是否存在(Dir 函数)

Dir函数,返回文件或者文件夹名称,语法如下:
Dir[(pathname[, attributes])]

Dir函数的两个参数都是可选的,pathname是文件或文件夹名称,对于参数attributes,你可以下列常量或者数值之一:

Dir函数常用来检查某个文件或文件夹是否存在,如果不存在,那么就返回空字符串(””)。我们到立即窗口里试验几个Dir函数的练习:
1. 在立即窗口,输入下述指令:
?Dir("C:", vbNormal)

你一旦按下回车键,VB就会返回该文件夹下的第一个文件名。普通文件(vbNormal)就是除隐藏,卷标,目录,文件夹或系统文件之外的任何文件。
要返回当前目录下的其它文件名称的话,就使用不带参数的Dir函数:
?Dir (并且回车)

2. 在立即窗口里输入下列指令,并且在你回车时检查其结果:
mfile = Dir("C:", vbHidden)
?mfile
mfile = Dir
?mfile
mfile = Dir
?mfile

3. 在立即窗口输入下述指令:

If Dir("C:stamp.bat") = "" Then Debug.Print "文件未找到。"

因为stamp.bat文件不在C盘上,所以VB就在立即窗口里写下文本信息“文件未找到。”

4. 在立即窗口输入下述语句,可以检查某文件是否存在于某驱动盘上:
If Dir ("C:Autoexec.bat") <>"" Then Debug.Print "该文件不在C盘上。"

函数Dir允许你在文件路径名中使用通配符——星号(*)代表多个字符,问号(?)代表单个字符:

例如,要在WINDOWS文件夹中查找所有配置设置的文件,你可以查找所有的INI文件,如下:
?Dir("C:WINNT*.ini", vbNormal)
system.ini
?dir WIN.INI
?dir
WINFILE.INI
?dir control.ini
?dir EQUIP32.INI
?dir
sxpwin32.ini

下面显示的过程在立即窗口里写上了确定目录下的文件名称。函数LCase$让文件名称显示为小写字母。

1. 打开一新工作簿,并保存为Chap08.xls
2. 切换到VB编辑器窗口并重命名VBA工程为FileMan
3. 插入新模块,重命名为DirFunction
4. 输入下述VBA过程:
Sub MyFiles()
Dim mfile As String
Dim mpath As String
mpath = InputBox("Enter pathname,e.g., C:Excel")
If Right(mpath, 1) <> "" Then mpath = mpath & ""
mfile = Dir(mpath & "*.*")
If mfile <> "" Then Debug.Print "Files in the " & mpath _
& "folder"
Debug.Print LCase$(mfile)
If mfile = "" Then
MsgBox "No files found."
Exit Sub
End If
Do While mfile <> ""
mfile = Dir
Debug.Print LCase$(mfile)
Loop
End Sub

上面的过程myFiles向用户询问文件路径名。如果该路径结尾没有反斜杠,函数Right就会将反斜杠附加在路径名字符串上。接下来,VB在该确定的文件夹里搜索所有文件(*)。如果没有文件的话,就会有信息显示,如果文件存在,那么文件名就会被写入立即窗口。

5. 在同一个模块里输入另外一个过程:
Sub GetFiles()
Dim nfile As String
Dim nextRow As Integer
nextRow = 1
next row index
With Worksheets("Sheet1").Range("A1")
nfile = Dir("C:", vbNormal)
.Value = nfile
Do While nfile <> ""
nfile = Dir
.Offset(nextRow, 0).Value = nfile
nextRow = nextRow + 1
Loop
End With
End Sub

过程GetFiles获取C盘根目录下的所有文件名并且将每个文件名写入工作表。

4.获得文件修改的日期和时间(FileDateTime 函数)
如果你的过程需要知道某文件的最后修改的时间的话,可以使用函数FileDateTime:
FileDateTime(文件路径名)
文件路径名是个字符串,明确你要用的文件,并且需要包括驱动和文件夹的名称。该函数返回某文件的日期和时间印记。日期和时间的格式取决于视窗控制面板的原始设置。
我们在立即窗口里来练习使用该函数:
1. 在立即窗口里输入:
?FileDateTime("C:config.sys")
回车后,VB返回下述格式的日期和时间
5/4/2001 10:52:00 AM
要分开获取日期和时间时,可以将函数FileDateTime作为函数DateValue或TimeValue的参数来使用。例如:
?DateValue(FileDateTime("C:config.sys"))
?TimeValue(FileDateTime("C:config.sys"))

2. 在立即窗口里将下述语句在一行输入:

If DateValue(FileDateTime("C:config.sys"))< Date then Debug.Print "This file was not
modified today.”

Date函数返回当前系统日期,也是视窗控制面板的日期

对话框里设定的。

获得文件大小(FileLen 函数)

如果你需要检查某文件是否能够存在某磁盘上,那么你应该按照下述方式使用FileLen函数:
FileLen(文件路径名)
FileLen函数一字节方式返回文件的大小。如果该文件已打开,那么VB将返回该文件最后一个保存时的大小。
假设你想要获取Windows目录下进行配置设置的所有文件的总大小:
1. 在当前工程里插入新模块,并重命名为FileLenFunction
2. 在代码窗口了输入过程TotalBytesIni:
Sub TotalBytesIni()
Dim iniFile As String
Dim allBytes As Long
iniFile = Dir("C:WINDOWS*.ini")
allBytes = 0
Do While iniFile <> ""
allBytes = allBytes + FileLen("C:WINDOWS" & iniFile)
iniFile = Dir
Loop
Debug.Print "Total bytes: " & allBytes
End Sub

冒牌SEO

前端开发者,欢迎大家一起沟通和交流。

Share
Published by
冒牌SEO

Recent Posts

vue:页面注入js修改input值

一般会直接这样写: let z…

60 分钟 ago

聊聊vue3中的defineProps

在Vue 3中,defineP…

1 周 ago

在 Chrome 中删除、允许和管理 Cookie

您可以选择删除现有 Cooki…

2 周 ago

自定义指令:聊聊vue中的自定义指令应用法则

今天我们来聊聊vue中的自定义…

3 周 ago

聊聊Vue中@click.stop和@click.prevent

一起来学下聊聊Vue中@cli…

4 周 ago

Nginx 基本操作:启动、停止、重启命令。

我们来学习Nginx基础操作:…

1 月 ago