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

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

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行的“退出function”可以通过删除“function”来解决。 最后的“退出函数”的调用不会被注册为错误,但可以作为多余的移除。 但

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

突出显示为语法错误(和匹配的“结束如果”)。 如果我简单地使用“如果真的那么”,错误不会消失,这意味着看上一行

 For i = 1 To CriteriaRange.Count 

我试过“For i = 1 to 8”,但是也没有解决。 我只是不明白什么是错的?

除了有帮助的回应之外,下面是直接粘贴到VBA中的屏幕截图

显示网站原始代码中的红色语法错误高亮显示

这里是在Word中看到的“狡猾”空格字符的截图

在Word中显示带有隐藏字符的空格

编辑2

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

在这里输入图像说明

在我的testing案例(Excel 2013,Win7)中,这些粘贴在罚款,而Excel不barf。 但是,OP的安装(Excel 2016)不能处理它们。

改变这些:

  • 将代码粘贴到Word中。
  • 查找/replace将^s (不间断空格, ChrW(160) )更改为单个空格( )。
  • 从Word复制到Excel。

原版的

我所要做的就是编译:

  • 注释掉第二个For i=... line
  • 将最后一行的Exit Function更改为End Function

虽然没有testing过。 你可以编辑你的问题来添加你正在尝试的testing用例吗?

编辑 @ YowE3K击败了我 – 在你的问题代码中有一些复制粘贴错误。 从网站重新复制,你应该没问题!

在Excel 2010上testing有两个错误需要解决:

  1. 你有For i = 1 To CriteriaRange.Count两次 – 你需要删除第二个。 这似乎一定是一个打字错误什么的

  2. 该函数应该以End Function

带有更正的工作代码:

 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