Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将整个范围乘以值?_Excel_Vba - Fatal编程技术网

Excel 将整个范围乘以值?

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

因此,我能想到的在大范围内(大约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("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。以下是大纲:

  • 将范围设置为需要处理的所有行/列
  • 将值复制到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