Home » ExcelVBA Rangeオブジェクト » 行・列を表すRange » 列幅・行の高さをコピーするExcelマクロ

列幅・行の高さをコピーするExcelマクロ

対象:Excel2007, Excel2010, Excel2013

「Excel VBAで、行の高さと列の幅をコピーするには、どういうコードにすればいいのでしょうか?」
といったご質問をいただくことがあります。

「excel2010 vba 行幅 コピー」
「excel vba 列幅 コピー」
といった検索キーワードで、このサイト・インストラクターのネタ帳へのアクセスも時折あります。

(ちなみに、細かい話ですが「行幅」というキーワードをよく見かけるのですが、行は「幅」ではなく「高さ」ですよね。)

同じような構造のワークシートが複数枚存在しているときに、すべてのワークシートの、行高・列幅を揃えたいという要望が実務で上がってくることがあります。

[スポンサードリンク]

マクロ記録でできるコード

列幅をコピーする操作をマクロ記録してみると
 Selection.PasteSpecial Paste:=xlPasteColumnWidths
というコードが作られますから、列幅を同じにするにはこのコードが使えそうだと判断できますが、行の高さをコピーするにはどうすればいいのか、戸惑ってしまうのかもしれません。

列幅のコピーが
 Selection.PasteSpecial Paste:=xlPasteColumnWidths
ですから、強引に
 Selection.PasteSpecial Paste:=xlPasteRowHeights
で行の高さもコピーできると考える方もいらっしゃるかもしれませんが、ダメです。

RangeオブジェクトのPasteSpecialメソッドでは、貼り付け方法をXLPasteType列挙に定義された定数を指定できます。

列幅・行の高さをコピーするExcelマクロ

オブジェクトブラウザーでXLPasteType列挙を確認すると、xlPasteClumnWidthsという定数はもちろん存在していますが、

列幅・行の高さをコピーするExcelマクロ

xlPasteRowHeightsという定数は存在しませんから、当然、
 Selection.PasteSpecial Paste:=xlPasteRowHeights
ではダメです。

行の高さと列の幅を1枚目のシートに揃えるサンプルマクロ

以下のようなマクロで、アクティブなブックのすべてのワークシートの、行の高さと、列の幅を、1枚目のシートに揃えることができます。

Sub 行高と列幅を1枚目のシートに揃える()

 Const ROW_LAST = 20 ''最終行番号
 Const COL_LAST = 7 ''最終列番号

 Dim i As Long ''ワークシート用カウンタ変数
 Dim r As Long ''行番号用カウンタ変数
 Dim c As Long ''列番号用カウンタ変数

 For i = 2 To Worksheets.Count
 With Worksheets(i)

  For r = 1 To ROW_LAST
   .Rows(r).RowHeight = _
    Worksheets(1).Rows(r).RowHeight
  Next r

  For c = 1 To COL_LAST
   .Columns(c).ColumnWidth = _
    Worksheets(1).Columns(c).ColumnWidth
  Next c

 End With
 Next i

End Sub

サンプルマクロの解説

ここでは、20行目の7列目までのセルにデータが入力されているワークシートのセルのサイズを揃えるマクロにしました。

最終行番号と最終列番号は、定数・ROW_LASTとCOL_LASTに指定しています。
 Const ROW_LAST = 20 ''最終行番号
 Const COL_LAST = 7 ''最終列番号

2枚目のワークシートから、最後のワークシートまでFor~Nextループを回して、
 For i = 2 To Worksheets.Count

各ワークシートで、
 With Worksheets(i)

1行目から、定数・ROW_LASTで指定しておいた最後の行までFor~Nextループを回して、
  For r = 1 To ROW_LAST

行の高さを、1枚目のワークシートの、同じ行の高さに揃え、
   .Rows(r).RowHeight = _
    Worksheets(1).Rows(r).RowHeight

行の高さを揃え終わったら、今度は1列目から、定数・COL_LASTで指定しておいた最後の列までFor~Nextループを回して、
  For c = 1 To COL_LAST

列の幅を、1枚目のワークシートの、同じ列の幅に揃えています。
   .Columns(c).ColumnWidth = _
    Worksheets(1).Columns(c).ColumnWidth

各シートの最終行・最終列まで処理したい場合

上記のマクロは、定数を使って行数・列数を指定していますが、各ワークシートの最終行・最終列まで自動的に処理したいという場合もあるでしょう。

その場合、定数・ROW_LASTとCOL_LASTを使わず、最終行番号を取得するオブジェクト式最終列を取得するオブジェクト式を利用しましょう。

具体的には、
 For r = 1 To ROW_LAST
を、例えば、
A列で最終行番号を取得するのなら、
 For r = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
に、C列で最終行番号が取得するのなら、
 For r = 1 To .Cells(Rows.Count, "C").End(xlUp).Row
にしましょう。

列方向も
 For c = 1 To COL_LAST
例えば、1列目で最終列番号を取得するのなら、
 For c = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
に、2列目で最終列番号を取得するのなら、
 For c = 1 To .Cells(2, Columns.Count).End(xlToLeft).Column
です。

[スポンサードリンク]

Home » ExcelVBA Rangeオブジェクト » 行・列を表すRange » 列幅・行の高さをコピーするExcelマクロ

「行・列を表すRange」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.