我有3个Excelexpression式,我想用电子表格填充范围,我怎样才能确保单元格与行更改?

  1. =IF(AND(G2<>100,TODAY()>=H2, TODAY()<=I2), E2, " ")
  2. =IF(N2=" ", " ",NETWORKDAYS(H2,TODAY()))
  3. =IF(OR(O2 = " ", O2 <= 0), " ", (O2/N2)*100)

这些是三个公式,我想确保在插入到工作表中时,单元格引用仍将更改为匹配它们所在的行,就像在普通的电子表格中一样。 任何意见将不胜感激! (为了澄清,我需要使用VBA来填充范围,因为我使用的代码每次运行时都会清除工作表。)

您可以使用Range对象的FormulaR1C1属性,对范围地址使用“R1C1”表示法

例如在“A1”中插入你的第一个公式是:

 Range("A1").FormulaR1C1 = "=IF(AND(RC7<>100,TODAY()>=RC8, TODAY()<=RC9), RC5, "" "")" 

其中 R将假定当前的单元格行索引,而C7表示固定的 (不随宿主单元位置变化)第7列索引引用,依此类推

如果我正确地解释了你的问题,你需要像下面的东西:

 Option Explicit Sub InsertFormula() Dim i As Long Dim n As Long n = Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To n Cells(i, 1).Formula = "=IF(AND(G2<>100,TODAY()>=H2, TODAY()<=I2), E2, "" "")" Next i End Sub 

将n = 1中的1replacefor i = 1具有最多数据行的列replacefor i = 1那一行到其必须开始的行

你会注意到我已经在公式的末尾添加了额外的引号,这是必要的,因为VBA中的公式中的引号必须被括起来…在更多引号中大声笑

将这个概念应用于其他公式:)

而不是像G2这样的绝对引用,你可以使用一些东西

.FormulaR1C1 = "=SUM(RC[-2]:R[5]C[-2])"

其中RC引用当前单元格的偏移量(正值:右或下,负值:向上或向左)。

以类似于此的方式使用它:

 Dim c For Each c In Selection c.FormulaR1C1 = "=SUM(RC[-2]:R[5]C[-2])" Next c 

当您将公式设置为单元格范围时,会调整相对引用:

 [A1:B2].Formula = "=C$1" ' now the formula in B2 will become "=D$1" 

您也可以一次设置多个公式:

 Range("K2:M9").Formula = Array("=IF(AND(G2<>100,TODAY()>=H2, TODAY()<=I2), E2, "" "")", _ "=IF(N2="" "", "" "",NETWORKDAYS(H2,TODAY()))", _ "=IF(OR(O2 = "" "", O2 <= 0), "" "", (O2/N2)*100)" ) 

或者如果每一行有不同的公式:

 [A1:Z3] = [{"=1";"=2";"=3"}]