为什么 Excel vba 复制到剪贴板不一致?
Why does Excel vba copy to clipboard inconsistently?
我有一个 excel 宏,可以做两件非常简单的事情:
- 显示当前日期和时间 window.
- 它将显示复制为文本字符串,以便根据需要粘贴到其他应用程序中。
显示的单元格中有以下公式:
=TEXT(NOW(),"yyyy.MM.dd hh:mm:ss")
宏每 5 秒刷新一次时间,时钟滴答作响。
我的问题是,当我从单元格中复制时间时,我无法始终将内容粘贴到剪贴板。有时单元格内容会发布到剪贴板。我不明白为什么它有时会起作用,而其他的却不起作用,因为没有太多事情发生。它应该总是有效。
我知道数据不在剪贴板上,因为我可以尝试将剪贴板粘贴到不同的程序(如记事本和其他文本应用程序)中,但没有任何反应。
整个代码都在一个模块中。
Dim stopSwitch As Integer
Dim NextTick
Sub myupdate()
If ActiveCell.Address = "$B" 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
以上代码调整 window 大小并每 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 是否可见,我可以看到数据始终进入单元格,所以我知道我的问题不在于范围("a1").copy step in copytime 或 pastespecial 到单元格 f5。
这使得 range("a5").copy 命令在复制失败时成为坏角色,这很奇怪。就好像只要数据保存在电子表格中,复制就可以工作,但不能一致地更新外部剪贴板。
这一观察促使我尝试将 application.cutcopymode 设置为 xlcopy,true 和 false 以查看是否有帮助。尝试所有设置后,我看到的唯一效果是我是否看到 f5 用选取框突出显示 - none 设置强制复制到外部剪贴板。
我试着在复制之前等待时钟滴答声,看看是否有东西在复制之后清除剪贴板,如果是时候更新时钟了。这似乎有所帮助,但又不是始终如一。
那么为什么复制失败总是更新剪贴板?为什么它不起作用时不起作用,而当它起作用时呢?更好的是,我如何修改此代码以使其始终导出到外部剪贴板?
尝试
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
,但你试过吗?
它只会强制应用程序在复制其他内容之前清除剪贴板,然后应该在新的剪贴板上正确复制。
试试这个方法,对我来说总是可靠的
Dim TimeInClip As MSForms.DataObject
Set TimeInClip = New MSForms.DataObject
TimeInClip.SetText Range("A1").Value
TimeInClip.PutInClipboard
我有一个 excel 宏,可以做两件非常简单的事情:
- 显示当前日期和时间 window.
- 它将显示复制为文本字符串,以便根据需要粘贴到其他应用程序中。
显示的单元格中有以下公式:
=TEXT(NOW(),"yyyy.MM.dd hh:mm:ss")
宏每 5 秒刷新一次时间,时钟滴答作响。
我的问题是,当我从单元格中复制时间时,我无法始终将内容粘贴到剪贴板。有时单元格内容会发布到剪贴板。我不明白为什么它有时会起作用,而其他的却不起作用,因为没有太多事情发生。它应该总是有效。
我知道数据不在剪贴板上,因为我可以尝试将剪贴板粘贴到不同的程序(如记事本和其他文本应用程序)中,但没有任何反应。
整个代码都在一个模块中。
Dim stopSwitch As Integer
Dim NextTick
Sub myupdate()
If ActiveCell.Address = "$B" 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
以上代码调整 window 大小并每 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 是否可见,我可以看到数据始终进入单元格,所以我知道我的问题不在于范围("a1").copy step in copytime 或 pastespecial 到单元格 f5。
这使得 range("a5").copy 命令在复制失败时成为坏角色,这很奇怪。就好像只要数据保存在电子表格中,复制就可以工作,但不能一致地更新外部剪贴板。
这一观察促使我尝试将 application.cutcopymode 设置为 xlcopy,true 和 false 以查看是否有帮助。尝试所有设置后,我看到的唯一效果是我是否看到 f5 用选取框突出显示 - none 设置强制复制到外部剪贴板。
我试着在复制之前等待时钟滴答声,看看是否有东西在复制之后清除剪贴板,如果是时候更新时钟了。这似乎有所帮助,但又不是始终如一。
那么为什么复制失败总是更新剪贴板?为什么它不起作用时不起作用,而当它起作用时呢?更好的是,我如何修改此代码以使其始终导出到外部剪贴板?
尝试
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
,但你试过吗?
它只会强制应用程序在复制其他内容之前清除剪贴板,然后应该在新的剪贴板上正确复制。
试试这个方法,对我来说总是可靠的
Dim TimeInClip As MSForms.DataObject
Set TimeInClip = New MSForms.DataObject
TimeInClip.SetText Range("A1").Value
TimeInClip.PutInClipboard