Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA Excel-Redim循环中的二维数组_Excel_Vba - Fatal编程技术网

VBA Excel-Redim循环中的二维数组

VBA Excel-Redim循环中的二维数组,excel,vba,Excel,Vba,我使用的代码很有效,但是在数组的末尾有很多空行:ari 是否有办法调整循环内数组的大小,以避免条件不满足的额外空行 Dim myTable As ListObject Dim myArray As Variant Dim ary As Variant Dim x As Long Dim r As Long, nr As Long Set myTable = x_sheet.ListObjects("accounts_table") myArray = myTable.Dat

我使用的代码很有效,但是在数组的末尾有很多空行:
ari

是否有办法调整循环内数组的大小,以避免条件不满足的额外空行

Dim myTable As ListObject
Dim myArray As Variant
Dim ary As Variant
Dim x As Long
Dim r As Long, nr As Long

Set myTable = x_sheet.ListObjects("accounts_table")
myArray = myTable.DataBodyRange

ReDim ary(1 To UBound(myArray), 1 To 2)
   
For x = LBound(myArray) To UBound(myArray)
   If myArray(x, 5) = "On" Then
   If myArray(x, 4) <> "T" Or myArray(x, 4) <> "I" Then
   nr = nr + 1
   ary(nr, 1) = myArray(x, 1)
   ary(nr, 2) = myArray(x, 2)
   End If
   End If
Next x
将myTable设置为ListObject
Dim myArray作为变体
作为变体
暗x等长
变暗r为长,nr为长
Set myTable=x_sheet.ListObjects(“账户表”)
myArray=myTable.DataBodyRange
重播(1到UBound(myArray),1到2)
对于x=LBound(myArray)到UBound(myArray)
如果myArray(x,5)=“开”,则
如果myArray(x,4)“T”或myArray(x,4)“I”,则
nr=nr+1
ary(nr,1)=myArray(x,1)
ary(nr,2)=myArray(x,2)
如果结束
如果结束
下一个x

这里有一种方法-首先计算(并收集)匹配行,然后调整大小并填充数组

编辑:更新以将数组筛选推入一个独立函数,该函数接受筛选每行时要使用的函数名称

Sub-TestArrayFiltering()
将myTable设置为ListObject
Dim myArray作为变量,ws作为工作表,已筛选
设置ws=ActiveSheet
Set myTable=ws.ListObjects(“accounts\u table”)
myArray=myTable.DataBodyRange
'根据函数“MyRowmatch”筛选数组'
filtered=Filter2DArray(myArray,“MyRowMatch”)
如果不是空的(过滤的),那么
ws.Range(“I2”).Resize(UBound(filtered,1),UBound(filtered,2)).Value=filtered
其他的
MsgBox“无匹配项”
如果结束
端接头
“我们想要这一排吗?”?
函数MyRowMatch(arr,indx)作为布尔值
暗v
v=arr(indx,4)
MyRowMatch=(arr(indx,5)=“On”和v“T”和v“I”)
端函数
'实用程序函数:获取一个二维数组并返回一个仅包含以下行的新数组:
'从'func'中指定的函数返回True`
“`func`必须接受2个参数—一个2D数组和一个行索引
函数Filter2DArray(arrIn,func作为字符串)
Dim arrOut作为变体,匹配作为新集合
暗淡的x,长的一样,我一样长
变暗lbr为长,lbc为长,ubr为长,ubc为长
lbr=LBound(arrIn,1)'获取输入数组边界
lbc=LBound(arrIn,2)
ubr=UBound(arrIn,1)
ubc=UBound(arrIn,2)
对于x=lbr To ubr'收集匹配的行索引
如果Application.Run(func、arrIn、x)匹配.Add x
下一个x
'调整目标数组大小并传输匹配行
如果匹配。计数>0,则
ReDim arrOut(lbr到匹配项。计数+(lbr-1),lbc到ubc)
i=lbr
对于匹配中的每个x
对于col=lbc至ubc
arrOut(i,col)=arrIn(x,col)
下一列
i=i+1
下一个x
Filter2DArray=arrOut
其他的
Filter2DArray=空
如果结束
端函数

一个选项是使用
工作表函数.CountIfs
预先实际确定阵列的目标大小
ReDim
非常昂贵,不应该在循环内完成。但更重要的是,
ReDim Preserve
只允许修改最后一个数组维度,因此无法与当前的数组设置配合使用。