达永编程网

程序员技术分享与交流平台

Excel常用技能分享与探讨(5-宏与VBA简介 VBA的文件操作二)

一、从电脑管家理解文件操作

文件管家模型

  • 文件柜(Folder) → 文件夹与子文件夹
  • 文件袋(File) → 各类文档
  • 标签机(FileSystemObject) → 核心操作对象
  • 操作手册 → VBA代码指令集

在VBA(Visual Basic for Applications)中,使用文件系统对象(FSO, FileSystemObject)是处理文件和文件夹的标准方式。无论是创建文件夹还是文件,使用FSO对象都是一个常见的做法,因为它提供了丰富的属性和方法来实现这些操作。

创建文件夹

要使用FSO创建文件夹,你需要首先创建一个FileSystemObject的实例,然后使用该实例的CreateFolder方法。

创建文件

创建文件(此处的文件是指文件文件.Txt)同样需要FileSystemObject,但使用CreateTextFile方法。

注意事项

  1. 引用FileSystemObject:在使用FSO之前,确保你的VBA项目已经引用了Microsoft Scripting Runtime库。在VBA编辑器中,可以通过“工具”->“引用”来添加。
  2. 路径和权限:确保你有权限在指定的路径上创建文件夹或文件。如果路径不存在,FSO将自动创建必要的上级目录。
  3. 错误处理:在实际应用中,考虑到各种可能的错误(如权限问题、路径无效等),建议添加适当的错误处理机制,例如使用On Error GoTo语句。

以下是关于文件的一些操作。

为什么需要分开讲解?

分类

核心对象

典型操作

特点

文件夹操作

Folder对象

创建、删除、遍历子文件夹和文件

处理层级结构、批量操作

文件操作

File对象

读写内容、复制移动、属性修改

处理单个实体、内容操作


二、启用文件管家(FSO对象)

1 召唤文件管家

' 方法1:工具→引用→勾选 "Microsoft Scripting Runtime"
' 方法2:后期绑定(推荐)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

2 获取常用对象

2.1 File对象属性详解

File对象提供了丰富的属性来获取文件信息,以下是所有属性的详细说明,需先创建 File 对象(需引用 Microsoft Scripting Runtime 或使用后期绑定):

Dim fso As Object, file As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.GetFile("C:\test.txt")  ' 获取文件对象

2.1.1. Attributes

  • 作用:获取或设置文件属性(只读/隐藏/系统文件等)
  • 语法:file.Attributes = [value]
  • 常用属性值
ReadOnly    = 1    ' 只读
Hidden      = 2    ' 隐藏
System      = 4    ' 系统文件
Archive     = 32   ' 存档
Alias       = 1024 ' 快捷方式
Compressed  = 2048 ' 压缩文件

示例

' 设置只读+隐藏属性
file.Attributes = ReadOnly Or Hidden

' 检查是否为隐藏文件
If (file.Attributes And Hidden) = Hidden Then
    MsgBox "文件是隐藏的"
End If

2.1.2. DateCreated

  • 作用:获取文件创建时间
  • 语法:file.DateCreated
  • 示例
  • vba
  • Debug.Print "创建时间:" & file.DateCreated

2.1.3. DateLastAccessed

  • 作用:获取文件最后访问时间
  • 语法:file.DateLastAccessed

2.1.4. DateLastModified

  • 作用:获取文件最后修改时间
  • 语法:file.DateLastModified

2.1.5. Drive

  • 作用:获取文件所在驱动器(返回Drive对象)
  • 语法:file.Drive
  • 示例
Debug.Print "驱动器:" & file.Drive.DriveLetter ' 输出:C

2.1.6. Name

  • 作用:获取或设置文件名(包含扩展名)
  • 语法:file.Name = "new_name.txt"

2.1.7. ParentFolder

  • 作用:获取文件所在文件夹对象(返回Folder对象)
  • 语法:file.ParentFolder
  • 示例
Debug.Print "父文件夹:" & file.ParentFolder.Path

2.1.8. Path

  • 作用:获取文件的完整路径
  • 语法:file.Path
  • 示例
Debug.Print "路径:" & file.Path ' 输出:C:\test.txt

2.1.9. ShortName

  • 作用:获取文件的短名称(8.3格式,适用于长文件名)
  • 语法:file.ShortName
  • 示例
Debug.Print "短名称:" & file.ShortName  ' 输出:TEST~1.TXT

2.1.10. ShortPath

  • 作用:获取文件的短路径(8.3格式)
  • 语法:file.ShortPath

2.1.11. Size

  • 作用:获取文件大小(单位:字节)
  • 语法:file.Size
  • 示例
Debug.Print "大小:" & file.Size & " 字节"

2.1.12. Type

  • 作用:获取文件类型描述(由系统注册的类型)
  • 语法:file.Type
  • 示例
Debug.Print "类型:" & file.Type  ' 输出:文本文档

完整代码示例:遍历文件属性

Sub ShowFileProperties()
    Dim fso As Object, file As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If fso.FileExists("C:\test.txt") Then
        Set file = fso.GetFile("C:\test.txt")
        
        Debug.Print "文件名: " & file.Name
        Debug.Print "路径: " & file.Path
        Debug.Print "创建时间: " & file.DateCreated
        Debug.Print "修改时间: " & file.DateLastModified
        Debug.Print "大小: " & file.Size & " bytes"
        Debug.Print "类型: " & file.Type
    Else
        MsgBox "文件不存在!"
    End If
End Sub

2.2 File对象方法详解

File对象提供以下方法进行文件操作:

2.2.1. CopyFile方法

  • 作用:复制文件到新路径
  • 语法
fso.CopyFile Source, Destination [, Overwrite]  
  • 参数
  • Source:支持通配符(如 *.txt)。
  • Destination:目标路径(若为文件夹需以 \ 结尾)。
  • Overwrite(可选):是否覆盖(默认 True)。
' 复制文件(覆盖现有文件)
fso.CopyFile "C:\Source\File.txt", "D:\Destination\File.txt"

' 不覆盖现有文件
fso.CopyFile "C:\Source\File.txt", "D:\Destination\File.txt", False

2.2.2. DeleteFile

  • 作用:删除文件
  • 语法
fso.DeleteFile FilePath [, Force]  
  • 参数
  • FilePath:支持通配符。
  • Force(可选):是否强制删除只读文件(默认 False)。
' 删除文件
fso.DeleteFile "C:\Test\File.txt"

' 强制删除(忽略只读属性)
fso.DeleteFile "C:\Test\File.txt", True

2.2.3. MoveFile方法

  • 作用:移动文件到新路径(等价于剪切)
  • 语法
fso.MoveFile Source, Destination  
  • 参数
  • Source:支持通配符。
  • Destination:目标路径(跨驱动器需确保权限)。
  • 示例
fso.MoveFile "C:\old\report.doc", "D:\archives\"

2.2.4. OpenAsTextStream(IOMode, Format)

  • 作用:以文本流方式打开文件(返回TextStream对象)
  • 参数

IOMode:打开模式(默认ForReading,可选)

ForReading = 1 ' 只读 
ForWriting = 2 ' 写入(覆盖) 
ForAppending = 8 ' 追加

Format:文件格式(默认TristateUseDefault,可选)

TristateUseDefault = -2  ' 系统默认编码
TristateTrue       = -1  ' Unicode
TristateFalse      = 0   ' ASCII

示例

Dim ts As Object
Set ts = file.OpenAsTextStream(ForAppending, TristateFalse)
ts.WriteLine "追加内容"
ts.Close

2.2.5. GetFile 方法

  • 作用:获取指定路径的文件对象(File 对象)。
  • 语法:Set fileObj = fso.GetFile(filePath)
  • 示例
Dim file As Object
Set file = fso.GetFile("C:\MyDocs\report.docx")

Debug.Print "文件名:" & file.Name
Debug.Print "修改时间:" & file.DateLastModified

2.2.6 GetFileName

  • 作用:从完整路径中提取文件名(含扩展名)。
  • 示例
Debug.Print fso.GetFileName("C:\A\B\image.jpg")        ' 输出:image.jpg

2.2.7 GetBaseName

  • 作用:从完整路径中提取文件名(不含扩展名)。
  • 示例
Debug.Print fso.GetBaseName("C:\A\B\image.jpg") ' 输出:image

2.2.8 GetExtensionName

  • 作用:提取文件扩展名(不含点号)。
  • 示例
Debug.Print fso.GetExtensionName("C:\A\B\image.jpg") ' 输出:jpg

2.2.9 CreateTextFile 方法

本次只讲file对象,所以只能创建文本文件,创建Excel等需要其他对象,如Workbook等。

语法

Set file = fso.CreateTextFile(FilePath [, Overwrite [, Unicode]])  

参数

  • FilePath:文件路径。
  • Overwrite(可选):是否覆盖(默认 True)。
  • Unicode(可选):是否使用 Unicode(默认 False,即 ASCII)。
Dim fso As Object, file As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.CreateTextFile("C:\log.txt", True, True)
file.WriteLine "UTF-16 编码内容"
file.Close

2.2.10.OpenTextFile 方法

  • 用途:打开文件用于读写。
    语法
Set ts = fso.OpenTextFile(FilePath [, IOMode [, Create [, Format]]])  
  • 参数
  • FilePath:文件路径。
  • IOMode(可选):ForReading (1)、ForWriting (2)、ForAppending (8)。
  • Create(可选):文件不存在时是否创建(默认 False)。
  • Format(可选):编码格式(TristateTrue 为 Unicode,TristateFalse 为 ASCII)。

示例

Set ts = fso.OpenTextFile("C:\data.txt", ForAppending, True, TristateTrue)
ts.Write "追加内容"
ts.Close

2.2.11.File 对象的 Copy/Delete/Move 方法

  • 用途:直接操作 File 对象。
    语法
file.Copy Destination [, Overwrite]  
file.Delete [Force]  
file.Move Destination  
  • 参数
  • Destination:目标路径。
  • Overwrite:是否覆盖(默认 True)。
  • Force:是否强制删除只读文件(默认 False)。

示例

Dim file As Object
Set file = fso.GetFile("C:\test.txt")
file.Copy "D:\backup\test.txt", False  ' 不覆盖
file.Delete True  ' 强制删除

三、文件内容读写

3.1.写入文本文件

' 方法1:使用 FSO 的 TextStream
Dim ts As Object
Set ts = fso.CreateTextFile("C:\Test\File.txt", True)  ' True 覆盖
ts.WriteLine "第一行内容"
ts.Write "追加内容(无换行)"
ts.Close

' 方法2:追加内容到已有文件
Set ts = fso.OpenTextFile("C:\Test\File.txt", 8)  ' 8=追加模式
ts.WriteLine "新的一行"
ts.Close

3.2.读取文本文件

Dim content As String
Set ts = fso.OpenTextFile("C:\Test\File.txt", 1)  ' 1=只读模式

' 逐行读取
Do While Not ts.AtEndOfStream
    Debug.Print ts.ReadLine
Loop

' 读取全部内容
content = ts.ReadAll
ts.Close

3.3.传统方法读写文件(无需 FSO)

' 写入文件
Open "C:\Test\File.txt" For Output As #1
Print #1, "Hello World"
Close #1

' 追加内容
Open "C:\Test\File.txt" For Append As #1
Print #1, "New Line"
Close #1

' 读取文件
Dim line As String
Open "C:\Test\File.txt" For Input As #1
Do While Not EOF(1)
    Line Input #1, line
    Debug.Print line
Loop
Close #1

四、高级文件操作

4.1.处理二进制文件

' 读取二进制文件到字节数组
Dim byteData() As Byte
Open "C:\Test\Image.jpg" For Binary As #1
ReDim byteData(LOF(1) - 1)
Get #1, , byteData
Close #1

' 写入字节数组到文件
Open "C:\Test\Copy.jpg" For Binary As #1
Put #1, , byteData
Close #1

3.2.文件加密与解密

  • 需依赖 Windows 加密文件系统(EFS)或第三方库:
' 调用命令行加密(需管理员权限)
Shell "cipher /e C:\Test\Secret.txt"

3.3.文件属性管理

' 设置文件为隐藏+只读
SetAttr "C:\Test\File.txt", vbHidden + vbReadOnly

' 检查是否存档文件
If (GetAttr("C:\Test\File.txt") And vbArchive) = vbArchive Then
    MsgBox "文件已标记为存档"
End If

五、实战案例

5.1.导出 Excel 数据到文本文件

Sub ExportToText()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Data")
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    
    Open "C:\Export.txt" For Output As #1
    For i = 1 To lastRow
        Print #1, ws.Cells(i, 1).Value & "," & ws.Cells(i, 2).Value
    Next i
    Close #1
End Sub

5.2.从 CSV 导入数据到 Excel

Sub ImportCSV()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Imported Data")
    ws.Cells.Clear
    
    Dim line As String, data() As String
    Open "C:\Data.csv" For Input As #1
    Dim rowNum As Long: rowNum = 1
    Do While Not EOF(1)
        Line Input #1, line
        data = Split(line, ",")
        ws.Cells(rowNum, 1).Resize(1, UBound(data) + 1) = data
        rowNum = rowNum + 1
    Loop
    Close #1
End Sub

5.3.批量重命名文件

Sub 统一命名()
    Dim 文件夹 As Object
    Set 文件夹 = 管家.GetFolder("D:\原始图片")
    
    Dim i As Integer: i = 1
    For Each 文件 In 文件夹.Files
        If 管家.GetExtensionName(文件) = "jpg" Then
            文件.Name = "产品图_" & Format(i, "000") & ".jpg"
            i = i + 1
        End If
    Next
End Sub

六、错误处理与优化

6.1.错误处理模板

On Error Resume Next
fso.CopyFile "C:\Source.txt", "D:\Destination.txt"
If Err.Number <> 0 Then
    MsgBox "错误 " & Err.Number & ": " & Err.Description
End If
On Error GoTo 0

6.2.高效读取大文件

' 使用 ADODB.Stream 快速读取
Dim stream As Object
Set stream = CreateObject("ADODB.Stream")
stream.Type = 2  ' 文本模式
stream.Charset = "UTF-8"
stream.Open
stream.LoadFromFile "C:\LargeFile.txt"
content = stream.ReadText
stream.Close

注意事项

  • 文件存在性检查:操作前务必用 fso.FileExists 检查文件是否存在,否则会触发错误。
  • 日期格式:日期属性返回的是本地时间格式,可用 Format 函数格式化:
Debug.Print Format(file.DateCreated, "yyyy-mm-dd hh:mm:ss")
  • 属性修改:通过 .Attributes 可修改文件属性(如设置为只读):
file.Attributes = file.Attributes Or 1 ' 添加只读属性
  • 路径分隔符:路径中的反斜杠 \ 需用双反斜杠 \\ 或单斜杠 / 表示。
  • 如CopyFile/DeleteFile等直接使用 FileSystemObject 的方法(无需 GetFile)可以直接通过 FileSystemObject 的全局方法操作文件,无需先获取 File 对象。这是最简洁的方式,适合一次性操作。
  • 如果需要对文件进行多次操作(如先读取属性再复制),或需要更精细的控制(如覆盖选项),则需先通过 GetFile 获取 File 对象。如Copy、Delete等方法。

七、特殊场景处理

7.1.处理网络文件

' 访问网络共享文件
If fso.FileExists("\\Server\Shared\File.txt") Then
    fso.CopyFile "\\Server\Shared\File.txt", "C:\LocalCopy.txt"
End If

7.2.临时文件管理

' 创建临时文件
Dim tempFile As String
tempFile = fso.GetSpecialFolder(2) & "\Temp_" & Format(Now, "yyyymmddhhnnss") & ".txt"
fso.CreateTextFile(tempFile).Close

7.3.文件监控(伪代码)

' 使用 Timer 事件定期检查文件变化
Private Sub CheckFileChange()
    Static lastModTime As Date
    If fso.FileExists("C:\Log.txt") Then
        If fso.GetFile("C:\Log.txt").DateLastModified > lastModTime Then
            lastModTime = fso.GetFile("C:\Log.txt").DateLastModified
            MsgBox "文件已更新!"
        End If
    End If
End Sub

八、总结

操作类型

推荐方法

适用场景

基础文件操作

FSO (CopyFile, DeleteFile)

复制、删除、移动文件

内容读写

TextStream 或 ADODB.Stream

文本文件处理

二进制处理

Open For Binary

图片、视频等非文本文件

Excel 集成

Print # 和 Line Input #

数据导入导出

高级需求

Windows API 或第三方库

加密、监控、网络文件

方法对比与选择建议

场景

直接使用 fso 方法

通过 File 对象方法

批量操作(如删除所有 .tmp)

(支持通配符)

需要读取文件属性后操作

(如根据文件大小决定操作)

单文件操作

(代码更直观)

强制覆盖目标文件

(通过参数控制)

(通过参数控制)

应用场景

  • 日志分析:获取文件的修改时间判断是否需要备份。
  • 文件管理工具:显示文件的详细信息(如大小、类型)。
  • 自动化脚本:根据属性过滤文件(如处理所有隐藏文件)。

掌握这些方法后,可实现自动化文件管理、日志分析、数据交换等功能。建议优先使用 FileSystemObject 提高代码可读性,复杂场景结合 API 或专用库扩展功能。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言