2015-11-30 23 views
6

Ho un macro di Excel che fa due cose molto semplici:Perché Excel vba copia negli appunti in modo incoerente?

  1. Esso mostra la data e l'ora correnti in una piccola finestra.
  2. 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?

+0

Forse la mia risposta di aiuto? – Sifu

+0

Sfortunatamente non Sifu. Ma grazie comunque. La soluzione di Steven Martin di utilizzare il metodo putinclipboard di msforms sembra essere solida. – Michael

risposta

5

Provare a utilizzare questo metodo, è sempre affidabile per me

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

A 2015.11.30 19:53:04, ho smesso di cercare di infrangere la tua soluzione. Funziona! Grazie! – Michael

0

Prova

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 

Lei ha detto che si è tentato Application.CutCopyMode, ma hai provato in quel modo?
Impone solo all'applicazione di cancellare gli appunti prima di copiare qualcos'altro, che dovrebbe quindi copiarsi correttamente negli appunti nuovi.

+0

Sì. Ho provato = false, = true, e = copia. L'unico effetto che stavo vedendo era se il tendone sarebbe stato visualizzato. La copia era altrimenti incoerente. Vorrei che Microsoft avrebbe documentato quale fosse lo scopo della modalità piuttosto che dire semplicemente quali sono i valori consentiti. – Michael

Problemi correlati