您好我最近发现了通过变量数组继续循环的快速方法
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,我不知道如何避免这种情况。
感谢您的任何想法。
答案 0 :(得分:1)
删除红色鲱鱼后,原始代码会执行此操作:
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