VBA 宏如何选择文件夹并打开其中的 CSV?
数据小许
结论
在 Import_Global_AB 中调用 ChooseFolder(),将返回的文件夹路径与 Global_AB.csv 拼接成完整路径,再传给 Workbooks.Open。如果用户取消选择,函数会返回空字符串,子程序应随即退出。
原函数中的 strPath 未定义。如果不需要指定初始目录,可以删除 .InitialFileName = strPath。CSV 通常只有一个工作表,使用 Worksheets(1) 可以避免依赖工作表名称。
参考实现
Option Explicit
Function ChooseFolder() As String
Dim fldr As FileDialog
Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
With fldr
.Title = "Select a Folder"
.AllowMultiSelect = False
If .Show = -1 Then
ChooseFolder = .SelectedItems(1)
End If
End With
Set fldr = Nothing
End Function
Sub Import_Global_AB()
Dim folderPath As String
Dim filePath As String
Dim src As Workbook
Dim srcSheet As Worksheet
folderPath = ChooseFolder()
If Len(folderPath) = 0 Then Exit Sub
filePath = folderPath & Application.PathSeparator & "Global_AB.csv"
If Len(Dir(filePath)) = 0 Then
MsgBox "所选文件夹中找不到 Global_AB.csv。", vbExclamation
Exit Sub
End If
On Error GoTo ImportError
Set src = Workbooks.Open(Filename:=filePath, ReadOnly:=True)
Set srcSheet = src.Worksheets(1)
With ThisWorkbook.Worksheets("GLOBAL")
.Range("A2:A101").Value = srcSheet.Range("E2:E101").Value
.Range("B2:B101").Value = srcSheet.Range("C2:C101").Value
.Range("C2:C101").Value = srcSheet.Range("J2:J101").Value
.Range("D2:D101").Value = srcSheet.Range("G2:G101").Value
.Range("E2:E101").Value = srcSheet.Range("D2:D101").Value
End With
src.Close SaveChanges:=False
MsgBox "Import Complete"
Exit Sub
ImportError:
If Not src Is Nothing Then src.Close SaveChanges:=False
MsgBox "导入失败:" & Err.Description, vbExclamation
End Sub
关键点
- 用户确认选择后,
ChooseFolder()返回目录路径;取消对话框时,函数返回空字符串。Len(folderPath) = 0可用于识别取消操作。 Application.PathSeparator会根据当前环境提供路径分隔符,可用于连接文件夹路径和文件名。Dir(filePath)用于检查目标 CSV 是否存在。找不到文件时,代码会提示用户并退出。- 代码通过
.Value将 CSV 中的数据写入GLOBAL工作表。CSV 是文本数据文件;如果源文件是需要保留单元格公式的 Excel 工作簿,可按需改用.Formula,并确认源工作表名称正确。 - 要让对话框从指定目录打开,可以将
.InitialFileName设为已定义的路径,例如.InitialFileName = "C:\\Data\\"。不要引用未声明的strPath。
备注:内容仅供参考。
