我被困了大约一个小时:看起来我错过了什么。
我已经编写了上面的代码来操作数组中的文本。它的目的是摆脱keywordToProcess中忽略的关键字,这就是j = ""
行的意思。在该行j = ""
,j
确实变为空白,但成品i = join(i," ")
仍然有一个应该在其中变为空白的单词。为什么?我不熟悉For Each
- 循环,也许我错过了一些重要的东西。
For Each i In keywordToProcess
i = Split(i, " ")
For Each j In i
j = RemovePrurals(j)
Next j
For Each j In i
For Each k In ignoreArr
If j = k Then
j = ""
End If
Next k
Next j
i = Join(i, " ")
Next i
答案 0 :(得分:0)
您正确使用For Each ... Next
。问题是你混淆了变量。 (我认为keywordtoprocess是一个字符串数组。)然后i
中的For Each
是Single String
。在下一行i
中,使用String Array
将类型更改为Split
。然后在最后一行中,使用Single String
从String Array i
创建Join
。但是,在下一步中,您使用i
覆盖Next ... For Each
,将Single String
的下一个值分配给i
。 VBA允许你这样做,但你应该避免它。所以我建议:在编码之前使用Option Explicit
,声明变量和设计。请记住,每个变量背后都有物理内存单元。
编辑:我会用这种方式编码(假设keywordtoprocess是一个字符串数组)
' Dim keywordtoprocess() As Variant
Dim sKW As String ' keyword
Dim asBuf() As Variant ' string buffer for current keyword split to pieces
Dim sK As String ' for keywords to be ignored
Dim i As Long ' loop
For Each sKW In keywordtoprocess
asBuf = Split(sKW, " ")
For i = LBound(asBuf) To UBound(asBuf)
asBuf(i) = RemovePrurals(asBuf(i)) ' this is the way to change value
For Each sK In ignoreArr
If asBuf(i) = sK Then
asBuf(i) = vbNullString
End If
Next sK
Next i
Next sKW
sK = Join(asBuf, " ")
Debug.Print sK
请注意,更改循环变量不会更改实际数据。请参阅RemovePrurals的建议。无论如何,你最好避免改变循环变量,即使你可以。