【问题标题】:Excel Macro loading ArraysExcel 宏加载数组
【发布时间】:2012-02-02 08:09:55
【问题描述】:

我不知道如何表达这个问题,但我遇到了一个问题,我需要将一组工作表中的名称列表加载到单独的数组中。

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

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

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

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

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

但是tarray & f 显然是无效的并且会抛出编译错误。

任何人都可以想办法解决这个问题吗?

希望有人能提供帮助。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

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

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

    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
    

    再次感谢托尼:如果 OP 愿意接受这一点,请改为接受托尼的回答

    【讨论】:

    • 对我的回答有用。我的正常做法是用解释来超载 OP。我想这是我第一次说:“这是一种技术。随你使用。”
    【解决方案2】:

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

    我已将工作表前十行中不同数量的单元格加载到 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 的每个元素都可以具有与其他元素不同的大小。一个可以是单个变量,另一个可以是单个行范围,另一个可以是单个列范围,还有一个是矩形。

    一开始很难理解。否 - 删除“起初”。玩这个功能。做我所做的并从您的一个工作表中加载行、列和矩形。

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多