VBA循环按条件跨工作表复制单元格异常问题求助
问题分析与解决方案
嘿,我找到你代码里的问题啦!导致只有i=21时的值能粘贴到Feuil2的核心原因,是你定位目标单元格的方式不对,大部分情况下根本没找到正确的空行位置。
问题出在哪?
你用了Sheets("Feuil2").Columns(b).End(xlDown).Offset(1, 0)来定位下一个要写入的单元格,但这个写法有个致命问题:当Feuil2的第b列完全是空的时候,End(xlDown)会直接跳到该列的最后一行(也就是Excel允许的最大行号,比如第1048576行),再Offset(1)就超出了Excel的行范围,自然没法写入内容。
只有当i=21时,可能刚好该列之前有了内容(比如某次循环意外写入过),End(xlDown)才能找到正确的最后一个非空单元格,然后下移一行写入。
修正后的代码
把定位目标单元格的方式改成从列的底部往上找最后一个非空单元格,再下移一行,这样不管列是空还是有内容,都能准确找到下一个空行。另外还要修正变量声明的小问题(原代码里i是Variant类型,不是Long):
Dim i As Long, b As Long ' 修正变量声明,确保i和b都是Long类型 Dim INTP As Variant, client As Variant ' 显式声明变量更规范 For b = 1 To 18 Step 2 For i = 5 To 21 INTP = Sheets("Feuil1").Cells(i, 18 + b).Value ' 加上.Value更清晰 client = Sheets("Feuil1").Cells(i, 17 + b).Value If IsNumeric(INTP) Then ' 从列b的最后一行往上找,定位到最后一个非空单元格,再下移一行 Sheets("Feuil2").Cells(Rows.Count, b).End(xlUp).Offset(1, 0).Value = client End If Next i Next b
额外说明
- 加上
.Value属性是个好习惯,虽然VBA会默认取值,但显式写出来让代码更易读,避免歧义。 - 显式声明所有变量(比如
INTP和client)能避免很多潜在的类型错误,建议在代码开头加上Option Explicit(工具→选项→编辑器→要求变量声明),强制声明变量。
内容的提问来源于stack exchange,提问作者IlvarNourtan
相关产品推荐
相关产品推荐

