VBA嵌套If循环异常:非空判断失效导致全量复制问题排查
解决VBA中Not IsEmpty判断失效的问题
嘿,我一眼就揪出你的问题根源了——你在判断条件里用的"Input[Amended]"是个固定字符串常量,根本不是对表格第i行对应单元格的引用!IsEmpty函数一直在判断这个字符串本身,而字符串永远不可能是空的,所以你的条件永远为True,自然会把所有单元格都复制过去。
你之前尝试的If ("Input[Amended]") <> "" Then和If IsEmpty("Input[Amended]") = False Then也犯了同样的错误:都是在检查字符串,而非实际的单元格内容。
修正后的代码方案
这里给你两种靠谱的修改方式,按需选择:
方案1:利用你已定义的AmendedCCY变量
直接引用这个范围的第i行单元格,代码改动最小:
Sub MoveData() Dim InTbl As ListObject, TeTbl As ListObject, i As Long, LastRow As Long, AmendedCCY As Range Set InTbl = ThisWorkbook.Sheets("Input").Range("Input").ListObject Set TeTbl = ThisWorkbook.Sheets("Input").Range("TestTab").ListObject Set AmendedCCY = InTbl.ListColumns(4).DataBodyRange LastRow = AmendedCCY.Rows.Count For i = 1 To LastRow ' 这里才是引用第i行的实际单元格,而非字符串 If Not IsEmpty(AmendedCCY(i)) Then TeTbl.DataBodyRange(i, 2).Value = InTbl.DataBodyRange(i, 4).Value End If Next End Sub
方案2:用列名直接引用(更直观,不易出错)
如果后续表格列顺序变动,用列名比列号更可靠:
Sub MoveData() Dim InTbl As ListObject, TeTbl As ListObject, i As Long, LastRow As Long Set InTbl = ThisWorkbook.Sheets("Input").Range("Input").ListObject Set TeTbl = ThisWorkbook.Sheets("Input").Range("TestTab").ListObject ' 先判断表格是否有数据行,避免空表报错 If Not InTbl.DataBodyRange Is Nothing Then LastRow = InTbl.DataBodyRange.Rows.Count For i = 1 To LastRow ' 通过列名定位目标单元格 If Not IsEmpty(InTbl.ListColumns("Amended").DataBodyRange(i)) Then TeTbl.DataBodyRange(i, 2).Value = InTbl.ListColumns("Amended").DataBodyRange(i).Value End If Next End If End Sub
额外提醒
- 要确保
TestTab表格的行数和Input表格一致,否则当i超过TestTab的行数时会触发运行错误,你可以在代码里添加行扩展逻辑,或者提前同步两行数。 - 如果需要排除单元格仅含空格的情况,可以把判断条件改成:
If Trim(InTbl.ListColumns("Amended").DataBodyRange(i).Value) <> "" Then
内容的提问来源于stack exchange,提问作者Breakingfaith
相关产品推荐
相关产品推荐

