質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

解決済

Accessで、32bitを64bitに変換したいです。

thth456
thth456

総合スコア1

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

1回答

0リアクション

0クリップ

299閲覧

投稿2022/10/01 05:44

前提

Accessで、32bitを64bitに変換したいのですが、
「型が一致しません」というエラーが起きてしまいます。

どうやら、GlobalSize()関数でエラーが起きているようです。
でも引数の型はLongPtrになっているので、なぜなのか分からず詰まっています。

ClipboardGetTextData = String$(GlobalSize(hGlobalMemory), vbNullChar) ' バッファ領域を確保する

ご教授いただければ幸いです。

Option Compare Database Option Explicit #If VBA7 Then ' 64-bit Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalFree Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr #End If '// '// GlobalAlloc wFlags パラメータ '// Private Const GMEM_MOVEABLE As Long = &H2 ' 移動可能メモリを割り当てます。メモリの断片化を防ぎます Private Const GMEM_ZEROINIT As Long = &H40 ' メモリの内容を 0 へ初期化します。 Private Const GHND As Long = (GMEM_MOVEABLE Or GMEM_ZEROINIT) ' 上記の各フラグの組み合わせです '// '// Get/SetClipboardData wFormat パラメータ '// Private Const CF_TEXT As Long = &H1 Public Function ClipboardGetTextData() As String Dim hClipMemory As LongPtr, hGlobalMemory As LongPtr If OpenClipboard(0) <> 0 Then hClipMemory = GetClipboardData(CF_TEXT) ' クリップボードオブジェクトのハンドルを取得します。 hGlobalMemory = GlobalLock(hClipMemory) ' クリップボードヘの先頭アドレスを取得します。 ClipboardGetTextData = String$(GlobalSize(hGlobalMemory), vbNullChar) ' バッファ領域を確保する Call lstrcpy(ClipboardGetTextData, hClipMemory) ' 確保したバッファヘ文字列をコピーします。 Call GlobalUnlock(hClipMemory) ' グローバルメモリオブジェクトのロックを解除します。 Call CloseClipboard ' クリップボードの権限を破棄します。 End If End Function Public Function ClipboardSetTextData(ByVal sTextData As String) As Boolean Dim hGlobalMemory As LongPtr, hClipMemory As LongPtr ' VBA では内部処理において文字列を Unicode で扱っているため、単純にバイト数を ' 取得すると半角・全角にかかわらず1文字2バイトが返ってきます。 ' そのため文字コードを Shift_JIS に変換後にバイト数を取得してます。 hGlobalMemory = GlobalAlloc(GHND, LenB(StrConv(sTextData, vbFromUnicode)) + 1) hClipMemory = GlobalLock(hGlobalMemory) ' 確保したバッファヘの先頭アドレスを取得します。 Call lstrcpy(hClipMemory, sTextData) ' 確保したバッファヘ文字列をコピーします。 Call GlobalUnlock(hGlobalMemory) ' グローバルメモリオブジェクトのロックを解除します。 If OpenClipboard(0) <> 0 Then ' クリップボードの内容の変更権限を取得します。 Call EmptyClipboard ' 現在のクリップボードを空にします。 ' クリップボードにデータを格納する。その際引数で渡されたグローバルメモリブロックは ' システムが管理するため、ハンドルの解放やロックし続けることをしてはなりません。 Call SetClipboardData(CF_TEXT, hGlobalMemory) Call CloseClipboard ' クリップボードの権限を破棄します。 ClipboardSetTextData = True Else ' クリップボードが他のプログラムなどで使用されている。 ' 使用されなかったハンドルを解放する Call GlobalFree(hGlobalMemory) ClipboardSetTextData = False End If End Function

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。