您是否应在VBA代码中使用绝对引用

时间:2018-10-23 15:32:26

标签: excel vba excel-vba

在清理和优化大量VBA代码时,我想到了以前从未有过的东西。在下面的代码块中可以看到,我始终对“静态”单元格使用绝对单元格引用,当在VBA中编写公式时,该单元格必须始终引用相同的地址。我知道在公式中使用绝对引用的重要性,但是是否有必要始终以这种方式引用此类单元格? 例如,(单元格G12的)第一个引用是否为“ .Range(” G12“)。Formula =” = SUM(J16:J“&LastCORow)* $ G $ 12”是否为“ $ G $ 12”公式中使用的单元格值。 我问这是必要还是好的编码实践。

' refresh the formulas
       ' G8  Materials   =SUM(F16:F34)
       ' G9  Labor       =SUM(H16:H34)
       ' G10 Hours       =SUM(I16:I34)
       ' G11 SubContracts    -->depends on G2 (Markup)
       ' G12 Profit Margin   -->depends on G3    (Profit/Overhead)

       ' set the subcontracts formula and label
        If Len(.Range("E11").value) Then  ' if the Invoice was set to markup the Sucontracts
            .Range("G11").Formula = "=SUM(G16:G" & LastCORow & ")*(1+$G$2)"
            .Range("E11").value = "Subcontracts (" & (.Range("G2") * 100) & "% Markup):"
        Else
            .Range("G11").Formula = "=SUM(G16:G" & LastCORow & ")"
            .Range("E11").value = "Subcontracts:"
        End If

        ' G8  Materials
        .Range("G8").Formula = "=SUM(F16:F" & LastCORow & ")"
        ' G9  Labor
        .Range("G9").Formula = "=SUM(H16:H" & LastCORow & ")"
        ' G10 Hours
        .Range("G10").Formula = "=SUM(I16:I" & LastCORow & ")"
        ' G12 Profit Margin   -->depends on G3    (Profit/Overhead)
        .Range("G12").Formula = "=SUM(J16:J" & LastCORow & ",K4,J8:J10,($G$2*SUM(G16:G" & LastCORow & ")))* $G$3"
        ' Lastly the job total
        .Range("C" & LastCORow + 4).Formula = "=ROUND(SUM(J16:J" & LastCORow & ",K4,J8:J10, ($G$2*SUM(G16:G" & LastCORow & ")))*(1+$G$3),0)"

在前面的代码中,G列中的所有值都用作公式中的计算变量,其地址永不更改。所以简单地说,问题是它们都需要绝对引用吗??

2 个答案:

答案 0 :(得分:1)

如果您的引用单元格从不更改地址,那么可以:绝对引用正确。

在公式中使用绝对地址还是相对地址没有唯一答案。这完全取决于您如何使用数据。就您而言,将它们设为绝对是很有意义的。

答案 1 :(得分:0)

我的偏好是让他们保持亲戚关系。这样,如果有人在右边复制一个求和公式,它将对该列求和。

保持相对关系的第二个原因是,如果用户手动创建一个求和公式,它将是相对的。因此,在代码中执行相同操作很有意义。