如何将这段VBA单元格赋值代码改写为通用for循环?
正确实现通用VBA循环的方案
先梳理下你原固定代码的规律:当Number=3时,你是把txtBox1到txtBox9按列优先的顺序,写入到一个Number×Number的单元格区域里(每列对应3个连续编号的控件,共3列)。
你写的嵌套循环有两个核心问题:
- 控件编号范围错误:你只循环了1到
Number,但实际需要覆盖到Number×Number个控件(比如Number=3时是9个) - 编号与行列对应逻辑错误:每个列对应的控件编号是连续的
Number个,应该由列索引q计算起始编号,再结合行索引i得到当前控件的编号
下面是修正后的通用代码,适配任意Number值:
Dim q As Integer, i As Integer Dim txtBoxIndex As Integer For q = 0 To Number - 1 ' 遍历每一列(对应Offset的列参数) For i = 0 To Number - 1 ' 遍历当前列的每一行(对应Offset的行参数) ' 计算当前控件的编号:列索引×Number + 行索引 + 1 txtBoxIndex = q * Number + i + 1 FirstCellToWrite.Offset(i, q).Value = Controls("txtBox" & txtBoxIndex).Text Next i Next q
代码说明:
- 外层循环
q控制列偏移,从0到Number-1,完全对应你原代码里的0、1、2列 - 内层循环
i控制行偏移,从0到Number-1,对应每列的Number行 - 控件编号的计算逻辑:每列有
Number个控件,第q列的起始编号是q*Number +1,加上行索引i就得到当前行的控件编号——比如q=2(第三列)、i=1时,编号是2*3+1+1=8,和你原代码里的txtBox8完全匹配。
(注:如果你原代码最后一列的控件顺序是特殊需求而非笔误,可针对该列单独调整索引计算,但从整体规律看,上面的代码是通用的标准实现)
内容的提问来源于stack exchange,提问作者qwww
相关产品推荐
相关产品推荐

