从网站复制 Excel VBA 代码时出现意外语法错误

Unexpected syntax error when copying Excel VBA code from a Web site

我正在寻找一个函数来有条件地连接 Excel 中的一系列单元格。这个函数

Function ConcatenateIf(CriteriaRange As Range, Condition As Variant, ConcatenateRange As Range, Optional Separator As String = ",") As Variant

Dim xResult As String
On Error Resume Next
If CriteriaRange.Count <> ConcatenateRange.Count Then
    ConcatenateIf = CVErr(xlErrRef)
    Exit Function
End If
For i = 1 To CriteriaRange.Count
    If CriteriaRange.Cells(i).Value = Condition Then
        xResult = xResult & Separator & ConcatenateRange.cells(i).Value
    End If
For i = 1 To CriteriaRange.Count
Next i
If xResult <> "" Then
    xResult = VBA.Mid(xResult, VBA.Len(Separator) + 1)
End If
ConcatenateIf = xResult
Exit Function

来自 https://www.extendoffice.com/documents/excel/2723-excel-concatenate-based-on-criteria.html 只看了票。评论表明它对其他编码器有效。

但是,当我将它粘贴到 Excel2016 中的 VBA 模块时,出现了我无法弄清楚的语法错误。第 7 行的 "Exit Function" 可以通过删除 "Function" 来解决。最后调用 "Exit Function" 不会注册为错误,但可以删除为多余的。但是

If CriteriaRange.Cells(i).Value = Condition Then

突出显示为语法错误(以及匹配的 "End If")。如果我简单地使用 "If true Then",错误不会消失,这表明查看前一行

For i = 1 To CriteriaRange.Count

我尝试了 "For i = 1 To 8" 但这也没有解决问题。我只是看不出有什么问题?

除了有用的回复,这里还有一张直接粘贴到 VBA

的屏幕截图

这是在 Word

中看到的 "dodgy" space 个字符的屏幕截图

编辑 2

正如 OP 所发现的那样,从网站复制和粘贴会给出一堆不间断的 spaces:

在我的测试用例(Excel 2013,Win7)中,那些粘贴很好,而且 Excel 没有呕吐。但是,OP 的安装(Excel 2016)无法处理它们。

要更改这些:

  • 将代码粘贴到 Word 中。
  • 执行 Find/Replace 将 ^s(不间断 spaces,ChrW(160))更改为单个 space(</code>). </li> <li>从 Word 复制到 Excel。</li> </ul> <h2>原创</h2> <p>要让它编译,我所要做的就是:</p> <ul> <li>注释掉第二 <code>For i=...
  • 将最后一行的 Exit Function 更改为 End Function

不过还没有测试过。您能否编辑您的问题以添加您正在尝试的测试用例?

Edit @YowE3K 打败了我——你问题中的代码存在一些复制粘贴错误。从站点重新复制,你应该没问题!

2010 年 Excel 测试有 2 个错误需要解决:

  1. 您有两次 For i = 1 To CriteriaRange.Count - 您需要删除第二次。看来一定是输入错误什么的

  2. 函数应该以End Function

  3. 结束

修正后的工作代码:

Function ConcatenateIf(CriteriaRange As Range, Condition As Variant, ConcatenateRange As Range, Optional Separator As String = ",") As Variant

    Dim xResult As String

    On Error Resume Next

    If CriteriaRange.Count <> ConcatenateRange.Count Then
        ConcatenateIf = CVErr(xlErrRef)
        Exit Function
    End If

    For i = 1 To CriteriaRange.Count
        If CriteriaRange.Cells(i).Value = Condition Then
            xResult = xResult & Separator & ConcatenateRange.Cells(i).Value
        End If
    Next i

    If xResult <> "" Then
        xResult = VBA.Mid(xResult, VBA.Len(Separator) + 1)
    End If

    ConcatenateIf = xResult

End Function