Excel VBA添加基于行的公式
所以我有上面的表格,我使用Excel VBA添加新的价格,然后将公式添加到Decision列。
正如你所看到的,单元格B2
公式应该是=IF($A2>50000,"Ignore","Buy")
,单元格B3公式应该=IF($A3>50000,"Ignore","Buy")
B2
公式是A2
的值, B3
和A3
的值是相同的,依此类推。 我使用下面的VBA将相同的公式添加到空白单元格。 是的,会有空白的决策单元,他们需要公式。 我不能从上到下使用自动填充。 我尝试使用下面(LastRow是usedrange.row):
Sheet1.Range("B2:B" & LastRow).SpecialCells(xlCellTypeBlanks). _ Formula = "=IF($A2>50000,""Ignore"",""Buy"")"
这个VBA的问题甚至在单元格B5
,当它应该=IF($A5>50000,""Ignore"",""Buy"")
=IF($A2>50000,""Ignore"",""Buy"")
时,公式是=IF($A2>50000,""Ignore"",""Buy"")
=IF($A5>50000,""Ignore"",""Buy"")
(应该是$A5
而不是$A2
)。 我究竟做错了什么?
我相信Siddharth的这个答案就是你正在寻找的东西。 https://stackoverflow.com/a/25788894/6494460
这实际上是一个单线程。 无需使用.Autofill
范围(“M3:M”和LastRow).Formula =“= G3&”“,”“&L3”
与SpecialCells(xlCellTypeBlanks)
你可能会得到一个不连续的范围。 有了这个自动填充过程将不适用于A1
公式。 但与R1C1
公式,它会。
使用:
.Range("B2:B" & lastrow).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=IF(RC1>50000,""Ignore"",""Buy"")"
RC1
表示您目前正在使用的R
ow,但始终修复C
olumn 1
。
有关R1C1
参考信息,请参阅https://support.office.com/en-us/article/Overview-of-formulas-7abfda78-eff3-4cc6-b4a7-6350d512d2dc?CorrelationId=2bedf5ef-a3b7-4a82-9b12-6ee86b494ae9&ui=en- US&rs = zh-CN&ad = US#bmusing_references_in_formulas 。 向下滚动到The R1C1 reference style
。
您可以将公式粘贴到所有单元格中,考虑到您在单元格“B2”中具有公式:
Range("B2").Copy Range("B2:B" & LastRow).PasteSpecial xlPasteFormulas
编辑更多细节:可以使用R1C1
引用样式,更重要的是R[1]C[1]
符号。 不过,对不同的语言有一个警告,看到post的最后。 例子:
R2C4 'row 2, column 4 so it's the cell D2 in A1-notation R[2]C[4] 'the cell 2 to the right and 4 down from the current cell (where this reference is located) R[2]C4 'the cell 2 to the right from the current cell in column 4 (D) R[-2]C[-4] 'you can also give negative arguments, this is the cell 2 to the left and 4 up R[2]C 'the same as R[2]C[0] RC[4] 'the same as R[0]C[4] R2C 'the same as R2C[0] RC4 'the same as R[0]C4 R2 'row 2 C4 'column 4 (the same as D:D)
从最后三个例子可以看出,符号不能混合使用。
现在为你的情况:
如果您想在单元格Bx
具有以下内容(将xreplace为任意数字)
"=IF($Ax>50000,""Ignore"",""Buy"")"
这将是R1C1公式
"=IF(RC1>50000,""Ignore"",""Buy"")"
或者更重要的是它是左边的列:
"=IF(RC[-1]>50000,""Ignore"",""Buy"")"
后者就像是从原来的公式中减去$
。
你的第二个公式是
"=IFERROR(VLOOKUP(RC3,Database!$A:$F,3,FALSE),""Missing"")"
和Axel的回答
"=IFERROR(VLOOKUP(RC3,Database!C1:C6,3,FALSE),""Missing"")"
现在应该清楚了。
如果您不想或不能使用formulaR1C1
属性,但仍然使用单个单元格的R1C1样式引用,则可以使用INDIRECT
工作表函数。 INDIRECT("R1C1",FALSE)
是对R1C1
的引用。 FALSE
指示它使用R1C1而不是A1表示法。 如果在引用的单元格中有数字以外的内容,它可能会与简单的引用略有不同。
我个人更喜欢R1C1表示法比A1表示法更好,主要是因为它相对于当前位置更容易引用单元格,而且因为读取高列数字更容易,而且更接近Cells(rowIndex,columnIndex)
语法。
最后一件事:在其他语言版本的Excel中,R1C1的命名可能不同。 这不会影响公式,当你通过VBAinput(我认为),但如果你想从工作表input它,你需要牢记这一点。 在德语中,例如Z1S1。 使用不同的语言版本打开文件时,这也可能导致问题。 如果在公式中使用了INDIRECT("R1C1",FALSE)
,那么INDIRECT
和FALSE
将会被翻译,但是string将不会被使用,所以它将不起作用:((最后一部分来自内存)