gpt4 book ai didi

vba - "Application.Calculation = xlCalculationManual"语句导致 VBA 复制粘贴过程中出现运行时错误 1004

转载 作者:行者123 更新时间:2023-12-02 16:54:53 27 4
gpt4 key购买 nike

我有 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 上运行的 Excel 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 不会导致范围失去焦点,但会清除剪贴板。

最佳答案

与您的特定问题相关,答案是:Application.Calculation = xlCalculationManual 语句会删除剪贴板内存,从而导致代码片段中出现后续运行时错误。

注意:还有另一种建议的解释为“Excel 副本失去焦点”;这可能只是语义上的差异,指向相同的效果,只是措辞不同,但为了更清楚起见,我更喜欢这个,即剪贴板内存(或任何你所说的临时寄存器)丢失值或引用。

证明/说明概念的测试设置和详细说明如下:

'Error occured because a statement
'Application.Calculation = xlCalculationManual
'or Application.Calculation = xlAutomatic
'or Application.Calculation = xlManual
'placed after `Selection.Copy` clears the clipboard memory;
'thus there is nothing to paste and Error 1004 occured
'as demonstrated in the added test code block
Sub YourMacroWithProblem()
Dim i As Long

Range("A1:M1").Select

'Selected Range content is placed to Clipboard memory
Selection.Copy

'This statement erases Clipboard memory
Application.Calculation = xlCalculationManual

' test if clipboard is empty ---------------------
On Error Resume Next
ActiveSheet.Paste
If Err Then MsgBox "Clipboard is Empty": Err.Clear
'-------------------------------------------------

For i = 1 To 50
Range("A" & i).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next i
End Sub

此外,还有一个关于类似主题的旧讨论:从清除剪贴板中停止 VB(链接: http://www.mrexcel.com/forum/excel-questions/459793-stop-vbulletin-clearing-clipboard-3.html )。

您可以考虑针对您的问题采用以下解决方案,以提高速度和可靠性:

Sub Macro2()
Dim i As Long

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

For i = 1 To 50
Range("A1:M1").Copy Destination:=Range("A" & i)
Next i

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

注意:与有问题的代码片段不同,建议的解决方案中不需要 Select 语句和剪贴板复制/粘贴操作,因此任何潜在的副作用也将被最小化。

希望这可以有所帮助。亲切的问候,

关于vba - "Application.Calculation = xlCalculationManual"语句导致 VBA 复制粘贴过程中出现运行时错误 1004,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27576306/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com