VBA在复制和粘贴公式后计算一系列单元格

时间:2015-06-04 10:17:17

标签: excel vba excel-vba

我有一个工作的VBA函数,它复制一系列单元格中的公式并请求用户想要粘贴的位置。一旦函数粘贴到指定的行中,我就已经包含.Calculate函数来更新公式。
但是,当.Calculate运行时,它仅更新用户输入的范围,而不更新整行 使用下面的代码,假设A2是一个名字,B2是一个姓氏,C2:E2是公式。当输入框出现请求粘贴的位置时,用户可以选择C3:E3并计算所有内容。但是,如果他们只是懒洋洋地单击C3,并且公式被粘贴,则只会更新C3 我该如何修改?

    Sub PasteMacro()

'
' PasteMacro Macro
'
' Keyboard Shortcut: Ctrl+m
'
    On Error Resume Next
    Set Ret = Application.InputBox(Prompt:="Please select a range where you want to paste", Type:=8)
    On Error GoTo 0
    If Not Ret Is Nothing Then
        Selection.Copy

        Range("C2:E2").Copy Destination:=Ret

        Ret.Calculate

            Application.CutCopyMode = False
    End If
End Sub

------------- A ------- B ----------------- C ------- ------------- D ----------------------- E
1 ---------------------------------------- 56 -------- ------------ 66 --------------------- 76
2 ------安德鲁---- M ---------- = SUM(D1:E1)-------- = SUM(E1:F1)----- --- = SUM(F1:G1)
3 --------约翰---- S
假设您有以下excel表。您运行宏并单击C3而不是键入C3:E3 宏将把C2:E2中的公式粘贴到C3:E3中。问题是因为只点击了一个单元格(C3),所以.Calculate函数只会更新该单元格,而不会更新范围C3:E3。

2 个答案:

答案 0 :(得分:0)

在您当前的代码中,显而易见的是您只计算特定范围。

Range("C1:F1").Copy Destination:=Ret

        Ret.Calculate

因此,Ret将其更改为整个行范围。

答案 1 :(得分:0)

为了重现您的问题,我必须将Calculation设置为Manual。如果CalculationAutomatic,则无法重现您的问题。

假设您只想重新计算与复制的单元格匹配的目标单元格,我建议您对代码进行一些小修改,以确保计算目标。此外,根据您的目标,最好保护工作表,以便只能选择C列中的单元格,或者使用所选行作为目标并对列进行硬编码。

例如:

选项明确

Sub PasteMacro()
Dim Ret As Range
Dim RangeToCopy As Range

Set RangeToCopy = Range("C2:F2")
'
' PasteMacro Macro
'
' Keyboard Shortcut: Ctrl+m
'
    Set Ret = Application.InputBox(Prompt:="Please select a range where you want to paste", Type:=8)
    If Not Ret Is Nothing Then    
        RangeToCopy.Copy Destination:=Ret    
        Ret.Resize(1, RangeToCopy.Columns.Count).Calculate

            Application.CutCopyMode = False
    End If
End Sub

甚至:

Option Explicit
Sub PasteMacro()
Dim Ret As Range
Dim RangeToCopy As Range

Set RangeToCopy = Range("C2:F2")
'
' PasteMacro Macro
'
' Keyboard Shortcut: Ctrl+m
'
    Set Ret = Application.InputBox(Prompt:="Please select a range where you want to paste", Type:=8)
    If Not Ret Is Nothing Then

        RangeToCopy.Copy Destination:=Cells(Ret.Row, RangeToCopy.Column).Resize(1, RangeToCopy.Columns.Count)

        Ret.Resize(1, RangeToCopy.Columns.Count).Calculate

            Application.CutCopyMode = False
    End If
End Sub