Excel 将整个范围乘以值?
因此,我能想到的在大范围内(大约450k行)实现这一点的最佳方法是使用以下Sue-do代码:Excel 将整个范围乘以值?,excel,vba,Excel,Vba,因此,我能想到的在大范围内(大约450k行)实现这一点的最佳方法是使用以下Sue-do代码: Range("A1").Copy ' A1 Contains Value I want to multiply column by Range("MyTable[FooColumn]").PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply 现在这是可行的,但我必须复制并粘贴该值这一事实似乎是多余的,因为该值永远不会改变 For Each c In
Range("A1").Copy ' A1 Contains Value I want to multiply column by
Range("MyTable[FooColumn]").PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply
现在这是可行的,但我必须复制并粘贴该值这一事实似乎是多余的,因为该值永远不会改变
For Each c In Range("MyTable[MyColumnHeader]")
If IsNumeric(c) And Not c = "" Then
c.Value = c.Value * 453.592 ' The value that is in A1 from previos sample
End If
Next
这是可行的,但速度较慢。因为它必须循环每个细胞
我还尝试:
With Range("MyTable[MyColumnHeader]")
.Value = .Value * 453.592
End With
但如果列中有多个值,则收到运行时错误类型不匹配错误
我想插入一列,然后使用“=R-1C*453.592”
的公式1c1,然后.Value=.Value
,然后移动列并覆盖,但看起来很笨重,我认为比粘贴倍增速度还要慢
那么,有没有更好的方法来完成这项任务 不要逐个单元更新。这是非常缓慢的,有一个更好的方法与VBA。以下是大纲:
Public Sub FactorRange(ByRef r_first as Range, ByVal N_rows as Long, _
ByVal N_cols as Long, ByVal factor as Double)
Dim r as Range
'Set range from first cell and size
Set r = f_first.Resize(N_rows,N_cols)
Dim vals() as Variant
' Copy cell values into array
vals = r.Value
Dim i as Long, j as Long
' Do the math
For i=1 to N_rows
For j=1 to N_cols
vals(i,j) = factor * vals(i,j)
Next j
Next i
' Write values back
r.Value = vals
End Sub
有点过时,但这就是你想要的吗 我也需要同样的东西。我是这样做的。这种方法临时使用一个单元格来存储“1”以与“paste special”相乘
return_sheet = ActiveSheet.Name
ActiveWorkbook.Sheets.Add
ActiveSheet.Name = "CopyPaste"
Selection.Value = 1
Selection.Copy
Sheets(return_sheet).Select 'if necessary select range you whant to multiply
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Application.DisplayAlerts = False
Sheets("CopyPaste").Delete
Application.DisplayAlerts = True
Sheets(return_sheet).Select
Hold = Range("A1").Formula ' Save any existing value in A1 to Hold
Range("A1").Value = 1 ' Temporarily replace value with "1"
Range("A1").Copy ' Copy "1" to clipboard
Columns("A:A").PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply ' Paste multiply
Range("A1").Formula = Hold ' Restore original A1 formula (or value, if it wasn't a formula)
Application.CutCopyMode = False ' Clear the clipboard
粘贴特殊乘法后再粘贴特殊值似乎是对初始值的唯一改进method@Floris为什么后面跟着值?如果单元格包含公式而不是数字,则粘贴特殊乘法会导致将
*数字
添加到单元格中-例如,SIN(1)
变为(SIN(1))*453.592
。如果只需执行一次,则可以通过将每个公式替换为值,使电子表格更加紧凑(加载/重新计算可能会更快)。但是,在我看来,你的特制浆糊本身就是一个很好的解决方案。不确定为什么您认为它是“多余的”-您告诉Excel“使用此值,在这里应用它,并使用乘法”。没有比这更短的方法了。@Floris该列不包含任何公式,已经是值了。如果列已经有公式,我只需更改公式,将数字包含在vba中,这将比复制粘贴快得多。我发现让vba在每次运行代码时都需要调用工作表,而不是通过vba工作流中的存储变量一次设置整个列的值,这是不必要的。我不理解您的“每次运行代码”注释。一旦你将数字相乘,你为什么要重复它?它们已经达到了新的价值。如果你再这样做,它们肯定会变得更大。我越来越不了解您想要实现的目标……我已经测试过这种方法,这比我现在的复制粘贴方式要长大约750%。当计算500k行时,此方法平均需要2.38s,而我的方法仅需要0.32s。这个方法仍然循环每个项目,即使它在数组中而不是在工作表中,我的解决方案避免了所有循环。如果没有循环就可以操纵整个数组,那么速度可能会更快,如果没有,那么这个问题就没有答案。嘿,也许你必须使用VBA中的FORTRAN
dll,如果你想加速它,那么速度就快了。这正是我想要的。我喜欢这样,它仍然比我问题中的方法慢,但在10000个单元格中平均只慢5毫秒左右。这是一个很好的答案,也是一个完成工作的好方法!谢谢你的意见!对于任何试图使用此选项的人,请不要忘记将rngData指定回范围,否则工作表本身不会有任何更改(duh!)。@NeverStopLearning为什么不编辑答案,以便VBA新手(我也是)可以正确使用代码?:C
Hold = Range("A1").Formula ' Save any existing value in A1 to Hold
Range("A1").Value = 1 ' Temporarily replace value with "1"
Range("A1").Copy ' Copy "1" to clipboard
Columns("A:A").PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply ' Paste multiply
Range("A1").Formula = Hold ' Restore original A1 formula (or value, if it wasn't a formula)
Application.CutCopyMode = False ' Clear the clipboard