Ich habe einen Excel-Makro, das zwei sehr einfache Dinge tut:Warum Excel VBA inkonsistent in die Zwischenablage kopieren?
- Es zeigt das aktuelle Datum und die Uhrzeit in einem kleinen Fenster.
- 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?
meine Antwort geholfen hat? – Sifu
Leider nicht Sifu. Danke trotzdem. Steven Martins Lösung, die pstinclipboard-Methode von msforms zu verwenden, scheint solide zu sein. – Michael