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

我在尝试着:

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

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

这是我的问题:

如果Worksheet 1是活动工作表,macros将只输出数组中的所有值到Worksheet 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 

我很欣赏任何想法。

举例说:

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

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

如果您想使数组变为一维,则需要使用移调function(两次):

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

这将创build一个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块中键入.而不是object.


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

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

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

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

尽pipe这种行为看起来很“怪异”,但Excel本身通常看起来很奇怪。

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

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