如何在Excel VBA函数中使用Indirect函数整合工作表公式
解决Excel公式转VBA时Indirect引用失效的问题
已知A7单元格值为JohnWinstonLennon,以下两个Excel工作表公式可正常查找字符串中第2、3个大写字母的位置:
=SMALL(FIND(0,SUBSTITUTE(A7,CHAR(ROW(INDIRECT("65:90"))),0)&0),2) =SMALL(FIND(0,SUBSTITUTE(A7,CHAR(ROW(INDIRECT("65:90"))),0)&0),3)
将上述逻辑转写为VBA时,INDIRECT引用无法直接生效——原因是VBA对工作表函数的调用逻辑与单元格公式不同,且直接依赖INDIRECT并非最优方案。可以通过VBA原生逻辑实现相同功能,以下是自定义函数代码:
Function FindNthUpperCasePos(inputStr As String, nth As Integer) As Variant Dim posList As Collection Dim i As Integer Set posList = New Collection ' 遍历字符串,收集所有大写字母的位置 For i = 1 To Len(inputStr) If Asc(Mid(inputStr, i, 1)) >= 65 And Asc(Mid(inputStr, i, 1)) <= 90 Then posList.Add i End If Next i ' 根据指定序号返回对应位置,无匹配则返回错误 If nth <= posList.Count Then FindNthUpperCasePos = posList(nth) Else FindNthUpperCasePos = CVErr(xlErrValue) End If End Function
使用说明
在Excel单元格中直接调用:
- 查找第2个大写字母位置:
=FindNthUpperCasePos(A7,2) - 查找第3个大写字母位置:
=FindNthUpperCasePos(A7,3)
该函数通过原生VBA遍历字符判断大写,避免了对工作表函数的依赖,运行更高效且逻辑清晰。
内容的提问来源于stack exchange,提问作者RWB
相关产品推荐
相关产品推荐

