我可以让这个工作,但不确定这是否是正确的或最有效的方式这样做。
详细信息:循环151行,然后根据列C
中的条件,仅将这些行中的列A
和B
分配给二维数组。使用该条件,数组中仅需要151行中的114行。
我知道,使用ReDim Preserve,你只能调整数组的最后一个维度,而你根本不能改变维度的数量,所以我使用变量LRow
,将数组中的行调整为总共151行,但实际上我只需要在数组中的行在变量ValidRow
中,所以看起来(151-114)= 37个多余行作为ReDim Preserve行的结果存在于阵列中。我想使数组大小只需要它是114行,而不是151,但不确定这是否可能,请参阅下面的代码和任何帮助非常感谢,因为我是新的阵列,并已花了最好的花了两天时间来研究这个问题。注意:列是一个常数,没有问题,但行变化。
Sub FillArray2()
Dim Data() As Variant
Dim ValidRow, r, LRow As Integer
Sheets("Contract_BR_CONMaster").Select
LRow = Range("A1").End(xlDown).Row '151 total rows
Erase Data()
For r = 2 To LRow
If Cells(r, 3).Value <> "Bridge From" And Cells(r, 3).Value <> "Bridge To" Then
ValidRow = ValidRow + 1
ReDim Preserve Data(1 To LRow, 1 To 2)
Data(ValidRow, 1) = Range("A" & r).Value 'fills the array with col A
Data(ValidRow, 2) = Range("B" & r).Value 'fills the array with col B
End If
Next r
ActiveWorkbook.Worksheets("Test").Range("A2:B" & ValidRow + 1) = Data() 'assign after loop has run through all data and assessed it
End Sub
4条答案
按热度按时间new9mtju1#
我似乎已经得到了这个工作,通过使用转置,其中行和列交换左右,仍然使用Redim保留,然后转置在年底时,分配给一个范围。这种方式的数组正是它需要的大小,没有空白单元格。
35g0bw712#
另请注意,REDIM的内部VBA实现并不保证在减小存储大小时释放存储。在这种实现中,通常的选择是在存储大小减小到输入大小的一半以下之前不物理地减小存储。
你有没有考虑过创建一个类型安全的集合类来代替数组来存储这些信息?在它最基本的形式中(对于存储类型为Integer),它看起来像是一个类模块:
这种实现的一个特别的优点是,从客户机代码中完全删除了大小调整逻辑,这是应该的。
注意,这种模式存储的数据类型可以是VBA支持的任何类型,包括Array或其他Class。
xriantvc3#
还有两种方法。FillArray 4-创建的初始数组太大,但代码的第二部分使用双循环将其移动到一个新数组,该双循环将数组创建为所需的确切大小。
Sub FillArray 5-简单多了,我的首选因为你只创建一个数组。初始循环决定数组需要的大小,然后第二个循环使用它来创建数组和存储数据。注意在两种情况下只有两个列。我在这个场景中遇到的问题是创建行不同的二维数组。这是我去热带度假的时间!
mlnl4t2r4#
在我的例子中,我将usedrange转换为变量数组以提高速度(VBA中的复杂计算)。没有(简单)的方法。因此,如果我事先知道,我可能最多添加多少行,我只是将预期的行数添加到初始范围进行传输。下面我们开始:
末端子组件