使用VBAvariables而不是表示公式的长string将公式写入Excel单元格?

我通常使用以下方法将公式从VBA写入Excel单元格中:

wksActual.Range("D48:D52").Formula = "=SUMIF('6. Calculation sheet'!A:A,C48,'6. Calculation sheet'!J:J)" 

有没有一种替代的方法来类似地写一个公式的单元格范围,但使用更多的VBAvariables和更less的string?

就像是

 wksActual.Range("D48:D52").Formula = Application.Worksheetfunction.Sumif(wksActual.Range("A:A"), wksActual.Range("C48"), wksActual.Range("J:J")) 

基本上在Excel中编写公式,大部分时间都是用地址来填充函数的参数。 当这些地址指向input公式的工作表之外的范围时,只需要一个“外部参照”。

OP的示例公式指的是他们将要写入的同一张工作表

 wksActual.Range("D48:D52").Formula = "=SUMIF('6. Calculation sheet'!A:A,C48,'6. Calculation sheet'!J:J)" wksActual.Range("D48:D52").Formula = Application.WorksheetFunction.SumIf(wksActual.Range("A:A"), wksActual.Range("C48"), wksActual.Range("J:J")) 

(在Application.WorksheetFunction上的问题很好的解释@ChipsLetten让我们专注于Excel的公式)

所以上面的公式可以写成如下:

 wksActual.Range("D48:D52").Formula = "=SUMIF(A:A,C48,J:J)" 

要么

 wksActual.Range("D48:D52").Formula = "=SUMIF($A:$A,$C48,$J:$J)" 

现在,如果你真的想使用variables来写这个公式,我会build议创buildstringvariables,如:

 sRngTrg = "D48:D52" sFmlRng = "$A:$A” sFmlCri1 = "$C48" sFmlRsm1 = "$J:$J" 

那么公式会是

 wksActual.Range(sRngTrg).Formula = _ "=SUMIF(" & sFmlRng & "," & sFmlCri1 & "," & sFmlRsm1 & ")" 

如果在代码中多次使用这些范围,上面的内容将是实用和高效的,在这种情况下,创build范围variables

 With wksActual Set rRngTrg = .Range("D48:D52") Set rFmlRng = .Range("$A:$A") Set rFmlCri1 = .Range("$C48") Set rFmlRsm1 = .Range("$J:$J") End With 

公式应该是

 rRngTrg.Formula = "=SUMIF(" & rFmlRng.Address & "," & _ rFmlCri1.Address(0) & "," & rFmlRsm1.Address & ")" 

如果公式引用另一个工作簿或工作表,并且正在使用范围variables。 rOthFmlRngrOthFmlRsm1是来自同一工作簿中另一个工作表的范围

 With wksOther Set rOthFmlRng = .Range("$A:$A") Set rOthFmlRsm1 = .Range("$J:$J") End With 

只需要将External参数添加到范围的地址如下:

 rRngTrg.Formula = "=SUMIF(" & rOthFmlRng.Address(External:=1) & "," & _ rFmlCri1.Address(0) & "," & rOthFmlRsm1.Address(External:=1) & ")" 

rExtWbkRngrExtWbkRsm1是另一个工作簿中工作表的范围

 With Workbooks("Book Open.xlsx").Sheets(1) Set rExtWbkRng = .Range("$A:$A") Set rExtWbkRsm1 = .Range("$J:$J") End With 

和之前一样

 rRngTrg.Formula = "=SUMIF(" & rExtWbkRng.Address(External:=1) & "," & _ rFmlCri1.Address(0) & "," & rExtWbkRsm1.Address(External:=1) & ")" 

是的,您需要知道的两个vba技巧与您刚刚做的相似,都是使用&的Range.Address属性和连接。

我不知道多less时间或空间会节省你,但如果你喜欢使用vbavariables工作表范围,这将工作。

您可以在这里阅读Range.Address的更多信息: https ://msdn.microsoft.com/en-us/library/office/ff837625.aspx

您可以在这里阅读更多的连接: http : //www.techonthenet.com/excel/formulas/concat2.php

Application.WorksheetFunction对象用于使用VBA代码中的Excel函数,以便您的代码可以使用结果。 如果要使用范围而不是string来构buildExcel公式,则需要将实际函数名称用作string,然后附加范围地址。 你需要小心绝对的相对单元格地址。 你的例子会变成:

 wksActual.Range("D48:D52").Formula = "=SUMIF(" & wksActual.Range("A:A").Address & ", " & wksActual.Range("C48").Address(RowAbsolute:=False) & ", " & wksActual.Range("J:J").Address & ")" 

RowAbsolute:=False参数是必需的,因为否则D48:D52每个单元格都在查看单元$ C $ 48。

如果您需要在另一个工作表上引用范围,请使用Address属性的External:=True参数,以便包含工作表名称。 否则,你需要添加"sheet_name"! 之前的范围地址。

您也可以使用FormulaR1C1属性查看对某些函数使用R1C1寻址风格。