【Excel VBA】DataObjectの参照エラーを確認する方法とクリップボードを使わない転記

【Excel VBA】DataObjectの参照エラーを確認する方法とクリップボードを使わない転記
🛡️ 超解決

DataObjectのエラーでは、参照設定の問題と、クリップボードの読み書きで失敗した場合を分けます。遅延バインディングへ書き換えるだけで、必要な部品や環境の問題がすべて解消するわけではありません。

目的がExcel内の値の転記なら、クリップボードを使わずにセルへ直接代入できます。別アプリへ文字列を渡す処理とは、必要な実装を分けて考えます。

ADVERTISEMENT

1. 止まった行とエラーを記録する

コンパイル時にDataObjectの型を認識できないのか、オブジェクト生成で失敗するのか、GetFromClipboardなどの実行中なのかを確認します。エラー番号と文面、Excelの32・64ビット、対象のPCを控えてください。

「Outlookが入っていないから」といった一つの理由に決め付けず、参照不可のライブラリやOfficeの構成を調べます。配布元と配布先で差があるなら、それぞれの状態を比較します。

※ お探しの解決策が見つからない場合は、こちらの「Excelトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

2. 参照設定を確認する

VBEの「ツール」→「参照設定」で「参照不可」がないか確認します。MSForms.DataObjectを型として宣言するコードでは、Microsoft Formsのライブラリが必要です。利用していない参照かどうかも、コードを確認して判断します。

UserFormを追加すると関連する参照が追加される場合がありますが、壊れた環境を必ず修復する方法ではありません。不明なDLLを外部サイトから取得して登録する対処は避け、Officeの管理担当者へ確認します。

3. 値の転記なら直接代入する

同じブックの「入力」シートA1を「出力」シートB2へ値として渡す例です。出力先を上書きするため、コピーしたブックで空の出力先を使って確認してください。

Sub TransferValue()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    wb.Worksheets("出力").Range("B2").Value2 = _
        wb.Worksheets("入力").Range("A1").Value2
End Sub

ThisWorkbookはコードを保存したブックです。個人用マクロブックなどに置く場合は、対象ブックの指定を変える必要があります。この例は値の転記であり、数式や書式、別アプリへの貼り付けを再現するものではありません。

入力A1から出力B2へのValue2代入はクリップボードを通らない。別アプリへ貼り付ける処理はクリップボードを使う別の経路
セル間で値を渡すだけなら直接代入できます。別アプリへの貼り付けと同じ処理を用意する必要はありません。

4. 遅延バインディングにも依存先は残る

CreateObjectで実行時に生成する形にしても、対象のCOM部品が利用できることは必要です。参照設定を省けることと、実行環境に依存しないことは別です。

htmlfileのClipboardDataを使う例も、MSHTMLやセキュリティ設定へ依存します。どのPCでも使える標準の代替として配布せず、対象環境での対応と管理方針を確認します。

5. Windows APIには所有権と後処理が必要

Windows APIを使う場合は、開く処理の成功確認、メモリ確保、文字列終端、書き込み失敗時の解放、クリップボードを閉じる後処理が必要です。ポインターやハンドルの宣言は32・64ビットに合わせます。

OpenClipboardへNULLを渡した後にEmptyClipboardを呼ぶと、所有者がNULLになりSetClipboardDataが失敗する条件があります。また、書き込み成功後はメモリの所有権がシステムへ移るため、同じ領域をアプリ側で解放してはいけません。

6. 用途に合わせて方式を選ぶ

目的 確認する方式
Excel内の値の転記 Range.Value2などの直接代入
セルの書式も移す Range.Copyなど、対象と貼り付け内容を指定
別アプリへの文字列受け渡し DataObjectや対象環境で検証したAPI実装

APIを選んだだけで互換性や安定性が最も高くなるわけではありません。Windows専用かどうか、保守できる担当者がいるかも判断材料です。

7. 配布先で文字と失敗時の動作を確認する

空文字、日本語、改行を含む文字列、ほかのアプリがクリップボードを使用中の状態で確認します。失敗を握りつぶさず、利用者に再試行や中止が分かる形で返してください。

仕様はMicrosoftのRange.Value2、GetFromClipboard、SetClipboardDataで確認できます。

📊
Excelトラブル完全解決データベースこの記事以外にも、様々なエラー解決策をまとめています。困った時の逆引きに活用してください。
この記事の監修者
📈

超解決 Excel・Word研究班

企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。

🏆
超解決 Excel検定 あなたのExcel実務能力を3分で測定!【1級・2級・3級】