我有一个工作的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。
答案 0 :(得分:0)
在您当前的代码中,显而易见的是您只计算特定范围。
Range("C1:F1").Copy Destination:=Ret
Ret.Calculate
因此,Ret
将其更改为整个行范围。
答案 1 :(得分:0)
为了重现您的问题,我必须将Calculation
设置为Manual
。如果Calculation
为Automatic
,则无法重现您的问题。
假设您只想重新计算与复制的单元格匹配的目标单元格,我建议您对代码进行一些小修改,以确保计算目标。此外,根据您的目标,最好保护工作表,以便只能选择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