Cod*_*ver 1 vbscript excel vba excel-vba
我有一个数组说:VMHArray=(12,22,34,4)现在有另一个Arraylist对象说ArrayListTaskDetails将数据保存为(12,55,44,4,12,22,21,107,43,22,34)现在下面的代码我写信从列表中删除列表ArrayListTaskDetails中不存在的项目VMHArray。
码
Dim Flag : Flag = true
Dim Counter
For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 step 4
Counter = 0
Do while Flag
If VMHArray(Counter) <> ArrayListTaskDetails (IndexSearch) Then
ArrayListTaskDetails.RemoveRange IndexSearch, 4
Flag = False
End If
Counter = Counter + 1
Loop
Next
Run Code Online (Sandbox Code Playgroud)
现在,假设在找到一个匹配项IndexSearch = 0,那么根据它会删除位置上的元素0,1,2,3-很好。但是由于移除并ArrayList通过功能使对象连续,其他元素将4向左移动。现在问题For Loop已经增加了4,因此将从下一个迭代开始location 4。因此,现在0 location数组列表中的新元素再也没有机会测试与VMHArray数组元素的相等性。如果我们可以将For Loop计数器设置为立即找到最近匹配并删除4个元素的即时位置,我们是否可以在不损失预期操作的情况下处理这种情况?
如果有任何问题需要理解,请告诉我!
编辑 Go to将不起作用
代码(按照@Ankit的建议)
Option Explicit
Dim Flag : Flag = true
Dim Counter
Dim VMHArray : VMHArray = Array(12,22,34,4)
Dim ArrayListTaskDetails : Set ArrayListTaskDetails = CreateObject("System.Collections.ArrayList")
ArrayListTaskDetails.Add(45)
ArrayListTaskDetails.Add(4)
ArrayListTaskDetails.Add(22)
ArrayListTaskDetails.Add(4)
ArrayListTaskDetails.Add(45)
ArrayListTaskDetails.Add(20)
ArrayListTaskDetails.Add(12)
ArrayListTaskDetails.Add(35)
ArrayListTaskDetails.Add(34)
Restart:
For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 step 4
Counter = 0
Do while Flag
If VMHArray(Counter) <> ArrayListTaskDetails (IndexSearch) Then
ArrayListTaskDetails.RemoveRange IndexSearch, 4
Goto Restart
Flag = False
End If
Counter = Counter + 1
Loop
Next
MsgBox(Join(ArrayListTaskDetails.ToArray()),"$")
Run Code Online (Sandbox Code Playgroud)

谢谢,
解决问题的两种思路:
在代码中:
Option Explicit
Dim alSrc : Set alSrc = CreateObject("System.Collections.ArrayList")
Dim sE
For Each sE In Split("a x x x b x x x c x x x d x x x e x x x f x x x a x x x")
alSrc.Add sE
Next
WScript.Echo "alSrc:", Join(alSrc.ToArray(), ".")
Dim aKeep : aKeep = Split("a d")
WScript.Echo "aKeep:", Join(aKeep, ".")
Dim dicKeep : Set dicKeep = CreateObject("Scripting.Dictionary")
For Each sE In aKeep
dicKeep(sE) = 0
Next
WScript.Echo "dicKeep:", Join(dicKeep.Keys(), ".")
Dim nI
For nI = alSrc.Count - 4 To 0 Step -4
sE = alSrc(nI)
If Not dicKeep.Exists(sE) Then
alSrc.RemoveRange nI, 4
End If
WScript.Echo sE, nI, Join(alSrc.ToArray(), ".")
Next
WScript.Echo "alSrc:", Join(alSrc.ToArray(), ".")
Run Code Online (Sandbox Code Playgroud)
输出:
alSrc: a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.e.x.x.x.f.x.x.x.a.x.x.x
aKeep: a.d
dicKeep: a.d
a 24 a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.e.x.x.x.f.x.x.x.a.x.x.x
f 20 a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.e.x.x.x.a.x.x.x
e 16 a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.a.x.x.x
d 12 a.x.x.x.b.x.x.x.c.x.x.x.d.x.x.x.a.x.x.x
c 8 a.x.x.x.b.x.x.x.d.x.x.x.a.x.x.x
b 4 a.x.x.x.d.x.x.x.a.x.x.x
a 0 a.x.x.x.d.x.x.x.a.x.x.x
alSrc: a.x.x.x.d.x.x.x.a.x.x.x
Run Code Online (Sandbox Code Playgroud)
关于.Count-之谜:
1 2 3 4 5 6 7 8 - Count 1 - 8
0 1 2 3 4 5 6 7 - Idx 0 - 7
A x x x B x x x - Count (8) - Step (4) = Pos to check (4)
Count (8) - Step + 1 (5) = Not the pos to check (3)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7168 次 |
| 最近记录: |