VBA中evaluate()中的跨工作表公式

时间:2016-08-24 21:52:04

标签: excel vba excel-vba

当“数据”表A的相应值落在另一个工作表“结果”的范围内时,我想计算名为“数据”的工作表中第i列的条件最大值。我试着使用下面的代码,但这是错误的:

Worksheets("Result").Cells(r , 4)=Evaluate("=STDEV(IF(Data!A:A>=Result!range(r,1) and Data!A:A<Result!range(r,2),Data!columns(i)))")

编写公式的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您需要从字符串中删除vba部分并与&连接。

并且数组公式不适用于And而是使用*来比较两个布尔值。

Worksheets("Result").Cells(r,4)=Worksheets("Result").Evaluate("=STDEV(IF((Data!A:A>=Result!" & Cells(r,1).Address & ")*(Data!A:A<Result!" & Cells(r,2).Address & "),Data!" & columns(i).Address & "))")

警告: 您正在使用数组公式中的完整列引用。如果你有太多的循环,这将是缓慢的。最好将所有完整列引用更改为数据集的范围。

答案 1 :(得分:2)

根据Scott Craner的建议,我使用Intersect来调整列范围以适应实际数据。

以下是r = 10: i = 5Worksheets("Data")有19行数据的示例输出:

=STDEV(IF((Data!$A$1:$A$19>=Result!$A$10)*Data!$A$1:$A$19<Result!$B$10),Data!@$E$1:$E$19))

声明新变量:

Dim DataA As String, DataI As String, sFormula As String

要插入ir循环的代码:

With Worksheets("Data")
    DataA = Intersect(.Columns("A"), .UsedRange).Address
    DataI = Intersect(.Columns(i), .UsedRange).Address
    sFormula = "=STDEV(IF((Data!" & DataA & ">=Result!$A$" & r & ")*(Data!" & DataA & "<Result!$B$" & r & "),Data!@" & DataI & "))"
End With

With Worksheets("Result")
    .Cells(r, 4) = .Evaluate(sFormula)
End With