【问题标题】:Pass data from one worksheet to another in multiple one-dimensional arrays在多个一维数组中将数据从一个工作表传递到另一个工作表
【发布时间】:2017-05-16 20:57:56
【问题描述】:

我正在尝试:

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

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

这是我的问题:

如果工作表 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

我很欣赏任何想法。

【问题讨论】:

    标签: arrays vba excel


    【解决方案1】:

    以下面的语句为例:

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

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

    如果要使数组成为一维数组,则需要使用转置函数(两次):

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

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


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

    这样的语句
     RevExpFV = Range("AG3:BT3")
    

    表示使用活动工作表上RangeValue(默认属性)填充数组RevExpFV

    您应该始终(除非您知道要使用 Activesheet)在使用 RangeCellsRows 等时指定您所指的工作表,例如

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

    因为那段代码在With 块内,所以该行可以简化为

     RevExpFV = .Range("AG3:BT3")
    

    (请注意,With 语句纯粹是一种编码快捷方式 - 它不会神奇地使提到的对象“活跃” - 它只是允许您在 With object 块中键入 . 而不是 @ 987654342@)


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

     Dim myArray As Variant
     myArray = Application.Transpose(Range("A1:A30").Value)
    

    并且要从存储在一行中的数据中获取一维数组(如在这个问题中),您将对数据进行两次转置,例如

     Dim myArray As Variant
     myArray = Application.Transpose(Application.Transpose(Range("A1:J1").Value)
    

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

    【讨论】:

    • 你确定吗?两次变换对我不起作用。两次变换后仍然是二维的。
    • 1 到 40,1 到 1 不是一维的,它是一个二维表,其中一维限于一维,即向量。
    • 不,仍然是二维的,看着我的本地窗口。
    • 啊,好的。这解释了我遇到的很多问题。我没有意识到使用列将其定义为多维的。我将再次尝试并更新问题。
    【解决方案2】:

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

    Lbound(range,1) 给出行的下限,Lbound(range,2) 给出列的下限。 Ubound(range,1) 给出行的上限,Ubound(range,2) 给出列的上限。 Lbound(range) 默认与 Lbound(range,1) 相同。

    【讨论】:

    • 我需要添加转置,看看是否解决了工作表 2 中的输出问题,只有在工作表 1 处于活动状态时才有效。不过现在有个哭闹的婴儿。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    相关资源
    最近更新 更多