2012-01-26 11 views
11

Używam takiego kodu, aby usunąć tekst ze Schowka.Pobierz tekst ze schowka za pomocą GetText - unikaj błędów w pustym schowku

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

używam obsługi błędów, aby uzyskać przeszłości przypadek, gdy schowek jest pusty, i wszystko jest w porządku tak długo, jak zachować wychwytywanie błędów zestaw do Przerwa na nieobsługiwany błędów.

Jednak z niezwiązanych z sobą powodów chcę ustawić opcję Błąd pułapkowy, aby podzielić na wszystkie błędy, a to spowoduje błąd przy DataObj.GetText po znalezieniu pustego schowka. Czy istnieje jakikolwiek test, który mogę zastosować dalej, aby uniknąć próby przetworzenia pustego schowka?

Odpowiedz

14

Czy to pomaga?

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 

Zobaczysz, że zajmie się również pustym schowkiem.

Możesz opróżnić schowek przed testowaniem powyższego kodu za pomocą poniższego kodu. Wklej go w module.

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: New Zapytanie przez 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

Chciałbym użyć' Dim DataObj jako MSForms.DataObject' i 'Ustaw DataObj = MsForms.DataObject' (oddzielne linie), aby uniknąć zmiennych automatycznej instancji . Również funkcja najlepiej nadaje się do przechwytywania tekstu w schowku i zwracania go. – JimmyPena

+0

Chciałbym zobaczyć próbkę :) W rzeczywistości sugerowałbym, aby opublikować cały kod w nowym poście. Pomoże to nie tylko OP, ale każdemu, kto przychodzi, szuka rozwiązania :) –

+0

Ah, właśnie zredagowałem twoją odpowiedź: D – JimmyPena

0

dodać kod follwoing prostu b4 niszczącego line debuging .... błąd disapeared dla mnie po tym testowym .. dziwne, ale jakoś działa (Excel 2010)

myString = DataObj.GetText (1) MsgBox myString

3

Nadzieja pomaga to ktoś inny:

byłem coraz błąd „typu zdefiniowanego przez użytkownika nie zdefiniowany” na kodzie zamieszczonych przez Siddharth-trasie

Okazuje się, że „Microsoft Forms 2.0 Object Library” Biblioteka brakuje/nie aktywny.

Got go do pracy z tym (http://excel-macro.tutorialhorizon.com/vba-excel-reference-libraries-in-excel-workbook/):

„Czasami nie znajdzie odpowiednich referencji na liście, można powiedzieć, nie znajdzie«Microsoft Forms 2.0 Object Library»w narzędziu/odniesienia list w takim przypadku musisz przejrzeć plik FM20.DLL z systemu32 "