将 CSV 文件一个一个加载到 Excel VBA Userform
Load CSV files one by one into Excel VBA Userform
我正在尝试从文件夹加载一些 csv 文件以在用户表单中显示其内容,目前我的代码如下所示:
Private Sub btnGetData_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Dim iIndex As Integer
Dim ws As Excel.Worksheet
Dim wb As Workbook
Dim strPath As String
Dim strFile As String
' Find .csv files in folder
strPath = "C:\mycsvfiles\"
strFile = Dir(strPath & "*.csv")
Do While strFile <> ""
Set wb = Workbooks.Open(FileName:=strPath & strFile, Local:=True)
For iIndex = 1 To wb.Worksheets.Count
Set ws = wb.Worksheets(iIndex)
' Populate UserForm
Me.textbox1.value = Trim(wb.Worksheets(1).Range("A2").value)
Me.textbox2.value = Trim(wb.Worksheets(1).Range("A4").value)
Me.textbox3.value = Trim(wb.Worksheets(1).Range("A6").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A8").value)
Me.textbox5.value = Trim(wb.Worksheets(1).Range("A9").value)
Me.textbox6.value = Trim(wb.Worksheets(1).Range("A11").value) & ", " & Trim(wb.Worksheets(1).Range("A12").value)
' Close csv file
Workbooks(strFile).Close SaveChanges:=False
Next iIndex
strFile = Dir 'This moves the value of strFile to the next file.
Loop
End Sub
因此,当单击“btnGetData”按钮时,会找到所有 CSV 文件。当循环结束时,用户窗体中的字段将填充找到的最后一个文件。
我需要的是在与上一个和下一个文件按钮交互时一个一个地加载文件,如下所示:
Private Sub btn_NEXT_Click()
' Read content of next csv file found
End Sub
Private Sub btn_PREV_Click()
' Read content of previous csv file found
End Sub
如有任何帮助,我们将不胜感激。
编辑:
根据 Brian M Stafford 的回复,我 post 提出了解决我的问题的代码,希望它能对其他人有所帮助。
Private Sub btnGetData_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
' Create collection of files
Dim f As String
Dim wb As Workbook
f = Dir("C:\somefolder\*.csv")
Set MyFiles = New Collection
Do While f <> ""
MyFiles.Add "C:\somefolder\" & f
f = Dir
Loop
' Set Index
CurrentIndex = 1
' Open Workbook
Set wb = Workbooks.Open(FileName:=MyFiles(CurrentIndex), Local:=True)
' Populate UserForm
Me.textbox1.value = Trim(wb.Worksheets(1).Range("A2").value)
Me.textbox2 = Trim(wb.Worksheets(1).Range("A4").value)
Me.textbox3.value = Trim(wb.Worksheets(1).Range("A6").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A8").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A9").value)
' Close Workbook
wb.Close SaveChanges:=False
End Sub
Private Sub btn_NEXT_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
' Set Index
CurrentIndex = CurrentIndex + 1
If CurrentIndex > MyFiles.Count Then CurrentIndex = MyFiles.Count
' Open Workbook
Set wb = Workbooks.Open(FileName:=MyFiles(CurrentIndex), Local:=True)
' Populate UserForm
Me.textbox1.value = Trim(wb.Worksheets(1).Range("A2").value)
Me.textbox2 = Trim(wb.Worksheets(1).Range("A4").value)
Me.textbox3.value = Trim(wb.Worksheets(1).Range("A6").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A8").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A9").value)
' Close Workbook
wb.Close SaveChanges:=False
End Sub
Private Sub btn_PREV_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
' Set Index
CurrentIndex = CurrentIndex - 1
If CurrentIndex < 1 Then CurrentIndex = 1
' Open Workbook
Set wb = Workbooks.Open(FileName:=MyFiles(CurrentIndex), Local:=True)
' Populate UserForm
Me.textbox1.value = Trim(wb.Worksheets(1).Range("A2").value)
Me.textbox2 = Trim(wb.Worksheets(1).Range("A4").value)
Me.textbox3.value = Trim(wb.Worksheets(1).Range("A6").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A8").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A9").value)
' Close Workbook
wb.Close SaveChanges:=False
End Sub
挑战在于维护文件夹中文件的索引。 Dir
和 FileSystemObject
都不允许您通过索引访问文件。实现此目的的一种方法是将文件放入允许按索引访问的集合中。我剥离了代码来说明这个想法:
Option Explicit
Private MyFiles As Collection
Private CurrentIndex As Integer
Private Sub btnGetData_Click()
Dim f As String
f = Dir("c:\temp\csv\*.csv")
Set MyFiles = New Collection
Do While f <> ""
MyFiles.Add "c:\temp\csv\" & f
f = Dir
Loop
CurrentIndex = 1
Label1.Caption = MyFiles(CurrentIndex)
End Sub
Private Sub btnNext_Click()
CurrentIndex = CurrentIndex + 1
If CurrentIndex > MyFiles.Count Then CurrentIndex = MyFiles.Count
Label1.Caption = MyFiles(CurrentIndex)
End Sub
Private Sub btnPrevious_Click()
CurrentIndex = CurrentIndex - 1
If CurrentIndex < 1 Then CurrentIndex = 1
Label1.Caption = MyFiles(CurrentIndex)
End Sub
我正在尝试从文件夹加载一些 csv 文件以在用户表单中显示其内容,目前我的代码如下所示:
Private Sub btnGetData_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Dim iIndex As Integer
Dim ws As Excel.Worksheet
Dim wb As Workbook
Dim strPath As String
Dim strFile As String
' Find .csv files in folder
strPath = "C:\mycsvfiles\"
strFile = Dir(strPath & "*.csv")
Do While strFile <> ""
Set wb = Workbooks.Open(FileName:=strPath & strFile, Local:=True)
For iIndex = 1 To wb.Worksheets.Count
Set ws = wb.Worksheets(iIndex)
' Populate UserForm
Me.textbox1.value = Trim(wb.Worksheets(1).Range("A2").value)
Me.textbox2.value = Trim(wb.Worksheets(1).Range("A4").value)
Me.textbox3.value = Trim(wb.Worksheets(1).Range("A6").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A8").value)
Me.textbox5.value = Trim(wb.Worksheets(1).Range("A9").value)
Me.textbox6.value = Trim(wb.Worksheets(1).Range("A11").value) & ", " & Trim(wb.Worksheets(1).Range("A12").value)
' Close csv file
Workbooks(strFile).Close SaveChanges:=False
Next iIndex
strFile = Dir 'This moves the value of strFile to the next file.
Loop
End Sub
因此,当单击“btnGetData”按钮时,会找到所有 CSV 文件。当循环结束时,用户窗体中的字段将填充找到的最后一个文件。
我需要的是在与上一个和下一个文件按钮交互时一个一个地加载文件,如下所示:
Private Sub btn_NEXT_Click()
' Read content of next csv file found
End Sub
Private Sub btn_PREV_Click()
' Read content of previous csv file found
End Sub
如有任何帮助,我们将不胜感激。
编辑:
根据 Brian M Stafford 的回复,我 post 提出了解决我的问题的代码,希望它能对其他人有所帮助。
Private Sub btnGetData_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
' Create collection of files
Dim f As String
Dim wb As Workbook
f = Dir("C:\somefolder\*.csv")
Set MyFiles = New Collection
Do While f <> ""
MyFiles.Add "C:\somefolder\" & f
f = Dir
Loop
' Set Index
CurrentIndex = 1
' Open Workbook
Set wb = Workbooks.Open(FileName:=MyFiles(CurrentIndex), Local:=True)
' Populate UserForm
Me.textbox1.value = Trim(wb.Worksheets(1).Range("A2").value)
Me.textbox2 = Trim(wb.Worksheets(1).Range("A4").value)
Me.textbox3.value = Trim(wb.Worksheets(1).Range("A6").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A8").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A9").value)
' Close Workbook
wb.Close SaveChanges:=False
End Sub
Private Sub btn_NEXT_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
' Set Index
CurrentIndex = CurrentIndex + 1
If CurrentIndex > MyFiles.Count Then CurrentIndex = MyFiles.Count
' Open Workbook
Set wb = Workbooks.Open(FileName:=MyFiles(CurrentIndex), Local:=True)
' Populate UserForm
Me.textbox1.value = Trim(wb.Worksheets(1).Range("A2").value)
Me.textbox2 = Trim(wb.Worksheets(1).Range("A4").value)
Me.textbox3.value = Trim(wb.Worksheets(1).Range("A6").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A8").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A9").value)
' Close Workbook
wb.Close SaveChanges:=False
End Sub
Private Sub btn_PREV_Click()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
' Set Index
CurrentIndex = CurrentIndex - 1
If CurrentIndex < 1 Then CurrentIndex = 1
' Open Workbook
Set wb = Workbooks.Open(FileName:=MyFiles(CurrentIndex), Local:=True)
' Populate UserForm
Me.textbox1.value = Trim(wb.Worksheets(1).Range("A2").value)
Me.textbox2 = Trim(wb.Worksheets(1).Range("A4").value)
Me.textbox3.value = Trim(wb.Worksheets(1).Range("A6").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A8").value)
Me.textbox4.value = Trim(wb.Worksheets(1).Range("A9").value)
' Close Workbook
wb.Close SaveChanges:=False
End Sub
挑战在于维护文件夹中文件的索引。 Dir
和 FileSystemObject
都不允许您通过索引访问文件。实现此目的的一种方法是将文件放入允许按索引访问的集合中。我剥离了代码来说明这个想法:
Option Explicit
Private MyFiles As Collection
Private CurrentIndex As Integer
Private Sub btnGetData_Click()
Dim f As String
f = Dir("c:\temp\csv\*.csv")
Set MyFiles = New Collection
Do While f <> ""
MyFiles.Add "c:\temp\csv\" & f
f = Dir
Loop
CurrentIndex = 1
Label1.Caption = MyFiles(CurrentIndex)
End Sub
Private Sub btnNext_Click()
CurrentIndex = CurrentIndex + 1
If CurrentIndex > MyFiles.Count Then CurrentIndex = MyFiles.Count
Label1.Caption = MyFiles(CurrentIndex)
End Sub
Private Sub btnPrevious_Click()
CurrentIndex = CurrentIndex - 1
If CurrentIndex < 1 Then CurrentIndex = 1
Label1.Caption = MyFiles(CurrentIndex)
End Sub