2015-11-30 19 views
6

Ich habe einen Excel-Makro, das zwei sehr einfache Dinge tut:Warum Excel VBA inkonsistent in die Zwischenablage kopieren?

  1. Es zeigt das aktuelle Datum und die Uhrzeit in einem kleinen Fenster.
  2. Es kopiert die Anzeige als Textzeichenfolge zum Einfügen in andere Anwendungen nach Bedarf.

Die Zelle, die in ihm angezeigt wird, hat die folgende Formel:

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

Alle 5 Sekunden aktualisiert das Makro die Zeit und die Uhr tickt.

Mein Problem ist, dass wenn ich die Zeit aus der Zelle kopieren, bekomme ich nicht konsequent den Inhalt in die Zwischenablage eingefügt. Manchmal werden die Zelleninhalte in die Zwischenablage übertragen. Ich kann nicht herausfinden, warum es manchmal funktioniert und nicht andere, da nicht viel los ist. Es sollte einfach immer funktionieren.

Ich weiß, dass die Daten nicht in der Zwischenablage sind, weil ich versuchen kann, die Zwischenablage in verschiedene Programme wie Notepad und andere Text-Anwendungen einfügen und nichts passiert.

Der gesamte Code ist in einem einzigen Modul.

 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 

Der obige Code passt das Fenster an und aktualisiert die Uhr alle 5 Sekunden.

die Uhr als Text in die Zwischenablage zu kopieren, ich habe in der Arbeitsmappe den folgenden Code

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 

Ich veränderte die copyTime Funktion^C, um zu überprüfen, indem Sie die unformatierte Zelle ist zu sehen, und ich kann sehen, dass die Daten konsistent zu der Zelle gehen, so weiß ich, dass mein Problem nicht mit dem Bereich ("a1") auftritt. Kopieren Sie den Schritt in der Kopierzeit oder den Pastenspecial in die Zelle f5.

Das lässt den Bereich ("a5"). Kopieren Sie den Befehl als der böse Schauspieler, wenn die Kopie fehlschlägt, was seltsam ist. Es ist, als ob die Kopie funktioniert, solange die Daten in der Tabelle gespeichert sind, aber die externe Zwischenablage nicht konsistent aktualisiert werden kann.

Diese Beobachtung führte mich zu dem Versuch, application.cutcopymode auf xlcopy, True und False zu setzen, um zu sehen, ob das half. Der einzige Effekt, den ich gesehen habe, wenn ich alle Einstellungen ausprobiert habe, ist, ob ich gesehen habe, dass f5 mit einer Auswahlmarkierung hervorgehoben wurde oder nicht - keine der Einstellungen erzwang eine Kopie in die externe Zwischenablage.

Ich habe versucht, vor dem Kopieren auf eine Uhr zu warten, um zu sehen, ob etwas die Zwischenablage nach der Kopie löschte, wenn es Zeit war, die Uhr zu aktualisieren. Das schien etwas zu helfen, aber auch nicht konsequent.

Warum schlägt die Kopie fehl immer die Zwischenablage aktualisieren? Und warum funktioniert es nicht, wenn es nicht funktioniert und wenn es funktioniert? Noch besser, wie kann ich diesen Code ändern, so dass er immer in die externe Zwischenablage exportiert wird?

+0

meine Antwort geholfen hat? – Sifu

+0

Leider nicht Sifu. Danke trotzdem. Steven Martins Lösung, die pstinclipboard-Methode von msforms zu verwenden, scheint solide zu sein. – Michael

Antwort

5

Probieren Sie diese Methode verwenden, ist es für mich immer zuverlässig ist

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

Am 2015.11.30 19:53:04 habe ich aufgehört zu versuchen, Ihre Lösung zu brechen. Es klappt! Vielen Dank! – Michael

0

Versuchen

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 

Sie haben gesagt, Sie Application.CutCopyMode versucht, aber haben Sie es auf diese Weise versucht?
Es zwingt nur die Anwendung, die Zwischenablage zu löschen, bevor Sie etwas anderes kopieren, das dann ordnungsgemäß in der neuen Zwischenablage kopieren sollte.

+0

Ja. Ich habe versucht = false, = true und = copy. Der einzige Effekt, den ich sah, war, ob der Laufzettel angezeigt würde. Die Kopie war sonst inkonsistent. Ich wünschte, Microsoft würde dokumentieren, was der Zweck des Modus war, anstatt nur zu sagen, was Werte erlaubt sind. – Michael