Excel宏加载数组

时间:2012-01-04 12:07:35

标签: excel-vba vba excel

我不确定如何说出问题,但我遇到了一个问题,我需要将一组表格中的名称列表加载到单独的数组中。

例如,Sheet 1Column A有10个名称要加载到array1Sheet 2Column A有14个名称要加载到{{} 1}}。

我知道这可以硬编码到一个宏来加载它们,但名称列表不是一个固定的长度而且很多代码我不知道是否可以缩短它。

我的想法告诉我这样做的方式如下。

array2

有问题的实际工作表有10个单独的工作表,从1区到10区读取名称。因此将有10个单独的tarray。这样做是为了报告目的,并将在表格中来回传递。

但是Dim tarray1 As Variant Dim tarray2 As Variant Dim tarray3 As Variant For f = 1 To 3 Sheets("Region " & f).Select With ActiveSheet lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row tarray& f = ActiveSheet.Range("A2:A" & lastrow) End With Next 显然无效并且会引发编译错误。

有人可以想办法解决这个问题吗?

希望有人可以提供帮助。

2 个答案:

答案 0 :(得分:5)

以下例程向您展示了如何使用我认为是您需要的技术的锯齿状变体数组。

我已经将工作表的前十行中的不同数量的单元格加载到TArray。我使用Debug.Print来展示如何访问元素。

Sub Test()

  Dim InxCol As Integer
  Dim InxRow As Integer
  Dim InxTA As Integer
  Dim TArray() As Variant

  ReDim TArray(1 To 10)

  With Sheets("xxxxx")

  For InxTA = 1 To 10
    ' There must be at least two cells in each range if the result is to be an
    ' array.  The access code relies on TArray being a true array of arrays.
    ' If this is not possible, you can test for TArray(N) being an array
    ' or a variable using VarType
    TArray(InxTA) = .Range(.Cells(InxTA, 1), .Cells(InxTA, 12 - InxTA)).Value
  Next

  End With

  For InxTA = 1 To 10
    For InxRow = LBound(TArray(InxTA), 1) To UBound(TArray(InxTA), 1)
      For InxCol = LBound(TArray(InxTA), 2) To UBound(TArray(InxTA), 2)
        Debug.Print TArray(InxTA)(InxRow, InxCol) & " ";
      Next
    Next
    Debug.Print
  Next

End Sub

新资料

我决定添加一个解释,以便我的答案完整。

您可以将变体设置为任何内容,然后将其设置为其他内容。以下可能是愚蠢的但它有效:

Dim V As Variant

V = 5
Debug.Print V
V = "Today"
Debug.Print V
V = Array(1, 2, 3)
Debug.Print V(0) & " " & V(1) & " " & V(2)

考虑:Range( xxx ).Value

如果xxx是单个单元格,则返回单个变量。在所有其他情况下,它返回一个二维数组。第一个维度用于行,第二个维度用于列。这与正常做法相反,但它与Cells(R, C).Value匹配。

我已声明:

Dim TArray() As Variant
Redim TArray(1 to 10)

所以TArray是一系列变种

然后我设置TArray(N) = Range( xxx ).Value

如果xxx是单个单元格,则TArray(N)将是单个值。

但如果xxx是两个或更多个单元格,则TArray(N)是二维数组。要访问TArray中的单个单元格,我必须指定TArray的元素,然后指定范围的行和列。因此:

TArray(Element)(Row, Column)

TArray的每个元素可以与每个其他元素具有不同的大小。一个可以是单个变量,另一个可以是单行范围,另一个是单个列范围,另一个可以是矩形。

一开始很难理解这一点。不 - 删除"起初"。玩这个功能。做我做的,从你的一个工作表中加载行,列和矩形。

答案 1 :(得分:2)

所有归功于@Tony Dallimore的Array or Array的想法。这只是作为他答案的补充。

要将所有工作表数据加载到数组中,请使用

Dim TArray() as Variant
Dim sh as Worksheet

ReDim TArray(1 To ActiveWorkbook.Worksheets.Count)

For each sh in ActiveWorkbook.Worksheets
    TArray(sh.Index) = sh.UsedRange ' or to get just Column A: sh.UsedRange.Columns(1)
Next

或者加载名称与模式匹配的工作表子集

i = 1
For each sh in ActiveWorkbook.Worksheets
    If sh.Name Like "Region *" Then
         TArray(i) = sh.UsedRange ' or to get just Column A: sh.UsedRange.Columns(1)
         i = i + 1
    End If
Next

再次感谢Tony:如果OP倾向于接受这一点,请接受Tony的回答