【问题标题】:Add worksheets to array by VBA通过 VBA 将工作表添加到数组
【发布时间】:2021-08-08 16:40:04
【问题描述】:

我在 VBA 上练习了一个月,但遇到了一些问题。我想通过此循环从工作表中的数据创建数组,但它不起作用。我有 6 个工作表,但它只能将一个工作表放入数组中。我认为这个循环中的问题是 DataArray 但我无法解决。

Sub LoopByArray()

    Dim ws As Worksheet
    Dim LastRow As Long
    Dim LastCol As Long
    Dim DataArray() As Variant
    Dim Sheetnum As String
    Dim SheetNames()
    Dim i As Long

    SheetCount = ActiveWorkbook.Sheets.Count
    ReDim SheetNames(1 To SheetCount)

    For i = 1 To SheetCount
        SheetNames(i) = ActiveWorkbook.Sheets(i).Name
        Debug.Print SheetNames(i) 
        Sheetnum = i
        Set ws = worksheets(SheetNames(i))
        LastRow = ThisWorkbook.Sheets(SheetNames(i)).Range("A" & Rows.Count).End(xlUp).Row

        Debug.Print LastRow

        LastCol = ThisWorkbook.Sheets(SheetNames(i)).Cells(1, ThisWorkbook.Sheets(SheetNames(i)).Columns.Count).End(xlToLeft).Column

        Debug.Print LastCol

        ColLetter = GetColumnLetter(LastCol)
        DataArray = ThisWorkbook.Sheets(SheetNames(i)).Range("A1" & ":" & ColLetter & LastRow).Value

    Next i

End Sub

Function GetColumnLetter(colNum As Long) As String
    
    Dim vArr
    vArr = Split(Cells(1, colNum).Address(True, False), "$")
    GetColumnLetter = vArr(0)

End Function

【问题讨论】:

  • 您想要一个包含所有工作表数据的数组吗?如果(例如)不同的工作表有不同的行数或列数,应该如何安排?
  • 我想我应该创建更多数组来获取另一个工作表,但我不知道如何将它们添加到这个循环中。
  • 是否可以创建循环或其他函数来根据 VBA 中的工作表数定义数组变量?
  • 你打算用数组做什么?
  • 我尝试获取数据并在数组中使用 vlookup,因为我认为它会比在工作表中更快。

标签: arrays excel vba loops


【解决方案1】:

这里有几种可能的合作方式

Public Sub Shts2Arrays()
  Dim ShtAR1() As Variant, ShtAR2() As Variant, ShtAR3() As Variant
  Dim i As Integer, J As Integer
  
  ShtAR1 = Sheets(1).UsedRange.Value
  ShtAR2 = Sheets(2).UsedRange.Value
  ShtAR3 = Sheets(3).UsedRange.Value
  
  For i = LBound(ShtAR1) To UBound(ShtAR1)
     For J = 1 To Sheets(1).UsedRange.Columns.Count
        Debug.Print i, J, ShtAR1(i, J)
     Next J
  Next i
  
  For i = LBound(ShtAR2) To UBound(ShtAR2)
     For J = 1 To Sheets(2).UsedRange.Columns.Count
        Debug.Print i, J, ShtAR2(i, J)
     Next J
  Next i
  
  For i = LBound(ShtAR3) To UBound(ShtAR3)
     For J = 1 To Sheets(3).UsedRange.Columns.Count
        Debug.Print i, J, ShtAR3(i, J)
     Next J
  Next i
  
End Sub

以下数组使用 Application.Transpose 进行转置,否则相同

Public Sub TransposeShts2Arrays()
  Dim ShtAR1() As Variant, ShtAR2() As Variant, ShtAR3() As Variant
  Dim i As Integer, J As Integer
  
  ShtAR1 = Application.Transpose(Sheets(1).UsedRange.Value)
  ShtAR2 = Application.Transpose(Sheets(2).UsedRange.Value)
  ShtAR3 = Application.Transpose(Sheets(3).UsedRange.Value)
  
  For i = LBound(ShtAR1) To UBound(ShtAR1)
     For J = 1 To Sheets(1).UsedRange.Columns.Count
        Debug.Print i, J, ShtAR1(i, J)
     Next J
  Next i
  
  For i = LBound(ShtAR2) To UBound(ShtAR2)
     For J = 1 To Sheets(2).UsedRange.Columns.Count
        Debug.Print i, J, ShtAR2(i, J)
     Next J
  Next i
  
  For i = LBound(ShtAR3) To UBound(ShtAR3)
     For J = 1 To Sheets(3).UsedRange.Columns.Count
        Debug.Print i, J, ShtAR3(i, J)
     Next J
  Next i
  
End Sub

【讨论】:

    【解决方案2】:

    您可以将 dataArray() 设为一维数组。

    Option Explicit
    
    Sub FillArrays()
        
        Dim dataArray(), wb As Workbook, ws As Worksheet
       
        Set wb = ThisWorkbook
        ReDim dataArray(wb.Sheets.Count)
    
        For Each ws In wb.Sheets
            dataArray(ws.Index) = ws.UsedRange.Value
        Next
        Debug.Print dataArray(3)(1, 1) 'Sheets(3).Cells(1, 1)
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多