【问题标题】:Load a variable range into an array将变量范围加载到数组中
【发布时间】:2023-01-26 20:27:18
【问题描述】:

我想在一维数组中存储一系列可变大小。范围从 A2 开始,一直到同一列的最后一行。我的方法看起来像那样。这是有缺陷的。

Option Explicit

Sub Range_to_Array()

Dim i, j, k As Integer
Dim arr1(), arr2(), arr3(), arr4() As Variant

    With Worksheets("table1")

        arr1() = .Cells(.Range("A2"), .Range("A1").End(xlDown).Row)

    End With

End Sub

【问题讨论】:

  • 范围本质上是一个二维对象 - 单元格和列(即使只有一列)。如果您使用类似arr1() = .Range(.Range("A2"), .Range("A1").End(xlDown)).Value 的东西,那么您将将该范围的内容复制到arr1 - 但如果您在“Watches”窗口中查看数组,您会注意到它是二维的。如果您需要它是 1d,则需要循环遍历每个单元格并将该值写入数组。

标签: excel vba


【解决方案1】:

你的问题是你的 Range-Definition 是错误的。

Cells 期望 2 个参数(行和列)来寻址一个单元格。这不是你想要的,即使你的参数是错误的。

你需要的是Range

现在可以使用一个或两个参数调用Range
如果你用一个参数调用它,这定义了整个范围。
示例:Range("A1")Range("B2:C5")Range("B:B")
VBA中经常使用的是Range("A1:A" & lastRow)之类的东西

如果使用两个参数调用它,则这两个参数定义范围的第一个和最后一个单元格。
示例:Range(Range("A1"), Range("C10"))Range(Cells(1, 1), Cells(10, 3))

我建议定义一个中间变量来保存 Range - 使其更容易调试。最后一个单元格的行号也应该进入一个中间变量。

在您的情况下,您可以使用以下之一

Dim r As Range, lastRow As Long
' Get the last row in use (usually its better to go up from the end of the sheet)
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

' 2 parameters
Set r = .Range(.Cells(2, 1), .Cells(2, lastRow)) 
' 1 Parameter, last row is concatenated to the range definition
Set r = .Range("A2:A" & lastRow)  
' Use Resize 
Set r = .Range("A2").Resize(lastRow-1, 1)   ' -1 because you start at row 2

arr1 = r.Value

【讨论】:

    【解决方案2】:

    试试这个。

    Sub Range_to_Array()
    
    Dim i As Integer, j As Integer, k As Integer
    Dim arr1() As Variant, arr2() As Variant, arr3() As Variant, arr4() As Variant
    Dim myRange As Range
        With Worksheets("table1")
            arr1 = .Range(.Range("A2"), .Range("A1").End(xlDown)).Value
    
        End With
        Debug.Print arr1(1, 1)
    End Sub
    

    另外请注意,为了正确声明变量,您需要分别为每个变量指定数据类型。

    Dim i, j, k As Integer
    

    实际上意味着

    Dim i As Variant, j As Variant, k As Integer
    

    【讨论】:

      【解决方案3】:

      请尝试下一种方法。 Application.Transpose 将二维数组转换为一维类型的列。不需要迭代:

      Sub Array1DFromColumnRange()
       Dim ws As Worksheet, lastR As Long, arr
       
       Set ws = Worksheets("table1")
       lastR = ws.Range("A" & ws.rows.count).End(xlUp).Row
       arr = Application.Transpose(ws.Range("A2:A" & lastR).Value)
          Debug.Print Join(arr, "|") 'just to visually see the result in Immediate Window (Ctrl + G)...
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 2013-01-26
        • 2015-12-25
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多