[英]Excel VBA Add formula based on row
所以我有上面的表格,我使用 Excel VBA 添加新价格,然后将公式添加到决策列。
如您所见,单元格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($A2>50000,""Ignore"",""Buy"")
当它应该是=IF($A5>50000,""Ignore"",""Buy"")
(应该是$A5
而不是$A2
)。 我究竟做错了什么?
我相信Siddharth的答案就是您想要的。 https://stackoverflow.com/a/25788894/6494460
实际上是一个班轮。 无需使用。自动填充
Range(“ M3:M”&LastRow).Formula =“ = G3&”“,”“&L3”
使用SpecialCells(xlCellTypeBlanks)
您可能会获得非连续范围。 这样,自动填充过程将不适用于A1
公式。 但是有了R1C1
公式,它就可以了。
采用:
.Range("B2:B" & lastrow).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=IF(RC1>50000,""Ignore"",""Buy"")"
RC1
是指R
嗷嗷你目前却总是固定C
olumn 1
。
有关R1C1
参考,请参见https://support.office.com/zh-cn/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]
表示法。 但是,对于不同的语言有一些警告,请参阅文章的结尾。 例子:
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
包含以下内容(将x替换为任意数字)
"=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"")"
和阿克塞尔的答案
"=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的命名可能不同。 当您通过VBA输入公式时,这不会影响公式(我认为),但是如果您想从工作表中输入公式,则需要牢记这一点。 例如,德语为Z1S1。 当使用其他语言版本打开文件时,这也会导致问题。 如果您在公式中使用了INDIRECT("R1C1",FALSE)
,则INDIRECT
和FALSE
将被翻译,但字符串将不起作用,所以它::((最后一部分来自内存)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.