从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中看到的“狡猾”空格字符的截图
编辑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有两个错误需要解决:
-
你有
For i = 1 To CriteriaRange.Count
两次 – 你需要删除第二个。 这似乎一定是一个打字错误什么的 -
该函数应该以
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