如何通过 VBA 代码将公式的结果直接写入 excel 范围
how to write results of a formula directly into an excel range by VBA code
我为每个 listobject 列提供了一系列函数。该文件很重而且会崩溃,所以我只想将每个公式的结果保留为静态值。我可以将公式分配给范围并要求 excel 将范围转换为值。但我想知道是否有办法让 VBA 只写范围内的静态值而不是公式本身。
这是我目前所拥有的:
Sub calculate2()
Dim i As Long, t As Long
t = Timer
With Sheet3.ListObjects(1)
For i = 3 To 9
.ListColumns(i).DataBodyRange.ClearContents
.Range.Cells(2, i).Formula = sheets3.range("formula").cells(i,1).formula
.ListColumns(i).DataBodyRange = .ListColumns(i).DataBodyRange.Value
Next i
End With
Debug.Print Timer - t
End Sub
作为对我自己问题的回答,
我一直在寻找的是:“ application.Evaluate ” 我将其发布,以便如果有人通过搜索来到这里,可以找到我最终找到的想法和解决方案。这是一个例子:
Sheet3.ListObjects(1).ListColumns(3).DataBodyRange = [IFERROR(IF(COUNTIFS(ZZ84!$B:$B,[WO],ZZ84!$E:$E,"=*V99",ZZ84!$L:$L,"<>")=1,1,0),"")]
在这种情况下,不需要循环,并且必须为每个范围编写必要的代码行(将函数嵌入 VBA,这是我非常期待的)。上述函数与直接将其放入 excel 单元格的唯一不同是使用 [WO] 而不是 [@WO]。因此评估计算一个数据数组并直接将其写入指定范围。 (这里是列表列 3 的主体范围)。
对我来说,它有助于避免由于我的函数计算无效而导致的崩溃。
另一个简单的例子是:
range("b1:b10")=[if(row(1:10),if(a1:a10>3,"big","Small"))]
或
range("b1:b10") = evaluate("if(row(1:10),if(" & range("a1:a10").address&">3,""big"",""small""))")
亲切的问候,
M
我为每个 listobject 列提供了一系列函数。该文件很重而且会崩溃,所以我只想将每个公式的结果保留为静态值。我可以将公式分配给范围并要求 excel 将范围转换为值。但我想知道是否有办法让 VBA 只写范围内的静态值而不是公式本身。 这是我目前所拥有的:
Sub calculate2()
Dim i As Long, t As Long
t = Timer
With Sheet3.ListObjects(1)
For i = 3 To 9
.ListColumns(i).DataBodyRange.ClearContents
.Range.Cells(2, i).Formula = sheets3.range("formula").cells(i,1).formula
.ListColumns(i).DataBodyRange = .ListColumns(i).DataBodyRange.Value
Next i
End With
Debug.Print Timer - t
End Sub
作为对我自己问题的回答, 我一直在寻找的是:“ application.Evaluate ” 我将其发布,以便如果有人通过搜索来到这里,可以找到我最终找到的想法和解决方案。这是一个例子:
Sheet3.ListObjects(1).ListColumns(3).DataBodyRange = [IFERROR(IF(COUNTIFS(ZZ84!$B:$B,[WO],ZZ84!$E:$E,"=*V99",ZZ84!$L:$L,"<>")=1,1,0),"")]
在这种情况下,不需要循环,并且必须为每个范围编写必要的代码行(将函数嵌入 VBA,这是我非常期待的)。上述函数与直接将其放入 excel 单元格的唯一不同是使用 [WO] 而不是 [@WO]。因此评估计算一个数据数组并直接将其写入指定范围。 (这里是列表列 3 的主体范围)。
对我来说,它有助于避免由于我的函数计算无效而导致的崩溃。
另一个简单的例子是:
range("b1:b10")=[if(row(1:10),if(a1:a10>3,"big","Small"))]
或
range("b1:b10") = evaluate("if(row(1:10),if(" & range("a1:a10").address&">3,""big"",""small""))")
亲切的问候, M