繁体   English   中英

使用VBA变量而不是代表该公式的长字符串将公式写入Excel单元格?

[英]Write formulas to Excel cell using VBA variables instead of a long string representing the formula?

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

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

是否有另一种方法可以类似地将公式写入一系列单元格,但使用更多的VBA变量和更少的字符串?

就像是

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

基本上,在大多数情况下,基本上在excel中编写公式是关于用地址填充函数的参数。 这些地址仅在引用输入工作表的工作表之外的范围时才需要外部引用。

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"))

(与@ChipsLetten很好地解释了Application.WorksheetFunction上的问题,让我们集中讨论excel公式)

因此,上面的公式可以写成如下:

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

要么

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

现在,如果您真的想使用变量来编写此公式,我建议创建类似以下的字符串变量:

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

那么公式将是

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

如果在代码中多次使用这些范围,以上内容将是切实有效的。在这种情况下,创建范围变量如

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 & ")"

如果公式引用了另一个工作簿或工作表,并且我们使用的是范围变量。 rOthFmlRngrOthFmlRsm1是同一工作簿中另一个工作表的范围

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

只需将外部参数添加到范围的地址,如下所示:

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属性和使用&的串联。

我不确定会为您节省多少时间或空间,但是如果您更喜欢在工作表范围内使用vba变量,则可以使用。

您可以在此处阅读有关Range.Address的更多信息: https ://msdn.microsoft.com/zh-cn/library/office/ff837625.aspx

您可以在此处阅读有关串联的更多信息: http : //www.techonthenet.com/excel/formulas/concat2.php

Application.WorksheetFunction对象用于在VBA代码中使用Excel函数,以便您的代码可以随后使用结果。 如果要使用范围而不是字符串来构建Excel公式,则需要使用实际的函数名称作为字符串,然后附加范围地址。 您需要注意绝对和相对单元地址。 您的示例将变为:

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寻址样式。

暂无
暂无

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

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