将数据从一个工作表传递到多个一维数组中的另一个工作表

时间:2017-01-02 19:09:59

标签: arrays excel vba excel-vba

我想:

  1. 从工作簿中的第一个工作表中获取数据范围,并将这些数据传递到多个一维数组中。

  2. 将这些数组中的值输出到同一工作簿中的第二个工作表中。

  3. 以下是我的问题:

    如果工作表1是活动工作表,则宏只会将数组中的所有值输出到工作表2中。如果工作表2处于活动状态,则没有输出。

    此外,当我输出LBound和UBound来检查数组大小时,它们两者都是1,当它应该是1到40.

    最后,如果我尝试从数组中输出第一个值,我会得到一个"超出范围"错误。

    以下是代码:

    Sub M1_Run()
    
     ' Turns off screen updating and workbook calculations
     'Application.ScreenUpdating = False
     'Application.Calculation = xlCalculationManual
    
     ' Clears any previous values from output sheet
     Worksheets(2).Range("A10:BZ50011").Clear
    
     ' Declares Variables to Use
     Dim rando As Double
     Dim runNum As Integer
    
     With ThisWorkbook.Worksheets(1)
    
        ' Declare an array to hold a variable number of values
        Dim RevExpFV() As Variant
        Dim RevExpBase() As Variant
        Dim RevExpDist() As Variant
        Dim RevExpMin() As Variant
        Dim RevExpMax() As Variant
        Dim RevExpMean() As Variant
        Dim RevExpSD() As Variant
    
        ' Read values into arrays
        RevExpFV = Range("AG3:BT3")
        RevExpBase = Range("AG5:BT5")
        RevExpDist = Range("AG6:BT6")
        RevExpMin = Range("AG8:BT8")
        RevExpMax = Range("AG9:BT9")
        RevExpMean = Range("AG11:BT11")
        RevExpSD = Range("AG12:BT12")
    
        ' Test Output
        'Range("AF21:BS21") = RevExpDist
    
     End With
    
     ' Test Outputs
     ' Worksheets(1).Range("AF20:BS20") = RevExpDist
     Worksheets(2).Range("A10:AN10") = RevExpDist
     Worksheets(2).Range("A11") = LBound(RevExpDist)
     Worksheets(2).Range("B11") = UBound(RevExpDist)
    
     ' Script out of range error
     'Worksheets(2).Range("A12") = RevExpDist(1)
    
    End Sub
    

    我很感激任何想法。

2 个答案:

答案 0 :(得分:1)

比如说:

Dim RevExpFV() As Variant
RevExpFV = Range("AG3:BT3")

您正在使用1行x 40列范围填充Variant数组。因此,数组的大小为1 To 1, 1 To 40

如果你想让数组成为一维的,你需要使用Transpose函数(两次):

RevExpFV = Application.Transpose(Application.Transpose(Range("AG3:BT3")))

这将创建一个大小为1 To 40的一维数组。

代码仅在Worksheets(1)处于活动状态时有效的原因是Range对象默认引用活动工作表。所以声明如

 RevExpFV = Range("AG3:BT3")

表示在活动工作表上使用RevExpFV的{​​{1}}(默认属性)填充数组Value

您应始终(除非知道您要使用活动表格)指定在使用RangeRange,{{1}时引用的工作表等等,例如

Cells

由于该段代码位于Rows块内,因此该行可简化为

 RevExpFV = ThisWorkbook.Worksheets(1).Range("AG3:BT3")

(请注意,With语句纯粹是一种编码快捷方式 - 它不会神奇地使所提到的对象“活跃” - 它只是允许您在 RevExpFV = .Range("AG3:BT3") 块内键入{{ 1}}代替With

根据聊天中的反馈,似乎并不常见的是,从存储在列中的数据中获取一维数组的简单方法是对数据进行转置,例如

With object

要从存储在一行中的数据中获取一维数组(如本问题所示),您可以对数据进行两次转置,例如:

.

虽然这种行为看起来很“怪异”,但Excel本身似乎很奇怪。

答案 1 :(得分:0)

对于给定的二维范围,例如使用Range()方法得出的范围...

Lbound(范围,1)给出行的下限,Lbound(范围,2)给出列的下限。 Ubound(范围,1)给出行的上限,Ubound(范围,2)给出列的上限。 Lbound(范围)默认为Lbound(范围,1)。