我有一个可变长度的全局数组 prLst()
. 它将数字作为字符串 "1"
到 Ubound(prLst)
. 但是,当用户输入 "0"
时,我想从列表中删除该元素 . 我编写了以下代码来执行此操作:
count2 = 0
eachHdr = 1
totHead = UBound(prLst)
Do
If prLst(eachHdr) = "0" Then
prLst(eachHdr).Delete
count2 = count2 + 1
End If
keepTrack = totHead - count2
'MsgBox "prLst = " & prLst(eachHdr)
eachHdr = eachHdr + 1
Loop Until eachHdr > keepTrack
这不起作用 . 如果元素为 "0"
,如何有效删除数组 prLst
中的元素?
NOTE: 这是一个较大的程序的一部分,其描述可以在这里找到:Sorting Groups of Rows Excel VBA Macro
8 回答
数组是具有一定大小的结构 . 您可以在vba中使用可以使用ReDim缩小或增长的动态数组,但不能删除中间的元素 . 从您的示例中不清楚您的数组在功能上如何工作或如何确定索引位置(eachHdr)但您基本上有3个选项
(A)为你的数组写一个自定义的'删除'函数,如(未经测试)
(B)只需将“虚拟”值设置为值,而不是实际删除元素
(C)停止使用数组并将其更改为VBA.Collection . 集合是(唯一的)键/值对结构,您可以在其中自由添加或删除元素
在创建数组时,为什么不跳过0并节省自己以后担心它们的时间?如上所述,数组不适合删除 .
我知道这是旧的,但是当我不喜欢我找到的那些时,这就是我提出的解决方案 .
显然,字符串的使用会产生一些限制,比如需要确定数组中已有的信息,而且这个代码会使第一个数组元素变成空白,但是它会做我需要的东西,并且可以做更多的工作 . 更多才多艺 .
这很简单 . 我通过以下方式来获取具有唯一值的字符串(来自输出表的两列):
这是使用
CopyMemory
函数完成工作的代码示例 .它应该“快得多”(取决于阵列的大小和类型......) .
我不是作者,但我测试了它:
我对vba和excel很新 - 只有这样做了大约3个月 - 我想我会在这里分享我的数组重复数据删除方法,因为这篇文章似乎与它相关:
此代码如果是分析管道数据的较大应用程序的一部分 - 管道列在具有xxxx.1,xxxx.2,yyyy.1,yyyy.2 ....格式的数字的工作表中 . 这就是为什么所有字符串操作都存在的原因 . 基本上它只收集一次管道号,而不是.2或.1部分 .
使用一堆消息框进行调试 - 确保您将更改它以适合您自己的工作 .
我希望人们觉得这很有用,问候乔
要删除某个条件中的元素,您可以像这样编码
我经常使用Join / Split操作1D-Array,但如果你必须在Multi Dimension中删除某些值,我建议你将这些数组更改为1D-Array,就像这样