7

因此,我能想到的在大范围(约 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

但如果列中的值超过一个,则会收到运行时错误类型不匹配错误。

我考虑过插入一列并使用 Then 的公式 R1C1 "=R-1C * 453.592".Value = .Value然后移动列并覆盖但看起来很笨重,我认为粘贴相乘也会慢一些。

那么,有没有人有更好的方法来完成这项任务?

4

4 回答 4

14
Sub Test()

    Dim rngData As Range

    Set rngData = ThisWorkbook.Worksheets("Sheet1").Range("A1:B10")
    rngData = Evaluate(rngData.Address & "*2")
End Sub

有点过时了,但那是你要找的吗?

于 2014-03-25T08:19:38.730 回答
1

不要逐个单元格地更新。它非常慢,VBA 有更好的方法。这是大纲:

  1. 将范围设置为处理所需的所有行/列
  2. 将值复制到VBA中的数组中
  3. 处理数组
  4. 在一次操作中将数组写回到工作表中

这是一个例子:

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
于 2013-09-24T23:58:04.640 回答
0

我需要同样的东西。这就是我的做法。这种方法暂时使用一个单元格来存储“1”以通过特殊粘贴来乘以。

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
于 2021-06-04T16:42:27.493 回答
-1
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
于 2015-04-17T09:34:50.623 回答