「Excel VBAで、行の高さと列の幅をコピーするには、どういうコードにすればいいのでしょうか?」
といったご質問をいただくことがあります。
「excel2010 vba 行幅 コピー」
「excel vba 列幅 コピー」
といった検索キーワードで、このサイト・インストラクターのネタ帳へのアクセスも時折あります。
(ちなみに、細かい話ですが「行幅」というキーワードをよく見かけるのですが、行は「幅」ではなく「高さ」ですよね。)
同じような構造のワークシートが複数枚存在しているときに、すべてのワークシートの、行高・列幅を揃えたいという要望が実務で上がってくることがあります。
マクロ記録でできるコード
列幅をコピーする操作をマクロ記録してみると
Selection.PasteSpecial Paste:=xlPasteColumnWidths
というコードが作られますから、列幅を同じにするにはこのコードが使えそうだと判断できますが、行の高さをコピーするにはどうすればいいのか、戸惑ってしまうのかもしれません。
列幅のコピーが
Selection.PasteSpecial Paste:=xlPasteColumnWidths
ですから、強引に
Selection.PasteSpecial Paste:=xlPasteRowHeights
で行の高さもコピーできると考える方もいらっしゃるかもしれませんが、ダメです。
RangeオブジェクトのPasteSpecialメソッドでは、貼り付け方法をXLPasteType列挙に定義された定数を指定できます。
オブジェクトブラウザーでXLPasteType列挙を確認すると、xlPasteClumnWidthsという定数はもちろん存在していますが、
xlPasteRowHeightsという定数は存在しませんから、当然、
Selection.PasteSpecial Paste:=xlPasteRowHeights
ではダメです。
行の高さと列の幅を1枚目のシートに揃えるサンプルマクロ
以下のようなマクロで、アクティブなブックのすべてのワークシートの、行の高さと、列の幅を、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
サンプルマクロの解説
ここでは、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
です。
- Newer:VBAで日付データから月を取得するには?-Month関数
- Older:日付データから2桁の月を取得したい-TEXT関数
Home » Excel VBA Rangeオブジェクト » 行・列を表すRange » 列幅・行の高さをコピーするExcelマクロ