我想:
从工作簿中的第一个工作表中获取数据范围,并将这些数据传递到多个一维数组中。
将这些数组中的值输出到同一工作簿中的第二个工作表中。
以下是我的问题:
如果工作表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
我很感激任何想法。
答案 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
。
您应始终(除非知道您要使用活动表格)指定在使用Range
,Range
,{{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)。