Excel VBA宏故障排查:动态识别日期行实现公式填充至指定月列
排查VBA宏动态识别日期行的问题
先直接说你修改后的代码里的几个致命问题:
逻辑冲突导致核心代码永远不执行
外层判断的是Cells(i,1) = "m"或"M",里面又加了If Cells(i,1) = "D"的判断——同一行的A列不可能既是"m"/"M"又是"D",所以匹配日期列的代码根本没机会运行,后面的FillRight自然也失效。日期匹配的类型不统一
原代码用CDbl(mdate)把日期转成数值去匹配,因为Excel里日期本质是数值,但你修改后直接用mdate(日期类型)去匹配,很可能因为单元格格式问题匹配失败,得保留转数值的操作。日期行的识别逻辑错误
你要找的是首列以"D"开头的行,不是A列等于"D",应该用Left(Cells(i, 1).Value, 1) = "D"(或者加上UCase忽略大小写)来判断。变量未初始化导致报错
当内层的If Cells(i,1) = "D"不执行时,mcol没有被赋值,后面的Range(...).FillRight会触发"变量未定义"的错误。
修正后的代码
下面是调整后的代码,先提前找到所有以"D"开头的日期行,再处理"m"/"M"行的公式填充:
Sub DragFormulaToMonth() Dim mdate As Date Dim dateRow As Integer ' 存储日期行的行号 Dim mcol As Variant ' 用Variant接收Match结果,避免错误 Dim lastRow As Integer ' 先找到首列以"D"开头的日期行 lastRow = Cells(Rows.Count, 1).End(xlUp).Row For dateRow = 1 To lastRow If UCase(Left(Cells(dateRow, 1).Value, 1)) = "D" Then Exit For ' 找到第一个符合条件的行就跳出 End If Next dateRow ' 处理所有A列为"m"/"M"的行 mdate = Worksheets("Input").Range("B2").Value For i = 1 To lastRow If UCase(Cells(i, 1).Value) = "M" Then ' 用UCase简化判断 ' 匹配日期对应的列,转成数值避免格式问题 mcol = Application.Match(CDbl(mdate), Rows(dateRow), 0) ' 检查匹配是否成功,再执行填充 If Not IsError(mcol) Then Range(Cells(i, "AQ"), Cells(i, mcol)).FillRight End If End If Next i End Sub
修正说明
- 先单独循环找到第一个A列以"D"开头的行,存储行号
dateRow,避免逻辑冲突 - 用
UCase统一大小写判断,兼容输入的大小写差异 - 保留
CDbl(mdate)转数值匹配,确保日期匹配准确 - 用
Variant类型的mcol接收Match结果,通过IsError判断匹配是否成功,避免报错 - 拆分日期行查找和公式填充的逻辑,代码结构更清晰
内容的提问来源于stack exchange,提问作者user2487746
相关产品推荐
相关产品推荐

