循环使用不同的单元格范围,在每个使用VBA编写公式

我有一个很大的预测电子表格,我正在努力,我试图写公式到不同的单元格范围(对应于几个月)。

Sub prediction() Dim rng As Range, i As Range, colCount As Integer Set rng = ThisWorkbook.Worksheets("mySheet").Range("D20:G20, H20:K20, L20:O20, P20:T20, U20:X20, Y20:AB20, AC20:AG20, AH20:AK20, AL20:AP20, AQ20:AT20, AU20:AX20, AY20:BB20") colCount = 3 For Each i In rng i.Formula = "=ROUNDUP(" & Sheets("Forecast").Cells(16, colCount).Address(True, True, xlA1, True) & "/" & Sheets("Forecast").Cells(5, colCount).Address(True, True, xlA1, True) & ",0)" colCount = colCount + 1 Next i End Sub 

显然,这些范围在工作表中是紧挨着的,而且会发生什么,VBA是按顺序编写公式的。 例如,在D20:G20我想=ROUNDUP(FORECAST!$C$16/FORECAST!$C$5,0) ,但是VBA正在将E20的下一个公式写成=ROUNDUP(FORECAST!$D$16/FORECAST!$D$5,0)等等。

现在,我不知道VBA处理范围的方式是否存在问题(我是VBA的新手),但是我解决这个问题的方式是专门命名单独的范围,然后单独编写公式。

 Set jan = ThisWorkbook.Worksheets("mySheet").Range("D20:G20") Set feb = ThisWorkbook.Worksheets("mySheet").Range("H20:K20") jan.Formula = "=ROUNDUP(" & Sheets("Forecast").Cells(16, 3).Address(True, True, xlA1, True) & "/" & Sheets("Forecast").Cells(5, 3).Address(True, True, xlA1, True) & ",0)" feb.Formula = "=ROUNDUP(" & Sheets("Forecast").Cells(16, 4).Address(True, True, xlA1, True) & "/" & Sheets("Forecast").Cells(5, 4).Address(True, True, xlA1, True) & ",0)" 

等等,这似乎并不优雅,更不用说高效。

问题:我是如何命名范围,或者如何构build循环的问题?

谢谢。

试试这个……它利用一个数组来转换范围组(“D20:G20”等…)为数组元素,当你通过数组循环遍历数组时,可以单独评估这些数组元素For i = lbound(array) to ubound(array) … lbound表示下界,ubound表示上界)。 然后通过设置rng = ThisWorkbook.Worksheets("mySheet").Range(RngArr(i))将每个数组元素转换为一个范围。 最后,通过For Each r In rng遍历范围中的每个单元格。 这允许列整数只在每个数组元素前增加。

  Sub prediction() Dim RngStr As String, i As Integer, colCount As Integer Dim RngArr Dim rng As Range, r As Range RngArr = "D20:G20, H20:K20, L20:O20, P20:T20, U20:X20, Y20:AB20, AC20:AG20, AH20:AK20, AL20:AP20, AQ20:AT20, AU20:AX20, AY20:BB20" RngArr = Split(RngArr, ",") colCount = 3 For i = LBound(RngArr) To UBound(RngArr) Set rng = ThisWorkbook.Worksheets("mySheet").Range(RngArr(i)) For Each r In rng r.Formula = "=ROUNDUP(" & Sheets("Forecast").Cells(16, colCount).Address(True, True, xlA1, True) & "/" & Sheets("Forecast").Cells(5, colCount).Address(True, True, xlA1, True) & ",0)" Next r colCount = colCount + 1 Next i End Sub