关闭工作簿时在Excel VBA中禁用剪贴板提示

21

我有一个Excel工作簿,其中使用VBA代码打开另一个工作簿,将一些数据复制到原始工作簿中,然后关闭第二个工作簿。

当我关闭第二个工作簿(使用Application.Close)时,会提示:

是否要保存剪贴板。

在VBA中是否有一个命令可以绕过此提示?


3
我以艰辛的经历学到了这一点:尽可能避免使用剪贴板!当你的代码在运行时,其他程序可能会从剪贴板读取/写入数据,导致意想不到的结果。请注意,复制粘贴使用剪贴板(不安全),而像Chris Neilsen所回答的直接复制则不使用剪贴板(因此是安全的)。 - Jean-François Corbett
7个回答

47

我可以提供两个选项

  1. 直接复制

根据您的描述,我猜测您正在进行类似于

Set wb2 = Application.Workbooks.Open("YourFile.xls")
wb2.Sheets("YourSheet").[<YourRange>].Copy
ThisWorkbook.Sheets("SomeSheet").Paste
wb2.close

如果是这种情况,你不需要通过剪贴板进行复制。这种方法直接从源到目的地进行复制。没有剪贴板中的数据 = 没有提示

Set wb2 = Application.Workbooks.Open("YourFile.xls")
wb2.Sheets("YourSheet").[<YourRange>].Copy ThisWorkbook.Sheets("SomeSheet").Cells(<YourCell")
wb2.close
  1. 禁止提示

你可以通过设置 alert() 函数来防止所有的弹出提示框。

Application.DisplayAlerts = False

[编辑]

  1. 只复制值:完全不使用复制/粘贴

Dim rSrc As Range
Dim rDst As Range
Set rSrc = wb2.Sheets("YourSheet").Range("YourRange")
Set rDst = ThisWorkbook.Sheets("SomeSheet").Cells("YourCell").Resize(rSrc.Rows.Count, rSrc.Columns.Count)
rDst = rSrc.Value

1
如果你关闭了Application.DisplayAlerts,请确保再次打开它(即使在错误情况下)。否则,下一次有人点击关闭并期望看到“是否保存”消息时可能会感到失望。 - Chris Rae
2
使用“一行”方法的一个问题是无法指定“xlpastevalues” - 只能回到剪贴板! - dusio
@dusiod 如果你只需要复制数值,完全不需要使用复制/粘贴。请查看我的编辑。 - chris neilsen
@user3307245 你(部分地)是正确的。更新后的答案现在按预期工作(注意:其他用户拒绝了你的编辑)。 - chris neilsen
1
“直接复制”无论如何都使用剪贴板。如果在宏执行期间打开记事本并进行粘贴操作,您将从电子表格中获取数据。 - Fabien TheSolution

18

如果我可以再提供一个解决方案:您可以使用此命令简单地取消剪贴板:

Application.CutCopyMode = False

太好了!谢谢。 - Wheeliam
在我的测试中,上面那行的位置似乎很重要。例如,如果我在实际粘贴和这行代码之间执行其他操作,剪贴板提示会不断出现,但是如果我把这行代码放在我执行粘贴的那一行紧接着后面,那么它就可以完美地工作了。我不确定为什么会发生这种情况,或者是否可以复制这种情况,只是想提一下,以防万一... - Yin Cognyto

4

我曾经遇到过这个问题 - 从这个问题的表现来看,如果你在退出时实际上不需要剪贴板,那么你可以使用我曾经用过的简单解决方案。只需清空剪贴板。:)

ActiveCell.Copy

0

关闭前清空剪贴板。

Application.CutCopyMode=False
ActiveWindow.Close

0

有一个简单的解决方法。当您的剪贴板中有大量数据时,警告才会出现。在关闭工作簿之前,只需复制一个随机单元格,它就不会再出现了!


1
当 Excel 刚出现时,它可能是一个很大的数量,但现在通常是微不足道的数量。 - mcmillab

0
如果您不想保存任何更改并且不希望在使用宏保存Excel文件时出现保存提示,则此代码可能对您有所帮助。
Sub Auto_Close()

     ThisWorkbook.Saved = True

End Sub

因为Saved属性被设置为True,Excel会响应得像工作簿已经保存过一次,并且自上次保存以来没有进行任何更改,所以不会出现保存提示。

-1

如果您替换该行,则建议的解决方案编辑可行。

Set rDst = ThisWorkbook.Sheets("SomeSheet").Cells("YourCell").Resize(rSrc.Rows.Count, rSrc.Columns.Count)

使用

Set rDst = ThisWorkbook.Sheets("SomeSheet").Range("YourRange").Resize(rSrc.Rows.Count, rSrc.Columns.Count)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接