变体数组删除 excel 中的公式
Varriant Array remove formulas in excel
你好,我最近发现了通过变体数组进行循环的非常快速的方法
With Sht
LongY = .Rows.Count
Dat = .Formula
For r = 5 To 6 'LongY
If (Dat(r, 1) = "" Or Dat(r, 4) = "") Then GoTo IgnoRow
LongX = .Columns.Count
For s = 26 To 27 'LongX
If (Dat(2, s) = 0 Or Dat(2, s) = "") Then GoTo IgnoCol 'Or Dat(1, s).EntireColumn.Hidden = True
Price = Dat(2, s)
Ammount = Dat(r, 4)
Base = Dat(r, s)
Material = Application.WorksheetFunction.RoundUp((Base * Ammount), 2) 'no .values => text
'MsgBox (Material)
'CPrice = Material * Price
'Cost = Cost + CPrice
IgnoCol:
Next
'Dat(r, 5) = Cost
'Cost = ""
IgnoRow:
Next
Sht.Formula = Dat
End With
End Sub
但我不知道它是如何工作的,这给我带来了麻烦。我有很大的输入区域(也有公式),所以当我在这个区域循环时,我所有的 EXCEL FORMULAS 转换为 .values,我不知道如何避免这种情况。
感谢您的任何想法。
删除了无关紧要的内容后,您的原始代码将执行以下操作:
With Table ' Note: Table is a Range
Dat = .Value ' Dat is now an array of values, with Table.Rows.Count rows
' and Table.Columns.Count columns.
.Value = .Dat ' This copies all the values back into the Table cells,
' replacing any existing formulas with their values.
End With
将 Excel 范围内的所有值提取到 VBA 数组中是一种我以前从未见过的技术,但它速度非常快并且代码易于阅读,所以我会从现在开始使用它。
但这种便利是有代价的。如果将 VBA 数组中的所有值都传回范围,则会清除所有公式。
如果您提取的是公式而不是值(这样您就可以安全地复制回来),您将无法访问任何基于公式的单元格的值。这就是您最近的代码失败的原因。
最简单的解决方案是提取值和公式,但只复制回公式。
Dim Formulas() As Variant, Values() As Variant
With Sht ' Sht is a Range object
Values = .Value
Formulas = .Formula
For r = ...
For s = ...
price = Values(2, s)
Ammount = Values(r, 4)
Base = Values(r, s)
Material = Round(Base * Ammount + 0.005, 2) ' Round Up
Cost = ...
Next
Formulas(r, 5) = Cost
Next
.Formula = Formulas
End With
你好,我最近发现了通过变体数组进行循环的非常快速的方法
With Sht
LongY = .Rows.Count
Dat = .Formula
For r = 5 To 6 'LongY
If (Dat(r, 1) = "" Or Dat(r, 4) = "") Then GoTo IgnoRow
LongX = .Columns.Count
For s = 26 To 27 'LongX
If (Dat(2, s) = 0 Or Dat(2, s) = "") Then GoTo IgnoCol 'Or Dat(1, s).EntireColumn.Hidden = True
Price = Dat(2, s)
Ammount = Dat(r, 4)
Base = Dat(r, s)
Material = Application.WorksheetFunction.RoundUp((Base * Ammount), 2) 'no .values => text
'MsgBox (Material)
'CPrice = Material * Price
'Cost = Cost + CPrice
IgnoCol:
Next
'Dat(r, 5) = Cost
'Cost = ""
IgnoRow:
Next
Sht.Formula = Dat
End With
End Sub
但我不知道它是如何工作的,这给我带来了麻烦。我有很大的输入区域(也有公式),所以当我在这个区域循环时,我所有的 EXCEL FORMULAS 转换为 .values,我不知道如何避免这种情况。
感谢您的任何想法。
删除了无关紧要的内容后,您的原始代码将执行以下操作:
With Table ' Note: Table is a Range
Dat = .Value ' Dat is now an array of values, with Table.Rows.Count rows
' and Table.Columns.Count columns.
.Value = .Dat ' This copies all the values back into the Table cells,
' replacing any existing formulas with their values.
End With
将 Excel 范围内的所有值提取到 VBA 数组中是一种我以前从未见过的技术,但它速度非常快并且代码易于阅读,所以我会从现在开始使用它。
但这种便利是有代价的。如果将 VBA 数组中的所有值都传回范围,则会清除所有公式。
如果您提取的是公式而不是值(这样您就可以安全地复制回来),您将无法访问任何基于公式的单元格的值。这就是您最近的代码失败的原因。
最简单的解决方案是提取值和公式,但只复制回公式。
Dim Formulas() As Variant, Values() As Variant
With Sht ' Sht is a Range object
Values = .Value
Formulas = .Formula
For r = ...
For s = ...
price = Values(2, s)
Ammount = Values(r, 4)
Base = Values(r, s)
Material = Round(Base * Ammount + 0.005, 2) ' Round Up
Cost = ...
Next
Formulas(r, 5) = Cost
Next
.Formula = Formulas
End With