【问题标题】:Repeating Formula with Incrementing Cell Reference使用递增单元格引用重复公式
【发布时间】:2019-10-20 12:15:49
【问题描述】:

所以我建立了一个具有绝对单元格引用的公式,并希望在 3000 个单元格中重复相同的公式,每个单元格都引用增量单元格。 (第一个公式指的是单元格 $A$1,第二个公式指的是 $A$2)我知道我可以很容易地做到这一点,而无需引用确切的单元格和填充句柄,这是目前的设置方式,但是有大量使用此电子表格工作的人的 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,所以如果对那里的课程有任何建议,我应该研究一下,这样我才能了解我需要做什么,这将对此有所帮助。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    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 的参考文献

    【讨论】:

    • 感谢您在宏本身的代码旁边提供符号,它几乎完美地满足了我的需要。它们位于不同电子表格的 B 列中,因此我只需将 -4 调整为 -1,然后将 -1 调整为 2,它就可以完美运行。虽然没有提到这一点,所以我不能以任何方式反对你。我是 VBA 的新手,因此 cmets 中的所有解释以及指向更多详细信息的链接都非常有帮助。非常感谢!
    【解决方案2】:

    您可以在不循环的情况下执行此操作,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。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多