2012-01-26 15 views
11

Sto usando un codice come questo per estrarre il testo dagli Appunti.Ottieni il testo dagli appunti usando GetText - evita errori negli appunti vuoti

Dim DataObj As New MSForms.DataObject 
DataObj.GetFromClipboard 
myString = DataObj.GetText 

Io uso la gestione degli errori per ottenere passato il caso in cui gli Appunti sono vuoti, e tutto va bene finché io continuo a intercettazione degli errori impostato per aprire su ogni errore non gestito.

Tuttavia, per motivi non correlati, desidero impostare Errore Trapping per Interruzione su tutti gli errori e questo genera un errore a DataObj.GetText quando trova gli Appunti vuoti. C'è qualche tipo di test che posso applicare più a monte per evitare di provare a elaborare un vuoto negli Appunti?

risposta

14

Questo aiuto?

Sub GetClipBoardText() 
    Dim DataObj As MSForms.DataObject 
    Set DataObj = New MsForms.DataObject '<~~ Amended as per jp's suggestion 

    On Error GoTo Whoa 

    '~~> Get data from the clipboard. 
    DataObj.GetFromClipboard 

    '~~> Get clipboard contents 
    myString = DataObj.GetText(1) 
    MsgBox myString 

    Exit Sub 
Whoa: 
    If Err <> 0 Then MsgBox "Data on clipboard is not text or is empty" 
End Sub 

Si noterà che gestirà anche gli appunti vuoti.

È possibile svuotare gli appunti prima di testare il codice precedente utilizzando il codice riportato di seguito. Si prega di incollarlo in un modulo.

Private Declare Function OpenClipboard Lib "User32.dll" _ 
(ByVal hWndNewOwner As Long) As Long 

Private Declare Function EmptyClipboard Lib "User32.dll"() As Long 

Private Declare Function CloseClipboard Lib "User32.dll"() As Long 

Public Sub ClearClipboard() 
    Dim Ret 

    Ret = OpenClipboard(0&) 
    If Ret <> 0 Then Ret = EmptyClipboard 
    CloseClipboard 
End Sub 

EDIT: nuova richiesta OP

Private Declare Function CountClipboardFormats Lib "user32"() As Long 

Sub Sample() 
    If (CountClipboardFormats() = 0) = True Then 
     MsgBox "Clipboard is empty" 
    Else 
     MsgBox "Clipboard is not empty" 
    End If 
End Sub 
+1

Vorrei usare' Dim DataObj As MSForms.DataObject' e 'Set DataObj = MsForms.DataObject' (righe separate) per evitare le variabili di auto-instancing . Inoltre, una funzione sarebbe più adatta per afferrare il testo degli appunti e restituirlo. – JimmyPena

+0

Mi piacerebbe vedere un campione :) In effetti ti suggerirei di postare l'intero codice in un nuovo post. Aiuterà non solo l'OP ma chiunque altro cerchi una soluzione :) –

+0

Ah, ho appena modificato la tua risposta: D – JimmyPena

0

aggiungere il codice follwoing solo b4 la linea di rottura per debuging .... l'errore spariscono per me dopo quel test .. strano ma funziona in qualche modo (Excel 2010)

myString = DataObj.GetText (1) MsgBox myString

3

Spero che questo aiuti qualcun altro:

mi è stato sempre il "tipo definito dall'utente non definito" l'errore sul codice pubblicato da Siddharth-rotta

scopre il “Microsoft Forms 2.0 Object Library” biblioteca mancava/non attivato.

preso a lavorare con questo (http://excel-macro.tutorialhorizon.com/vba-excel-reference-libraries-in-excel-workbook/):

"A volte non troverete i riferimenti desiderati nella lista, dici che non troverete‘Microsoft Forms 2.0 Object Library’nello strumento/di riferimento in tal caso è necessario sfogliare il file FM20.DLL dal system32 "

Problemi correlati