2015-11-30 59 views
6

我有一個Excel宏做兩個非常簡單的事情:爲什麼Excel vba複製到剪貼板不一致?

  1. 它顯示在一個小窗口中的當前日期和時間。
  2. 它將顯示內容複製爲文本字符串,以根據需要粘貼到其他應用程序中。

所顯示的細胞中有下面的公式:

=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是通過選擇未格式化的細胞可見,我可以看到數據一致地進入單元格,所以我知道我的問題不在範圍(「a1」)中,在複製時間複製步驟或將粘貼單元複製到單元格f5。

剩下的範圍(「A5」)。複製命令作爲壞人當複製失敗這是奇怪的。就好像只要數據保存在電子表格中一樣,複製就會工作,但無法持續更新外部剪貼板。

這個意見使我嘗試設置application.cutcopymode到xlcopy,真假,看看是否有幫助。我嘗試所有設置時看到的唯一效果是我是否看到f5使用選取框突出顯示 - 沒有任何設置強制複製到外部剪貼板。

我試圖複製到看看是否有被清除剪貼板中如果是時候更新時鐘複製以下之前等待一個時鐘週期。這似乎有所幫助,但是,再次不一致。

那麼,爲什麼拷貝無法總是更新剪貼板?爲什麼它不起作用,當它不起作用時呢?更好的是,我怎樣才能修改這段代碼,以便它總是輸出到外部剪貼板?

+0

難道我的回答幫助? – Sifu

+0

不幸的是不是四福。不過謝謝。 Steven Martin使用msforms'putinclipboard方法的解決方案似乎很穩固。 – Michael

回答

5

嘗試使用這種方法,它總是可靠的,我

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

在2015.11.30 19:53:04,我停止了試圖打破你的解決方案。有用!謝謝! – Michael

0

嘗試

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,但你有沒有嘗試過這樣的說法?
它只會強制應用程序在複製其他內容之前清除剪貼板,然後應該在新剪貼板上正確複製。

+0

是的。我試過= false,= true和= copy。我看到的唯一效果是這個選框是否會顯示。複製否則不一致。我希望微軟能夠記錄模式的目的是什麼,而不是僅僅說明它允許的值。 – Michael