在VBA中实现Excel CountIf生成唯一RA编号遇函数未定义错误求解决
问题描述
我有一份包含协议编号(RA)的表格,因存在重复发票导致RA编号重复。我需要识别重复发票,并在RA编号前添加连续数字,Excel单元格D2中输入公式=IF(E2=1,"1","" & COUNTIF(E2:E118,E2) & E2)后下拉填充,可生成唯一RA编号,完全符合需求。但我尝试在VBA子程序中实现该公式时,出现“子过程或函数未定义”错误,尝试的代码段如下:
vRow = Cells(Rows.Count, 1).End(xlUp).Row 'Enter formula for unique invoice Range("D2") = WorksheetFunction.CountIf(Range("E2") = 1, "1", "" & CountIfs(Range("E2:E" & vRow), Range("E2") & Range("E2"))) 'Range("D2").formula = "=IF(E2=1,\"1\",\"\" & COUNTIF(E2:E118,E2) & E2)" Application.Calculation = xlAutomatic Range("D2").FillDown
请问如何修改才能让这段VBA代码正常工作?
解决方案
你的代码错误原因在于:错误调用WorksheetFunction.CountIf模拟IF逻辑,且注释的公式存在字符串转义错误、范围固定的问题。修改后的正确代码如下:
Sub GenerateUniqueRA() Dim vRow As Long ' 取E列最后一行数据行号,更贴合数据所在列 vRow = Cells(Rows.Count, "E").End(xlUp).Row ' 给D2设置动态范围的公式,修正双引号转义 Range("D2").Formula = "=IF(E2=1,""1"","""" & COUNTIF(E2:E" & vRow & ",E2) & E2)" ' 自动填充公式到最后一行 Range("D2").AutoFill Destination:=Range("D2:D" & vRow) End Sub
核心修改说明
- 直接通过
.Formula属性赋值Excel公式,和手动输入逻辑完全一致,避免错误调用VBA函数; - 公式范围改为动态的
E2:E" & vRow,适配不同数据行数; - VBA字符串中的双引号需用两个双引号
""转义,所以原公式里的"1"写成""1"",空字符串""写成""""; - 用
AutoFill精准指定填充范围,比FillDown更可靠; - 调整获取最后一行的代码为针对E列,避免因A列无数据导致的错误。
内容的提问来源于stack exchange,提问作者user18408684
相关产品推荐
相关产品推荐

