9

私は何年もルーチンを使用して、次のような別のプログラムに貼り付けることができるプレーンテキスト文字列をクリップボードに入れました。

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

これを Excel Office 2013 で使用すると、データがクリップボードにないため、貼り付けることができません。これは、以前のバージョンでは発生しませんでした。

詳しく調べてみると、文字列はクリップボードに移動しますが、「システム文字列」としてではなく、「テキスト」または「Unicode テキスト」としてではありません。

しかし...文字列を「テキスト」としてクリップボードに入れる必要があるため、約10%の時間で実際に機能します。

何か案は??

4

2 に答える 2

7

user2140261 のコメントは正しい解決策です:

方法: 情報をクリップボードに送信する

(以下は上記リンクからコピペしたものです)

フォームまたはレポートのアクティブなコントロールの内容をクリップボードにコピーする必要がある場合は、次のコードのみが必要です。

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

ただし、これは古いルーチンに必要な代替品です。

1.モジュールを作成し、「WinAPI」などの名前を付けて、次のコードを入れます。

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. 古いルーチンが定義されているモジュールで、古いルーチンを次のコードに置き換えます。

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. 次に、次のように呼び出します。

' 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")
于 2014-01-23T16:33:37.863 に答える