2013-02-06 14 views
9

Ho usato una routine per anni per mettere una stringa di testo negli appunti che posso incollarlo in un altro programma come ad esempio:Office 2013 Excel .PutInClipboard è diverso?

targetData.SetText "This is a plain text string" 
targetData.PutInClipboard 

Quando uso questo in Excel di Office 2013 i dati non sono in negli appunti e quindi non posso incollarlo. Questo non è mai successo nelle versioni precedenti.

A un'analisi più approfondita, ho rilevato che la stringa non viene inserita negli Appunti ma come "Stringa di sistema" ma non come "Testo" o "Testo Unicode".

MA ... circa il 10% delle volte funziona in modo acuto come dovrebbe mettere la stringa negli appunti come "Testo".

Qualche idea ??

+0

Si sta utilizzando 64bit o versione a 32 bit di Office 2013? Ho testato la mia copia del 64 bit e non ho avuto problemi. (A proposito il tuo codice ha "=" lì che dovrebbe essere lì;) – CuberChase

+0

Sto usando Office Professional a 64 bit più Excel. Il testo inserito negli Appunti tramite la PutInClipboard, metodo non verrà incollato all'interno o all'esterno di Excel. Nell'ispezionare i dati degli appunti è effettivamente lì ma classificato come tipo "System String". Il tipo di testo mostra "??" (due punti interrogativi affiancati). Il tipo Unicode ha due caratteri non stampabili. _Non so perché ho digitato il segno "=" sarebbe un errore del compilatore._ –

+3

Questo è un problema noto, la soluzione a questo è stata rappresentata nel seguente collegamento a MSDN [Procedura: inviare informazioni negli appunti ] (http://msdn.microsoft.com/en-us/library/office/ff192913.aspx) – user2140261

risposta

2

È necessario aggiungere "Microsoft forms 2.0 object library" ai riferimenti, quindi è possibile utilizzare questa funzionalità. puoi farlo andando in Excel/sviluppatore/Visual basic (o il tuo modulo VBE) e negli strumenti/riferimenti seleziona sfoglia e poi nella cartella system32 cerca il file "FM20.DLL" e poi selezionando questo file al la fine dell'elenco di riferimenti "Microsoft forms 2.0 object library" verrà visualizzata. Attivalo. Ora le cose sono buone come i vecchi tempi;) commento

5

di user2140261 è la soluzione corretta:

How to: Send Information to the Clipboard

(Il seguente è solo copiato dal link qui sopra)

Se è necessario copiare il contenuto del controllo attivo su un modulo o segnalare negli Appunti, è necessario solo questo codice:

Private Sub cmdCopy_Click() 
    Me!txtNotes.SetFocus 
    DoCmd.RunCommand acCmdCopy 
End Sub 

Tuttavia, questo la sostituzione è necessario per la vostra vecchia routine:

1. Creare un modulo, il nome "WinAPI" o qualcosa, inserire questo codice in esso:

Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long 
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long 
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long 
Declare Function CloseClipboard Lib "User32"() As Long 
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long 
Declare Function EmptyClipboard Lib "User32"() As Long 
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long 
Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long 

Public Const GHND = &H42 
Public Const CF_TEXT = 1 
Public Const MAXSIZE = 4096 

2. Nel modulo in cui si definisce la vostra vecchia routine, sostituire la vecchia routine con questo codice:

Function ClipBoard_SetData(MyString As String) 
    Dim hGlobalMemory As Long, lpGlobalMemory As Long 
    Dim hClipMemory As Long, X As Long 

    ' Allocate moveable global memory. 
    '------------------------------------------- 
    hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1) 

    ' Lock the block to get a far pointer 
    ' to this memory. 
    lpGlobalMemory = GlobalLock(hGlobalMemory) 

    ' Copy the string to this global memory. 
    lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString) 

    ' Unlock the memory. 
    If GlobalUnlock(hGlobalMemory) <> 0 Then 
     MsgBox "Could not unlock memory location. Copy aborted." 
     GoTo OutOfHere2 
    End If 

    ' Open the Clipboard to copy data to. 
    If OpenClipboard(0&) = 0 Then 
     MsgBox "Could not open the Clipboard. Copy aborted." 
     Exit Function 
    End If 

    ' Clear the Clipboard. 
    X = EmptyClipboard() 

    ' Copy the data to the Clipboard. 
    hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory) 

OutOfHere2: 

    If CloseClipboard() = 0 Then 
     MsgBox "Could not close Clipboard." 
    End If 

End Function 

3. Poi, chiamare in questo modo:

' doesn't work on Windows 8: targetData.SetText "This is a plain text string" 
'doesn't work on Windows 8: targetData.PutInClipboard 
ClipBoard_SetData ("This is a plain text string") 
Problemi correlati