将 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

挑战在于维护文件夹中文件的索引。 DirFileSystemObject 都不允许您通过索引访问文件。实现此目的的一种方法是将文件放入允许按索引访问的集合中。我剥离了代码来说明这个想法:

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