Ho un macro di Excel che fa due cose molto semplici:Perché Excel vba copia negli appunti in modo incoerente?
- Esso mostra la data e l'ora correnti in una piccola finestra.
- Copia il display come una stringa di testo per incollare altre app in base alle esigenze.
La cella che viene visualizzata è la seguente formula in esso:
=TEXT(NOW(),"yyyy.MM.dd hh:mm:ss")
Ogni 5 secondi, la macro aggiorna il tempo e l'orologio zecche.
Il mio problema è che quando copio l'ora dalla cella, non riesco a fare in modo che il contenuto venga incollato negli appunti. A volte il contenuto della cella viene inviato negli Appunti. Non riesco a capire perché funziona a volte e non altri perché non c'è molto da fare. Dovrebbe funzionare sempre.
So che i dati non sono negli appunti perché posso provare a incollare gli appunti in programmi diversi come Blocco note e altre app di testo e non succede nulla.
L'intero codice è in un unico modulo.
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
Il codice precedente dimensiona la finestra e aggiorna l'orologio ogni 5 secondi.
Per copiare l'orologio come testo negli appunti, ho il seguente codice nella cartella di lavoro
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
ho modificato la funzione copyTime per verificare l'^ C è visto selezionando la cella non formattata e posso vedere che i dati vanno costantemente nella cella, quindi so che il mio problema non è con il Range ("a1"). copia il passo in copia o il pastespecial alla cella f5.
Questo lascia il comando intervallo ("a5"). Copia come attore non valido quando la copia fallisce, il che è strano. È come se la copia funzioni fintanto che i dati sono conservati all'interno del foglio di calcolo, ma non riesce ad aggiornare gli appunti esterni in maniera coerente.
Questa osservazione mi ha portato a provare l'impostazione application.cutcopymode su xlcopy, true e false per vedere se questo ha aiutato. L'unico effetto che ho visto provando tutte le impostazioni è se ho visto f5 essere evidenziato con un perimetro o meno - nessuna delle impostazioni ha forzato una copia negli Appunti esterni.
Ho provato ad attendere un segno di spunta prima di copiare per vedere se qualcosa cancellava gli appunti dopo la copia se era ora di aggiornare l'orologio. Sembrava aiutare un po 'ma, di nuovo, non coerentemente.
Quindi, perché la copia non riesce a sempre aggiornare gli appunti? E perché non funziona quando non funziona e quando lo fa? Ancora meglio, come posso modificare questo codice in modo che esporti sempre negli Appunti esterni?
Forse la mia risposta di aiuto? – Sifu
Sfortunatamente non Sifu. Ma grazie comunque. La soluzione di Steven Martin di utilizzare il metodo putinclipboard di msforms sembra essere solida. – Michael