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

时间:2016-06-27 21:28:01

标签: excel vba excel-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)"

Etc等。这看起来并不优雅,更不用说高效了。

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

感谢。

1 个答案:

答案 0 :(得分:2)

试试这个...... 它利用一个数组将范围组(“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