Article

【Excel】列幅を保ったままコピーする方法|3 種類の貼り付けと VBA

この記事で分かること

Excel で表をコピーすると列幅が崩れる問題を、「元の列幅を保持」貼り付け 3 種比較と VBA で Excel 2024 で実機検証つき解説します。

Excel で表をコピーして別の場所に貼り付けたら、列幅が全部 8.43 になって崩れた経験はありませんか? Excel の標準動作では、コピー元の列幅は引き継がれず、貼り付け先のセルの列幅をそのまま使うためです。

本記事では、列幅を保ったままコピーする 3 つの方法(「元の列幅を保持」貼り付け / 形式を選択して貼り付けの「列幅」 / シートごとコピー)を Excel 2024 で実機検証つきで比較し、「すべて」貼り付けでは列幅が来ない理由行の高さも保つテクニックVBA PasteSpecial xlPasteColumnWidths での自動化まで網羅します。コピペで動く 配布用 xlsx サンプルも用意しました。

サンプルファイル(xlsx)

「元の列幅を保持」貼り付け、「列幅」だけの貼り付け、シートごとコピーを順に試せる 6 シート構成の練習用ブックです。

xlsx 形式 ・ 約 11 KB ・ シート 6 枚 ・ Excel 2024 build 19929 で動作確認。

excel-copy-column-width-keep-sample.xlsx

なぜ表をコピーすると列幅が崩れるのか

Excel で Ctrl+V を押すと、値・書式・数式は貼り付けされますが、列幅は元のセルの幅のまま変わりません。これが、コピー先で表が崩れる原因です。

この挙動は Microsoft Learn の XlPasteType 列挙xlPasteAll (値 -4104) と xlPasteColumnWidths (値 8) が独立した値として定義されていることに由来します。 「すべて」貼り付け (xlPasteAll) には列幅が含まれず、列幅を貼り付けたいときは xlPasteColumnWidths を別途指定する仕様です。実機の Excel 2024 build 19929 でも、貼り付け先の列幅を 5 にしておいて「すべて」貼り付けすると、列幅は 5 のまま変わらないことを確認しました。

列幅を保ったままコピーするには、別の貼り付け方法を選ぶ必要があります。本記事では下記 3 方法を比較します。

  • 方法 1: 「元の列幅を保持」貼り付け(内容+列幅)— h2-2 で解説
  • 方法 2: 「形式を選択して貼り付け」→「列幅」(列幅のみ)— h2-3 で解説
  • 方法 3: シートごとコピー(列幅・行の高さ・全データ)— h2-4 で解説

※ Microsoft Support の別ページ「セル、行、列を移動またはコピーする」では同じ操作が「ソース列の幅を保持」と表記されている箇所もあります。 本記事の実機検証は Windows 版 Excel 2024 build 19929 を対象としており、Web 版・Mac 版・Microsoft 365 の最新チャネルでの挙動は保証範囲外です。

方法 1: 「元の列幅を保持」貼り付け(最短手順)

「元の列幅を保持」アイコンは、リボン右クリックメニュー形式を選択して貼り付けダイアログの 3 つの経路からアクセスできます。Microsoft Support の「貼り付けのオプション」ページでも、このアイコンが「コピーしたセルの内容と列幅を貼り付ける」と公式に説明されています。

経路 1: リボンから呼び出す手順は、「ホーム」タブ →「クリップボード」グループ →「貼り付け」の▼ →「元の列幅を保持」アイコンをクリックです。アイコンの上にマウスを乗せると「元の列幅を保持」のツールチップが表示されます。

経路 2: 右クリックメニューから呼び出す手順は、貼り付け先のセルを右クリック →「貼り付けのオプション」の中から「元の列幅を保持」アイコンを選ぶです。リボンとまったく同じアイコンが並びます。

経路 3: キーボードから呼び出す手順は、Ctrl+Alt+V で「形式を選択して貼り付け」ダイアログを開き、ダイアログ内の「列幅」ラジオボタンを画面上のアクセスキーで選んで Enter です。アクセスキーは Office のバージョンや UI 翻訳で変わることがあるため、実機ダイアログを開いて「列幅」の文字に下線が引かれているキーを確認してください。

「元の列幅を保持」を選ぶと、コピー元の値・書式・数式に加えて列幅も貼り付け先に転写されます。下の画像は、貼り付け先 F:I 列を意図的に列幅 5 (狭い) にしておき、「元の列幅を保持」で貼り付けた前後の比較です。F:I 列の列幅が元の 20 / 8 / 12 / 14 に置き換わっています。

「元の列幅を保持」貼り付け前後の比較。Before は F:I 列が列幅 5 で狭く、After は F:I 列が 20/8/12/14 に変わり読みやすい表になっている。
S2: 「元の列幅を保持」貼り付け前後 (Excel 2024 build 19929 で実機検証)

VBA でこれと同等の結果を作るには、xlPasteAll で値・書式・数式を貼り付けた直後に xlPasteColumnWidths で列幅を上書きする 2 段階処理を実行します(実機で同じ結果になることを確認しました。Excel UI の内部実装がこの 2 段階と同じかどうかまでは検証していません)。 具体的な VBA コードは h2-7 で示します。

キーボードショートカット Ctrl+Alt+V 自体の使い方は、当サイトの [形式を選択して貼り付け]のショートカットキー同じく [形式を選択して貼り付け] のショートカット解説 でも詳しく扱っています。

方法 2: 形式を選択して貼り付けの「列幅」を使う(「すべて」では列幅が来ない)

多くの読者が誤解しがちなポイントです。「形式を選択して貼り付け」ダイアログには「すべて」というラジオボタンがあり、これを VBA 定数で対応付けると xlPasteAll (値 -4104) 相当です。Microsoft Learn の説明文には「Everything will be pasted」と書かれていますが、この「Everything」は列幅と行の高さを含みません

下の画像は、貼り付け先 F:I 列を列幅 5 にしておき、「すべて」貼り付け (xlPasteAll 単独) を実行した前後の比較です。値・書式・数式は転写されましたが、列幅は 5 のまま崩れています (D 列に該当する F 列が「####」になり、合計の桁数が読めません)。

「すべて」貼り付け前後の比較。Before は F:I 列が列幅 5、After も F:I 列は列幅 5 のままで「####」表示になり読めない。
S3: 「すべて」貼り付け (xlPasteAll) では列幅が転写されない実例

この挙動は xlPasteAll だけでなく、名前に「All」が付く 4 種類の値すべてで発生します。Excel 2024 build 19929 の実機で確認したマトリクスを表にまとめます。

XlPasteType名称列幅を貼り付けるか
-4104xlPasteAll含まない
13xlPasteAllUsingSourceTheme含まない
7xlPasteAllExceptBorders含まない
14xlPasteAllMergingConditionalFormats含まない
8xlPasteColumnWidths列幅のみ転写

このため、列幅だけを別の場所に転写したいときは、「形式を選択して貼り付け」ダイアログを開き、ラジオボタンから 「列幅」を選ぶ必要があります。値・書式・数式は転写されず、列幅だけがコピーされます。

「元の列幅を保持」(内容+列幅) と「列幅」(列幅のみ) は別物です。早見表 (h2-5) で違いを並列比較するので、使い分けの目安はそちらをご覧ください。

なお、xlPasteColumnWidths (「列幅」) は貼り付け先に既存の値が入っていても、列幅だけを上書きし、既存の値は消しません。一方、xlPasteAll (「すべて」) は値も書式も上書きしてしまいます。既存データを残したまま列幅だけ揃えたいときは、迷わず「列幅」を選んでください。

方法 3: シートごとコピー(列幅・行の高さ・全データを保持)

シート全体を別シートに複製したい場合は、シートごとコピーを使います。手順は、画面下のシートタブを右クリック → メニューから「シートの移動またはコピー…」を選択 → ダイアログで「コピーを作成」にチェックを入れて「OK」です。

シートごとコピーでは、列幅・行の高さ・値・書式・数式・条件付き書式・名前定義のすべてが完全にコピーされます。Excel 2024 build 19929 の実機で、元データシートの列幅 (A=20 / B=8 / C=12 / D=14) と行の高さ (24 / 30 / 18 / 18 / 42) がそのまま新シートに転写されることを確認しました。

キーボード代替として、シートタブを Ctrl を押しながらドラッグしてもシートを複製できます。実機では「シートの移動またはコピー」ダイアログを通すパターンと同じ結果になります(コピー先シートの名前は「元シート名 (2)」になります)。

注意点は、シートごとコピーは「すべて」を一度に複製するため、列幅だけほしい場合には過剰です。列幅だけなら方法 1 (元の列幅を保持) または方法 2 (形式を選択して貼り付けの「列幅」) を、シート全体を別シートとして残したいときに方法 3 を選んでください。

3 方法 + 「すべて」貼り付けの比較早見表

どの方法を選ぶか迷ったら、下の早見表で 6 観点 × 4 方法 (3 方法 + 比較対象として「すべて」) を見比べてください。Excel 2024 build 19929 の実機検証結果に基づいています。

3 方法 + 「すべて」貼り付け の比較早見表。列幅・行の高さ・値・数式・書式・シート単位 の 6 観点で、元の列幅を保持/形式を選択して貼り付け [列幅]/シートごとコピー/「すべて」(xlPasteAll) の 4 方法を ○✕ で比較。
S5: 3 方法 + 「すべて」貼り付けの比較早見表 (Excel 2024 で実機検証)

使い分けの目安は次の 4 パターンです。

  • 値も書式も列幅もほしい → 方法 1 (元の列幅を保持) — 1 クリックで全部済むので最短
  • 列幅だけほしい (値・書式は壊したくない) → 方法 2 (形式を選択して貼り付けの「列幅」) — 既存の値を残したまま列幅だけ上書き
  • 列幅・行の高さ・シート全体をすべて保持 → 方法 3 (シートごとコピー)
  • 値・書式・数式だけ転写 (列幅はそのままでよい) → 「すべて」(xlPasteAll) でよいが、列幅が崩れることに注意

行の高さは方法 1・方法 2 では転写されません。行の高さも合わせて保ちたい場合は h2-6 のテクニックを使ってください。

行の高さも保つテクニック

方法 1・方法 2 では列幅は保てますが、行の高さは別の操作が必要です。XlPasteType の 12 値の中に「行の高さ」専用の値は存在しません。 行の高さは「行」エンティティに紐づく属性のため、行全体を選択してコピーしたときにのみ転写されます。

必須条件は、画面左端の行番号をクリックして行全体を選択してからコピーすることです。下の画像はその対比で、ケース A (行全体選択) では行の高さ 24 / 30 / 18 / 18 / 42 が完全に保持されており、ケース B (セル範囲 A1:D5 を選択) では行の高さが既定の 18 に戻ってしまっています。

行の高さ保持の Before/After。ケース A は行全体 1:5 を選択してコピーすると貼り付け先で行高 24/30/18/18/42 が保たれている。ケース B はセル範囲 A1:D5 を選択するとコピーしても行高が 18 に戻る。
S6: 行全体選択 (ケース A) vs セル範囲選択 (ケース B) の行の高さ保持比較

もう 1 つのコツとして、貼り付け先も「行単位」に寄せると失敗が少ないです。貼り付け先のセルを 1 つだけ選ぶよりも、貼り付け先の行番号をクリックして行全体を指定する方が、Excel が「行のコピーを行に貼る」と認識しやすくなります。

なお、本記事では検索クエリで多く使われる「行高」表記をそのまま見出しに採用していますが、Microsoft 公式の表記は「行の高さ」です。本文中ではこの 2 表記を併用しています。

VBA で列幅を保ったままコピーする

マクロで列幅も一緒にコピーしたいときは、Range.PasteSpecial メソッドに Paste:=xlPasteColumnWidths を渡します。最小コードは下記です。

Sub PasteColumnWidthOnly()
 Range("A1:D5").Copy
 Range("F1").PasteSpecial Paste:=xlPasteColumnWidths
 Application.CutCopyMode = False
End Sub

このコードを実行すると、F:I 列の列幅だけが元の A:D 列と同じ 20 / 8 / 12 / 14 に揃います。値・数式・書式は転写されません。実機の Excel 2024 build 19929 で確認しました。

UI の「元の列幅を保持」と同じ結果 (値+書式+数式+列幅) を VBA で作るには、xlPasteAllxlPasteColumnWidths を順番に呼ぶ 2 段階処理にします。

Sub PasteAllAndKeepColumnWidth()
 Range("A1:D5").Copy
 Range("F1").PasteSpecial Paste:=xlPasteAll
 Range("F1").PasteSpecial Paste:=xlPasteColumnWidths
 Application.CutCopyMode = False
End Sub

注意点として、Microsoft Learn の XlPasteType 列挙には名前に「All」が付く値が 4 種類ありますが、4 種類すべて列幅を含みません。 h2-3 で示した早見表のとおり、列幅を貼り付けたい場合は xlPasteColumnWidths (値 8) を別途呼ぶ必要があります。

名称列幅含有
-4104xlPasteAll (既定)含まない
13xlPasteAllUsingSourceTheme含まない
7xlPasteAllExceptBorders含まない
14xlPasteAllMergingConditionalFormats含まない
8xlPasteColumnWidthsこれだけ列幅を転写

追加の Tip として、xlPasteColumnWidths貼り付け先の既存の値を破壊しません。列幅だけ安全に上書きしたいときに有用です。一方、xlPasteAll は既存の値・書式すべてを上書きします。

FAQ — うまく動かないときのチェックリスト

Q1. 「形式を選択して貼り付け」メニューが出ない

VBA の Worksheet_SelectionChange イベントを使っているとクリップボードがクリアされ、「形式を選択して貼り付け」が無効になることがあります。回避策は Application.EnableEvents = False を実行することです。アドインの競合が疑われる場合は、Excel を Ctrl を押しながら起動するとセーフモードで開き、原因のアドインを切り分けられます。

表示設定を確認したいときは、「ファイル」→「オプション」→「詳細設定」→「貼り付けオプション ボタンを表示する」がオンになっていることを確認してください。

Q2. 2 つの Excel ウィンドウで開いたブック間で貼り付けると Windows のダイアログが出る

Microsoft Learn の 公式ドキュメントで報告されている挙動として、Alt キーを押しながら Excel アイコンをクリックするなどして別インスタンスとして Excel を 2 つ起動し、両方でブックを開くと、「形式を選択して貼り付け」ダイアログが Excel のものではなく Windows のものに置き換わり、貼り付けオプションが制限されることがあります。

回避策は 両方のブックを同一インスタンスで開くことです(既存の Excel ウィンドウから「ファイル」→「開く」で開けば同一インスタンスになります)。本記事の自動検証でも、別インスタンス間の挙動は環境差が大きく安定しないことを確認しています。

Q3. フィルターで絞り込み中に可視セルだけコピーしたら、列幅も保てる?

はい、保てます。AutoFilter で行を絞り込んだ状態で Alt+; (セミコロン) で可視セルのみを選択 → Ctrl+C でコピーしたあとに「元の列幅を保持」で貼り付けると、可視行 4 件 (ヘッダ+データ 3 件) と列幅 20 / 8 / 12 / 14 の両方が正しく転写されることを実機で確認しました (Windows 版 Excel 2024 build 19929 で検証)。

Q4. xlPasteColumnWidths は既存の値を消してしまう?

いいえ、消しません。h2-7 でも触れたとおり、xlPasteColumnWidths (値 8) は列幅だけを上書きし、貼り付け先の既存の値・書式は保持されます。 一方、xlPasteAll (「すべて」貼り付け) は既存の値・書式を上書きしてしまうため、既存データを残したいときは「列幅」を選んでください。

Q5. WordPress や Word に貼り付けると列幅が崩れる

外部のアプリケーション (WordPress, Word, Google Docs など) は Excel の列幅情報を理解しません。HTML テーブルや画像化を使って Excel 側で列幅を作り込んでから貼る必要があります。WordPress 側で完結させる方法は、当サイトの 幅の指定をせずに Excel の表を WordPress ページへ貼り付ける方法 で詳しく扱っています。 形式を選択して貼り付けの「乗算」「加算」などの演算機能を使った数値一括変換は、セルに入力されている数値を○倍に一括更新するには を、貼り付けで数値と文字列を変換する手順は、数値が文字列として保存されている (緑の三角マーク) の原因と一括変換 を参照してください。

Q6. シートタブを Ctrl+ドラッグでコピーすると列幅も来る?

はい、来ます。Ctrl を押しながらシートタブをドラッグすると、シートが複製されます (新シート名は「元シート名 (2)」になります)。これは h2-4 で扱った「シートの移動またはコピー」ダイアログでコピーを作成した場合と同等の結果になり、列幅・行の高さ・値・書式・数式すべてが転写されます。

まとめ

Excel で列幅を保ったままコピーする 3 方法は、用途に応じて使い分けます。

  • 方法 1 (元の列幅を保持): 値+書式+列幅をまとめて 1 クリックで転写
  • 方法 2 (形式を選択して貼り付けの「列幅」): 既存の値を残したまま列幅だけ上書き
  • 方法 3 (シートごとコピー): 列幅・行の高さ・シート全体すべてを複製

VBA で自動化したい場合は xlPasteColumnWidths (値 8) を Range.PasteSpecial に渡せば、列幅だけを安全に転写できます。「元の列幅を保持」と同じ結果 (値+書式+数式+列幅) を VBA で作るときは、xlPasteAllxlPasteColumnWidths の 2 段階処理にします。本文上部の配布サンプル xlsx (6 シート構成) で、すべての方法を手元で試せます。

Next Read

このあと読む記事

今の内容に近い記事から、次の1本と補助記事を続けて見つけられるようにしています。

Keep Exploring

このテーマをさらに探す

同じテーマの入口記事と更新記事を、一覧の形でまとめています。

コメント