Excel VBA添加基于行的公式

在这里输入图像说明

所以我有上面的表格,我使用Excel VBA添加新的价格,然后将公式添加到Decision列。

正如你所看到的,单元格B2公式应该是=IF($A2>50000,"Ignore","Buy") ,单元格B3公式应该=IF($A3>50000,"Ignore","Buy") B2公式是A2的值, B3A3的值是相同的,依此类推。 我使用下面的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) ,那么INDIRECTFALSE将会被翻译,但是string将不会被使用,所以它将不起作用:((最后一部分来自内存)