为什么Excel VBA复制到剪贴板不一致?

我有一个非常简单的Excelmacros:

  1. 它在一个小窗口中显示当前date和时间。
  2. 它将显示复制为文本string,以根据需要粘贴到其他应用程序中。

显示的单元格中有以下公式:

=TEXT(NOW(),"yyyy.MM.dd hh:mm:ss") 

macros5秒钟刷新时间和时钟滴答。

我的问题是,当我从单元格中复制时间时,我并不总是将内容粘贴到剪贴板。 有时单元格内容被张贴到剪贴板。 我无法弄清楚为什么它有时会起作用,而不是别人,因为没有太多事情要做。 它应该总是工作。

我知道数据不在剪贴板上,因为我可以尝试将剪贴板粘贴到不同的程序(如记事本和其他文本应用程序)中,而不会发生任何事情。

整个代码都在一个模块中。

  Dim stopSwitch As Integer Dim NextTick Sub myupdate() If ActiveCell.Address = "$B$1" Then growWindow ' resize window beyond just clock display stopTime ' Exit Sub ' stop updating End If Range("a1").Select Calculate DoEvents If ActiveWorkbook.Name = "calendar clock.xlsb" Then shrinkWindow NextTick = Now + TimeValue("00:00:05") ' give me 5 seconds to copy/paste Application.OnTime NextTick, "myupdate" ThisWorkbook.Save ' futile attempt to prevent save dialog End Sub Sub auto_open() ' to stop clock, tap right arrow to select cell b1 when workbook is active Range("a1").Select myupdate End Sub Sub growWindow() Application.Width = 768 Application.Height = 621.75 ThisWorkbook.Save End Sub Sub shrinkWindow() ' strip decorations so window is as small as possible Application.DisplayFormulaBar = False ActiveWindow.DisplayGridlines = False ActiveWindow.DisplayHeadings = False ' move window to second monitor and size to single cell display Application.WindowState = xlNormal Application.Top = 0 Application.Left = -720 Application.Width = 174 Application.Height = 127 ActiveWindow.WindowState = xlMaximized End Sub Sub stopTime() ' called when workbook is closed On Error Resume Next Application.OnTime NextTick, "myupdate", schedule:=False Range("b1").Select End Sub Sub copyTime() Range("a1").Copy ' copy time Range("f5").PasteSpecial xlPasteValues ' strip formatting Range("f5").Copy ' copy time as text DoEvents ' hack to attempt to make copy work consistently End Sub 

上面的代码调整窗口的大小,每5秒更新一次时钟。

要将时钟作为文本复制到剪贴板,我在工作簿中有以下代码

 Private Sub Workbook_Activate() Application.OnKey "^c", "module1.copyTime" End Sub Private Sub Workbook_Deactivate() Application.OnKey "^c" End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) ' turn off auto update Module1.stopTime ' resize window so if I open another spreadsheet, it's a reasonable size Application.WindowState = xlNormal Application.Width = 768 Application.Height = 621.75 Application.OnKey "^c" ThisWorkbook.Save ' try to prevent save dialog at close End Sub 

我修改了copyTime函数,通过select未格式化的单元格来validation^ C,我可以看到数据一致地进入单元格,所以我知道我的问题不在Range(“a1”)中。或者粘贴到单元格f5。

当复制失败的时候,将范围(“a5”)。复制命令作为坏的参与者,这是奇怪的。 就好像只要数据保存在电子表格中一样,复制就可以工作,但却无法一直更新外部剪贴板。

这一观察导致我尝试将application.cutcopymode设置为xlcopy,true和false来查看是否有帮助。 我尝试所有设置的唯一效果是我是否看到f5突出显示与选取框或没有设置强制复制到外部剪贴板。

我试图在复制之前等待一个时钟滴答滴答,看是否有什么东西正在清除复制后的剪贴板,如果是时候更新时钟。 这似乎有所帮助,但又不一致。

那么为什么副本不能总是更新剪贴板呢? 而为什么它不工作时,它不这样做呢? 更好的是,我怎样才能修改这个代码,所以它总是导出到外部剪贴板?

尝试使用这种方法,对我来说总是可靠的

 Dim TimeInClip As MSForms.DataObject Set TimeInClip = New MSForms.DataObject TimeInClip.SetText Range("A1").Value TimeInClip.PutInClipboard 

尝试

 Sub copyTime() Range("a1").Copy ' copy time Range("f5").PasteSpecial xlPasteValues ' strip formatting Application.CutCopyMode = False ' Clear Excel clipboard Range("f5").Copy ' copy time as text DoEvents ' hack to attempt to make copy work consistently End Sub 

你说你尝试了Application.CutCopyMode ,但是你试过了吗?
它只会强制应用程序在复制别的东西之前清除剪贴板,然后应该在新剪贴板上正确地复制。