使用每个:在循环结束时,不记录结果

时间:2018-02-01 13:22:08

标签: vba foreach

我被困了大约一个小时:看起来我错过了什么。

我已经编写了上面的代码来操作数组中的文本。它的目的是摆脱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

1 个答案:

答案 0 :(得分:0)

您正确使用For Each ... Next。问题是你混淆了变量。 (我认为keywordtoprocess是一个字符串数组。)然后i中的For EachSingle String。在下一行i中,使用String Array将类型更改为Split。然后在最后一行中,使用Single StringString 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的建议。无论如何,你最好避免改变循环变量,即使你可以。