我有3个Excelexpression式,我想用电子表格填充范围,我怎样才能确保单元格与行更改?
=IF(AND(G2<>100,TODAY()>=H2, TODAY()<=I2), E2, " ")
-
=IF(N2=" ", " ",NETWORKDAYS(H2,TODAY()))
-
=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])"
其中R
和C
引用当前单元格的偏移量(正值:右或下,负值:向上或向左)。
以类似于此的方式使用它:
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"}]