! Chrome Remote Desktop
環境でExcel VBAが
クリップボードエラーになった

Excelで「別のアプリケーションで使用されているため、コンテンツをクリップボードにコピーできませんでした」というエラーが表示されました1

<svg class="eyecatch-svg" viewBox="0 0 192 192" xmlns="http://www.w3.org/2000/svg">
  <!-- Background -->
  <rect width="192" height="192" fill="white" rx="32" ry="32"/>
  
  <!-- Remote Monitor 1 (Left) -->
  <g transform="translate(30, 50)">
    <rect x="0" y="0" width="50" height="36" rx="3" ry="3" fill="#4285f4" stroke="#1a73e8" stroke-width="2"/>
    <rect x="2" y="2" width="46" height="28" fill="#e8f0fe"/>
    <rect x="20" y="36" width="10" height="8" fill="#5f6368"/>
    <rect x="12" y="44" width="26" height="3" rx="1.5" fill="#5f6368"/>
  </g>
  
  <!-- Remote Monitor 2 (Right) -->
  <g transform="translate(112, 50)">
    <rect x="0" y="0" width="50" height="36" rx="3" ry="3" fill="#34a853" stroke="#1e8e3e" stroke-width="2"/>
    <rect x="2" y="2" width="46" height="28" fill="#e6f4ea"/>
    <rect x="20" y="36" width="10" height="8" fill="#5f6368"/>
    <rect x="12" y="44" width="26" height="3" rx="1.5" fill="#5f6368"/>
  </g>
  
  <!-- Connection Line -->
  <line x1="80" y1="68" x2="112" y2="68" stroke="#9aa0a6" stroke-width="3" stroke-dasharray="4,4"/>
  
  <!-- Clipboard Icon -->
  <g transform="translate(72, 105)">
    <rect x="4" y="0" width="40" height="50" rx="4" ry="4" fill="#fbbc04" stroke="#f9ab00" stroke-width="2"/>
    <rect x="8" y="4" width="32" height="42" fill="#fef7e0"/>
    <rect x="16" y="-4" width="16" height="8" rx="2" ry="2" fill="#f9ab00"/>
    <line x1="14" y1="14" x2="34" y2="14" stroke="#f9ab00" stroke-width="2" stroke-linecap="round"/>
    <line x1="14" y1="22" x2="34" y2="22" stroke="#f9ab00" stroke-width="2" stroke-linecap="round"/>
    <line x1="14" y1="30" x2="28" y2="30" stroke="#f9ab00" stroke-width="2" stroke-linecap="round"/>
  </g>
  
  <!-- Error/Warning Badge -->
  <g transform="translate(140, 125)">
    <circle cx="0" cy="0" r="20" fill="#ea4335"/>
    <circle cx="0" cy="0" r="17" fill="white"/>
    <text x="0" y="0" font-family="Arial, sans-serif" font-size="28" font-weight="bold" fill="#ea4335" text-anchor="middle" dominant-baseline="central">!</text>
  </g>
</svg>Chrome Remote Desktop<br class="chiilabo-br is-on">環境でExcel VBAが<br class="chiilabo-br is-on">クリップボードエラーになった

Chrome Remote Desktop経由でExcelマクロを実行すると、ローカルでは起きないクリップボードエラーが表示されることがあります2

これは、VBAの文法ミスというより、Windowsのクリップボードが他のプロセスに占有されているときに発生します。

関連記事

1. エラーの意味

このエラーは、Windowsのクリップボード(Clipboard)が他のプロセスにより占有されていることを意味しています。

エラーの意味 「別のアプリケーションで使用されているため、 コンテンツをクリップボードにコピーできません」 📋 A Excel B 他プロセス クリップボードへの同時アクセス競合

クリップボードは共有資源です3
コピーや貼り付けを行うとき、一時的にデータを保管する領域として複数のアプリケーションが利用します。
VBAで Range.CopyPasteSpecial を実行すると、Excelは内部処理だけでなくWindowsのクリップボードにもデータを渡そうとします。
このタイミングで別のプロセスがアクセスしていると競合が起きます。

それが、「コピーできませんでした」という警告。
いわば共有資源の取り合いです。

1.1. Chrome Remote Desktop のクリップボード同期

私のマクロは、以下のような処理を含んでいました(簡略化しています)。

Range("G4:G9").Copy
Range("G14").PasteSpecial Paste:=xlPasteAll, Transpose:=True

Range("G4:G9").Copy
Selection.PasteSpecial Paste:=xlPasteValuesCode language: PHP (php)

このように、短時間で連続してコピーを行っています。
ここで重要なのは、Excel の Copy は単なる値の複写ではないという点です。
値、書式、数式、コメント、内部オブジェクト、などを含めた複合データを、クリップボード形式に変換します。
これはそれなりに重い処理です。
リモート環境では、この変換データがさらに同期対象になります。

1.2. なぜChrome Remote Desktopで起きやすいのか

Chrome Remote Desktopでは、ローカルPCとリモートPCの間でクリップボードを同期する機能が動いています4

Chrome Remote Desktopで起きやすい理由 ローカルPC リモートPC クリップボード同期 VBAの高速Copy/Paste 同期処理の割り込み 衝突発生

つまり、コピーすると、

ローカル側

ネットワーク転送

リモート側

という流れで同期されます。

コピー内容はネットワーク越しに転送されるため、リモート側のExcel、Windowsのクリップボード管理、同期プロセスが同時に関与します。

処理が高速に連続実行されるVBAでは、CopyとPasteが数ミリ秒単位で繰り返されます。
このタイミングで同期処理が割り込むと、衝突が起きます5

実際、ローカル実行では再現しないのに、リモート環境では発生するケースが多いです。

2. 典型的な原因と対策

典型的な原因 1 短時間の大量 Copy/Paste 2 書式込みコピー の多用 3 クリップボード 履歴が有効 4 監視アプリ Teams/Slack等 5 リモート接続のクリップボード同期 排他制御の問題

よくある原因は次の通りです。

  • VBAでCopy/Pasteを短時間に大量実行している
  • xlPasteAllなど書式込みコピーを多用している
  • クリップボード履歴が有効6
  • TeamsやSlackなどがクリップボードを監視している
  • リモート接続によるクリップボード同期が動作中

技術的には排他制御の問題です。

2.1. 解決策① クリップボードを使わない

最も確実な解決策は、クリップボードを使わない書き方に変更することです。
VBAでは、値の代入で直接データを書き換えられます。

たとえば縦の範囲を横に転置して貼り付ける処理は、次のように書けます。

Range("G14").Resize(1, 6).Value = _
    Application.Transpose(Range("G4:G9").Value)Code language: JavaScript (javascript)

ここでは Application.Transpose を使っています7

クリップボードを経由しないので、安定します。

値貼り付けも同様です。

Range("G4:G9").Value = Range("G4:G9").ValueCode language: JavaScript (javascript)

これだけで「値のみ貼り付け」と同じ動作になり、処理速度も向上します8

2.2. 解決策② 待機処理

どうしてもCopy/Pasteを使う場合は、間に待機処理を入れる方法もあります。

Application.CutCopyMode = False
DoEvents
Application.Wait Now + TimeValue("0:00:01")Code language: PHP (php)

ただしこれは環境依存です。

2.3. 解決策③ 環境側の調整

環境側の調整としては次のような方法があります。

  • Chrome Remote Desktopのクリップボード同期を一時的に無効化9
  • 不要な常駐アプリを停止
  • Windowsのクリップボード履歴を無効化

これで改善する場合もあります。

  1. このエラーはMicrosoft公式ドキュメントでも説明されており、クリップボードへの同時アクセスは仕組み上完全には防げないとされています – Windows11でエクセルを使用するとクリップボードエラーが発生
  2. Windowsのクリップボードは、Windows 10 October 2018 Update以降では履歴機能が追加され、最大25件までコピー内容を保持できます。この履歴機能も他のアプリケーションとの競合要因になります – 「クリップボードの履歴」有効/無効にする方法<Windows 10>
  3. クリップボードは排他制御が必要な共有資源で、一度に一つのプロセスしかアクセスできません。この制限がリモート環境での競合の根本原因です
  4. Chrome Remote Desktopのクリップボード同期は、リモート接続時にオプション画面から「クリップボードの同期を有効にする」を選択し、ブラウザに許可を与えることで機能します。この同期機能はテキストのみ対応で、画像やファイルは転送できません – Chromeリモートデスクトップ アプリ版からWeb版へ 使い勝手と注意点
  5. クリップボード同期の遅延がVBAの高速処理と競合する現象は、他のクリップボード管理ツールでも報告されています – CliborのホットキーをChromeリモートデスクトップで安定的に使う方法
  6. Windowsのクリップボード履歴は、設定>システム>クリップボードから無効化できます。Win+Vキーでアクセスする履歴機能をオフにすると、VBAのクリップボード操作との競合が減ります – Windows 10 – クリップボード履歴の設定と使い方(オン/オフ)
  7. Application.Transposeは、ExcelのTRANSPOSE関数をVBAから呼び出すメソッドです。行列を入れ替える処理をクリップボードを経由せずに実行できます。ただし要素数が5461を超える配列では正しく動作しない制限があります – WorksheetFunction.Transpose メソッド (Excel)
  8. クリップボードを使わない値代入は、VBAコードの高速化にもつながります。Copy/Pasteはクリップボードへのアクセス待ちが発生するため、直接代入より処理時間がかかります – エクセルでクリップボードエラー『別のアプリケーションで使用されているため…』の対処法
  9. Chrome Remote Desktopのクリップボード同期は、グループポリシーから転送サイズを0に設定することで企業環境では無効化できます – Chromeリモートデスクトップのセキュリティ対策