VBA:如何在循环内If语句中将for循环变量sheet_number重置为1?
问题分析与解决方案
你遇到的核心问题是VBA的For循环会自动管理循环变量的递增/递减——哪怕你在循环内部手动修改了sheet_number的值,执行到Next sheet_number时,VBA还是会把它设置为当前值+1。举个例子:当你在第一次循环里把sheet_number改成1,Next之后它会直接变成2,根本不会重新从1开始遍历工作表,这就是程序没按预期填充所有表的原因。
修复方案:改用Do While循环控制变量
要完全掌控循环变量的变化,建议把For循环替换成Do While循环,这样你可以自由重置或调整sheet_number的值,不会被VBA的自动递增干扰。同时我也优化了代码里的复制粘贴逻辑,直接赋值公式比用PasteSpecial更高效:
Sub Luka_Koper() Dim i As Integer, j As Integer, sheet_number As Integer, n As Integer, x As Integer, y As Integer n = 8 ' 改用Do While循环,手动控制sheet_number的变化 Do While sheet_number <= Application.Sheets.Count sheet_number = sheet_number + 1 ' 先递增,避免初始值0的问题 If Sheets("ZBIR UR").Cells(n, 2).Value = Sheets(sheet_number).Cells(1, 1).Value Then i = 3 x = n + 1 y = n + 2 ' 简化公式赋值,避免重复复制粘贴 For j = 4 To 32 ' 直接将ZBIR UR表的公式赋值到目标表,更高效 Sheets(sheet_number).Cells(j, 2).Formula = Sheets("ZBIR UR").Cells(n, i).Formula Sheets(sheet_number).Cells(j, 3).Formula = Sheets("ZBIR UR").Cells(x, i).Formula Sheets(sheet_number).Cells(j, 4).Formula = Sheets("ZBIR UR").Cells(y, i).Formula i = i + 1 Next j ' 重置sheet_number为0,因为下一次循环会先+1变成1 sheet_number = 0 n = n + 3 End If ' 退出条件:n超过500时终止程序 If n > 500 Then Exit Sub Loop End Sub
关键修改点说明
- 循环类型替换:用
Do While代替For,让你完全控制sheet_number的重置和递增逻辑。这里初始时sheet_number是0,每次循环先+1,这样重置为0后下一次循环会从1开始。 - 公式赋值优化:去掉了
Copy和PasteSpecial,直接通过.Formula属性赋值,既减少了剪贴板的占用,也让代码运行更快。 - 逻辑简化:移除了冗余的
Else分支,把退出条件放在循环内部更清晰。
这样修改后,每当匹配到条件时,sheet_number会被重置为0,下一次循环就会从1开始重新遍历所有工作表,实现你想要的逻辑。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

