[[20250227155546]] 『VBAで元の書式を保持して貼り付ける方法』(yk) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『VBAで元の書式を保持して貼り付ける方法』(yk)

いつもお世話になっております。

VBAでコピーしたものを「元の書式を保持」して貼り付ける方法を探しています。

以下でXlPasteTypeを一通り見たのですが、なぜか「元の書式を保持」して貼り付ける方法が見当たりませんでした。
https://learn.microsoft.com/ja-jp/office/vba/api/excel.xlpastetype?redirectedfrom=MSDN

他の形式(「書式設定」等)では条件を満たさないため、どうしても「元の書式を保持」で貼り付けたいと思っています。

調べていきついたのが、CommandBars.ExecuteMso メソッドでした。
コマンドを調べたところどうやら元の書式の保持は「PasteSourceFormatting」というコマンド名らしくコードを書いてみたのですがエラーがでてしまい、解決策がさっぱりわかりません。

元の書式を保持して貼り付ける他の方法もしくはコードのエラー原因についてご教授いただければ幸いです。
どうぞよろしくお願いいたします。

以下コードとエラーになります。


コード

Sub テスト()
  'コピーして元の書式を保持して貼り付け

   Range("B2").Copy
   Range("B3").Select
   Application.CommandBars.ExecuteMso ("PasteSourceFormatting")
End Sub


エラー

実行時エラー '-2147467259 (80004005)':

オートメーション エラーです。
エラーを特定できません

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 マクロの記録で元の書式を保持で張り付けた場合、記録では
 xlPasteAllUsingSourceTheme
 になっていたがこれでは望み通りではなかったのだろうか?
(ねむねむ) 2025/02/27(木) 16:44:41

 こんな感じでしょうか。

 Sub Sample()
    Range("B2").Copy
    Range("B3").PasteSpecial xlPasteAllUsingSourceTheme
    Application.CutCopyMode = False
 End Sub
(通りすがり助六) 2025/02/27(木) 16:52:00

 書いてるうちに回答が。
 かぶりますけど、せっかく書いたので、

 PasteSourceFormatting はExcelのセルをコピーしても活性化しません。なのでエラーになります。
 
 Sub test1()
    Range("B2").Copy
    Debug.Print Application.CommandBars.GetEnabledMso("PasteSourceFormatting")
    Debug.Print Application.CommandBars.GetEnabledMso("PasteSourceTheme")
 End Sub

 PasteSourceFormatting は、WORDなどの他のOfficeアプリからコピー&貼り付けするときに活性化します。

 セルの書式を保持して貼り付け をマクロの記録すると、

 Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

 と記録されます。なので

 Sub samle1()
   Range("B2").Copy
   Range("B3").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 End Sub
 Sub sample2()
   Range("B2").Copy
   Range("B3").Select
   Application.CommandBars.ExecuteMso "PasteSourceTheme"
 End Sub

 全部貼り付ければいいと思いますど。
(´・ω・`) 2025/02/27(木) 16:59:02

 ちょっと気になったので確認しました。共有します。(LLMのことゆえ、間違いが混入しているかも)

 【ChatGPTへの質問】
 Excel365を使用しています。
 形式を選択して貼り付けの中にある次の3つの貼り付けを比較してみます。
 (1)コピー元のテーマを使用してすべて貼り付け
 (2)値の貼り付け
 (3)書式の貼り付け

 ■質問1
 ・(1)は、(2)+(3)よりも広いのでしょうか。
  つまり、(2)+(3)では抜け落ちてしまうものは、どんなものがあるのでしょうか。
 ご教示ください。

 ■質問2
 ・最後に、(1)と通常のコピーとの差は何でしょうか。

 【ChatGPT】
 とても良い質問ですね!Excel 365における「形式を選択して貼り付け」の中にある以下の3つの貼り付けについて、整理してお答えします。

 🔷 (1)「コピー元のテーマを使用してすべて貼り付け」とは
 「すべて貼り付け」は、「コピー元のセルに含まれるすべての情報」を貼り付けます。
 **「コピー元のテーマを使用してすべて貼り付け」**は、さらに「テーマ」に基づくスタイルも貼り付けるので、
 コピー元が「特定のテーマ(フォント、色など)」を持っている場合にその情報も持ってきます。

 含まれるもの
 ✅ 値
 ✅ 数式(数式がある場合)
 ✅ 書式(フォント、背景色、罫線など)
 ✅ 列幅
 ✅ 条件付き書式
 ✅ 名前付き範囲の参照
 ✅ コメント・メモ(コピー&ペースト時に選べる)
 ✅ 配列範囲(スピル範囲)ならその「スピル情報」も保持(365特有)

 🔷 (2)「値の貼り付け」とは
 値だけを貼り付けます。
 計算結果など、「目に見えている結果」だけが貼り付けられます。

 含まれるもの
 ✅ 値のみ
 ❌ 数式(消える)
 ❌ 書式
 ❌ 列幅
 ❌ 条件付き書式
 ❌ 名前付き範囲の参照

 🔷 (3)「書式の貼り付け」とは
 書式だけを貼り付けます。
 セルの中身はコピーしません。

 含まれるもの
 ✅ 書式(フォント、色、罫線、塗りつぶしなど)
 ❌ 値・数式(消える)
 ❌ 名前付き範囲の参照
 ❌ 条件付き書式(含まれる場合と含まれない場合があり、微妙に挙動が異なるバージョンあり)

 -----------------------------------------------------------------------
 ✅ (1)は(2)+(3)よりも広いか?について
 ✅ 広いです。
 (2)と(3)の単純な合算よりも、(1)のほうがコピーされる要素は多いです。

 具体的に「(2)+(3)」では抜け落ちるもの
 内容                (1) すべて貼り付け  (2) 値のみ  (3) 書式のみ
 数式                ✅                  ❌          ❌
 列幅                ✅                  ❌          ❌
 条件付き書式        ✅                  ❌          △(通常は含まれない)■■■
 名前付き範囲の参照  ✅                  ❌          ❌
 配列のスピル情報    ✅                  ❌          ❌
 テーマ情報          ✅                  ❌          ❌

 -------------------------------------------------------------------------
 🔷 (1)と通常のコピーの違い
 実は「通常のコピー」も、基本的には「コピー元のテーマを使用してすべて貼り付け」に相当します。
 ただし、貼り付け先の条件によって多少挙動が変わることがあります。

 -------------------------------------------------------------------------
 違いまとめ
 機能                            通常コピー          コピー元のテーマを使用してすべて貼り付け
 貼り付け先のテーマに合わせる    場合による          ❌(常にコピー元のテーマ優先)
 貼り付け先がフィルター中の場合  挙動に影響          同様
 貼り付けオプション              特になし            明示的に選択
 列幅                            通常は貼り付けない  オプションで貼り付けられる

 -------------------------------------------------------------------------
 💡ポイントまとめ
 やりたいこと                                        おすすめ貼り付け
 そのまま全部コピー(元のデザインごと持ってくる)    コピー元のテーマを使用してすべて貼り付け
 計算結果だけ欲しい                                  値の貼り付け
 フォントや罫線だけ欲しい                            書式の貼り付け
 同じ列幅もコピーしたい                              すべて貼り付け+列幅貼り付け
 条件付き書式も含めてコピー                          すべて貼り付け

 💬補足
 特にExcel 365では、動的配列(スピル)や条件付き書式のコピー挙動に差が出るケースもありますので、
 「何を貼り付けたいか」によって使い分けるのがベストです。
 ----------------------------------------
 【xyzによる補足】
 (1)■■■の部分ですが。
   書式貼り付けすると、条件付き書式も含めて貼り付けられることが多いと思う。
   いままで条件付き書式は貼り付けられなかった経験は無いです。
 (2)列幅が貼りつくのは、列全体を対象にしたときだけです。通常の矩形範囲ではそうはなりません。
   これは「通常のコピー貼り付け」でも「テーマを含めて貼りつけ」も同様です。

 私は、「テーマを使用してすべて貼り付け」というのは使ったことが無かったですね。
 ・大抵はそのままコピーペイストか、
 式不要なら
 ・値貼り付け+書式貼り付け を使いましたね。
(xyz) 2025/02/27(木) 20:45:52

みなさん、返信ありがとうございました。

結論から言いますと、おかげさまでやりたかったことはできたのですが、少し混乱しています。
以下経緯です。

他にも色々な条件があったため省きましたが、そもそも元の書式を保持したかった一番の理由は、別ブックにコピーする際にテキストボックスの枠線の太さが反映できなかったからでした。
元々2ptのものがすべて1ptになってしまい、形式をすべて試したところ、それを解消できる形式が「元の書式を保持」だったのです。(画像の枠などは反映されておりなぜかテキストボックスだけ)

この現象は会社のPCで数日続いていたのですがここに相談してから昨日、試しに自分のPCでためしたところ、そもそも普通のコピーでテキストボックスの枠線の太さがきちんと反映されいるではありませんか!

はじめはバージョンの違いかと思いましたが今朝会社にきてやってみると・・・
普通にできました・・・

そういうバグだったのか、私の勘違いだったのか、今となっては不明ですが大変お騒がせして失礼いたしました。

xyzさん、まとめてくださりありがとうございました。大変勉強になりました。
(yk) 2025/02/28(金) 08:30:13


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.