繁体   English   中英

Excel VBA根据行添加公式

[英]Excel VBA Add formula based on row

在此处输入图像描述

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

如您所见,单元格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($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) ,则INDIRECTFALSE将被翻译,但字符串将不起作用,所以它::((最后一部分来自内存)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM