使用递增单元格引用重复公式

时间:2019-06-05 00:15:23

标签: excel vba

因此,我建立了一个具有绝对单元格引用的公式,并希望在3000个单元格中重复相同的公式,每个引用一个增量单元格。 (第一个公式引用单元格$ A $ 1,第二个公式引用$ A $ 2)我知道我可以轻松地做到这一点,而无需引用确切的单元格和Fill Handle,这是目前的设置方式,但是其中有很多在此电子表格中工作的人具有不良的Excel行为,并定期删除行和单元格或复制并粘贴,这破坏了公式。

我不是要在每个单元格中手动编辑相同的公式以将引用从相对值更改为绝对值,而是要运行一个宏以自动为3000个单元格运行公式。

我最初建立了一个宏,该宏用公式填充了20个单元格,但是它没有根据活动单元格来调整公式。 (在进一步向下启动时,始终以$ A $ 1:$ A $ 20的范围输入,而不是$ A $ 21:$ a $ 40的范围)我将宏更改为循环,但它看起来包含所有引用$ A $ 1而不是更新的公式。

设置为循环的宏如下:

Sub HDDatesRef()

ActiveCell.Select
ActiveCell.FormulaR1C1 = "=IF(AND(HD!R1C1>0,ISBLANK(HD!R1C4)),HD!R1C1,""n/a"")"
ActiveCell.Offset(1, 0).Range("A1").Select

Loop Until ActiveCell.Value = ""

End Sub     

解决这个问题的任何帮助都将极大地帮助您。现在,我也可以使用Liknedin Learning,因此,如果在那里有关于课程的建议,我应该研究一下,这样我才能明白我需要做的事情会对此有所帮助。

2 个答案:

答案 0 :(得分:0)

Excel应用程序对象具有一个名为ConvertFormula的函数,您可以使用该函数在引用样式(A1或R1C1)之间更改公式,并指定行和列是相对引用还是绝对引用。

如果首先通过在每行中创建公式作为相对引用开始,则可以使用ConvertFormula将其转换为绝对引用。唯一的限制是该公式不能超过255个字符。

修改您的代码并遵循How to avoid using Select in Excel VBA中的建议可以为我们提供:

Option Explicit

Sub HDDatesRef()

Dim r As Range

' If we know the cell address we want to start in then we could use that directly
' e.g. Set r = Worksheets("HD").Range("E1")
Set r = ActiveCell

Do
    ' The With block just saves us typing r.FormulaR1C1 multiple times
    With r
        ' Don't know what your relative formula would be. I've assumed that we are
        ' working in column E but adjust as appropriate
        .FormulaR1C1 = "=IF(AND(HD!RC[-4]>0,ISBLANK(HD!RC[-1])),HD!RC[-4],""n/a"")"

        ' Take the formula we already have which is in R1C1 format, keep it in R1C1 format,
        ' change it from a relative reference based on cell r to an absolute reference
        ' and make that the new formula for this cell
        .FormulaR1C1 = Application.ConvertFormula(.FormulaR1C1, xlR1C1, xlR1C1, xlAbsolute, r)
    End With

    ' Move down one row
    Set r = r.Offset(1, 0)
Loop Until r.Value = ""

End Sub

以防您不熟悉它们。这是Option ExplicitWith...End With

的引用

答案 1 :(得分:0)

您可以在不循环的情况下执行此操作,Excel足够聪明,知道您想要增量。

作为示例,请在一张新纸上运行它:

Sub ShowIncremental()
    Range("A1:A10").Formula = "=Row(A1)"
    Range("B1:B10").Formula = "=A1*2"
    Range("C1:C10").Formula = "=sum(B$1:B1)"
End Sub

请注意在A1:C10中创建的公式。请注意,即使代码没有说出来,Excel也会增加它们的数量,除非我们绝对为B $ 1。

我建议您对代码执行类似的操作以避免循环,这会快得多。