【发布时间】:2014-12-23 07:51:52
【问题描述】:
我有复制第一行并将值粘贴到多行的 VBA 代码。以下代码运行良好并按预期粘贴行:
Sub Macro1()
Dim i As Long
Application.Calculation = xlCalculationManual
Range("A1:M1").Select
Selection.Copy
For i = 1 To 50
Range("A" & i).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next i
End Sub
但是,如果我将Application.Calculation = xlCalculationManual 向下移动两行,则代码会引发 1004 运行时错误:
Sub Macro1()
Dim i As Long
Range("A1:M1").Select
Selection.Copy
Application.Calculation = xlCalculationManual
For i = 1 To 50
Range("A" & i).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next i
End Sub
我在此处搜索了有关 VBA 语言参考站点的信息:http://msdn.microsoft.com/en-us/library/office/jj692818(v=office.15).aspx 和此处的 Excel 开发人员参考站点:http://msdn.microsoft.com/en-us/library/office/ff194068(v=office.15).aspx。
此外,我已使用在 Windows 7 上运行的 Excel 2010 和在 Windows 8.1 上运行的 2013 验证了此错误。
谁能帮我理解为什么Application.Calculation = xlManualCalculation 的位置会影响代码的运行方式?
编辑:
我运行了一些额外的测试来检查焦点是否丢失或剪贴板是否被清除。首先看是否失去焦点,我记录了一个用 ctrl + x 复制第一行的宏,然后我更改了工作簿的计算模式,然后我再次按 ctrl + x 而不重新选择单元格。这是生成的宏:
Sub MacroFocusTest()
Range("A1:M1").Select
Selection.Copy
Application.CutCopyMode = False 'Macro recording entered this.
Application.Calculation = xlManual
Selection.Cut 'Range("A1:M1") is cut on the worksheet suggesting focus was not lost.
End Sub
接下来,我在原始 Macro1 中输入了一个变量,以在执行的各个阶段捕获 Application.CutCopyMode。以下是生成的宏:
Sub Macro1()
Dim i As Long
Dim bCCMode as Boolean
bCCMode = Application.CutCopyMode ' False
Range("A1:M1").Select
Selection.Copy
bCCMode = Application.CutCopyMode ' True
Application.EnableEvents = False ' Included because I mention in comments no error is thrown using this
bCCMode = Application.CutCopyMode ' True
Application.Calculation = xlCalculationManual
bCCMode = Application.CutCopyMode ' False
For i = 1 To 50
Range("A" & i).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next i
End Sub
基于这两个测试的结果,我认为 Application.Calculation = xlCalculationManual 不会导致范围失去焦点,但会清除剪贴板。
【问题讨论】:
标签: vba excel selection copy-paste