我有一个excel宏,它做了两件非常简单的事情:
-
它在一个小窗口中显示当前日期和时间 .
-
它将显示复制为文本字符串,以便根据需要粘贴到其他应用程序中 .
显示的单元格中包含以下公式:
=TEXT(NOW(),"yyyy.MM.dd hh:mm:ss")
每5秒钟,宏刷新时间和时钟滴答 .
我的问题是,当我从单元格复制时间时,我不会始终将内容粘贴到剪贴板 . 有时单元格内容会发布到剪贴板 . 我无法弄清楚为什么它有时会起作用而不是其他因为没有很多事情发生 . 它应该永远有效 .
我知道数据不在剪贴板上,因为我可以尝试将剪贴板粘贴到不同的程序,如记事本和其他文本应用程序,没有任何反应 .
整个代码都在一个模块中 .
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函数以通过选择未格式化的单元格来验证^ C,我可以看到数据一直到达单元格,所以我知道我的问题不在于Range(“a1”) . 复制时的复制步骤或者特殊于细胞f5的特殊情况 .
这使得范围(“a5”) . 复制命令成为复制失败时的坏人,这很奇怪 . 就像复制工作一样,只要数据保存在电子表格中,但无法一致地更新外部剪贴板 .
这个观察导致我尝试将application.cutcopymode设置为xlcopy,true和false以查看是否有帮助 . 我在尝试所有设置时看到的唯一效果是我是否看到f5使用选取框突出显示 - 没有任何设置强制复制到外部剪贴板 .
我试着在复制之前等待一个时钟滴答,看看是否有东西在复制之后清除剪贴板,如果是时候更新时钟了 . 这似乎有所帮助,但同样不一致 .
那么为什么副本无法始终更新剪贴板?为什么它不能工作,什么时候不工作呢?更好的是,我如何修改此代码,以便始终导出到外部剪贴板?
2 回答
尝试使用这种方法,它对我来说总是可靠的
尝试
你说你试过
Application.CutCopyMode
,但你试过那种方式吗?它只强制应用程序在复制其他内容之前清除剪贴板,然后应该在新剪贴板上正确复制 .