2016/03/21
参考サイト:
行全体を指定するには EntireRowプロパティを、列全体を指定するには EntireColumnプロパティを用います。
たとえば下のように記述します。
Range("A3").EntireRow.Value = "test"
Cells(3,1).EntireRow.Value = "test"
上の2行は同じ処理をするものです。3行目全体を「test」という文字で埋め尽くします。
Excel2003のxlsファイルなら、3行目の第1列から第256列まで、どのセルにも「test」と書き込まれます。
xlsxファイルであれば、1列から16,384列までが「test」になります。
Range("D1").EntireColumn.Value = "test"
Cells(1,4).EntireColumn.Value = "test"
上の2行も同じ処理を行います。4列目について、第1行から第65,536行まで「test」が書き込まれます。xlsxファイルなら 1,048,576行までです。
EntireRowもEntireColumnも、書き込みで用いることはあまりないと思います。
実線でこれらを利用することが多いのは、行全体・列全体の削除といったことでしょうか。
Cells(5,1).EntireRow.Delete
とすれば、5行目全体が削除されます。
Cells(1,3).EntireColumn.Delete
とすれば、3列目全体が削除されます。
この Delete は、Clear と異なり、行全体または列全体が跡形もなくなくなります。
Clearの方は、セルの中に書かれている内容が消去されるだけで、行全体・列全体がなくなる訳ではありません。
Deleteで第2行目全体を削除すると、それまで第3行目だったものが繰り上がって第2行目になります。
Deleteで第4列目全体を削除すると、それまで第5列目だったものが左にずれて第4列目になります。
複数の行について行全体を指定したり、複数の列について列全体を指定することもできます。
Range("A2:A4").EntireRow.Value = "test"
と書けば、第2行目から第4行目の全体を「test」で埋め尽くします。
Range("B1:E1").EntireColumn.Value = "test"
であれば、第2列目から第5列目の全体を「test」にします。
「概要」で述べてきた事柄をVBAマクロとして登録するためのスクリプトを掲げます。
これまでと同様に、マクロには Control + j
というショートカットキーを割り当てます。
1# encoding: Windows-31J 2require "./exlap" 3 4macro_str = <<'EOS' 5Sub Macro1() 6 Range("A1:E7").EntireRow.Value = "test" 7 Range("A8:A9").EntireRow.Value = "8行・9行" 8 Cells(3,1).EntireRow.Clear 9 Range("C1").EntireColumn.Clear 10 Cells(7,1).EntireRow.Delete 11End Sub 12EOS 13 14macro_name = "Macro1" 15File.delete("Book1.xls") if test(?e, "Book1.xls") # 既存のBook1.xlsを削除 16Exlap.new("Book1.xls") do |wb| 17 wb.macro_add(macro_str) 18 wb.Application.MacroOptions("Macro"=>macro_name, "ShortcutKey"=>"j") 19 wb.save 20end
上のマクロでは、7行×5列全体に「test」を書き込み、8行目と9行目全体には「8行・9行」を書き込みます。
そのあと、第3行目と第3列目のセルの中身を消去(Clear)しています。
そして、最後に7行目を削除(Delete)しています。
前述のマクロと同じ処理を行うwin32oleのスクリプトは下のようになります。
1# encoding: Windows-31J 2require "win32ole" 3 4def fullpath(filename) 5 fso = WIN32OLE.new("Scripting.FileSystemObject") 6 return fso.GetAbsolutePathName(filename) 7end 8 9Dir.glob("./Book1.xls*") {|fname| File.delete(fname)} 10app = WIN32OLE.new("Excel.Application") 11wb = app.Workbooks.Add() 12ws = wb.Worksheets("Sheet1") 13ws.Range("A1:E7").EntireRow.Value = "test" 14ws.Range("A8:A9").EntireRow.Value = "8行・9行" 15ws.Cells(3,1).EntireRow.Clear 16ws.Range("C1").EntireColumn.Clear 17ws.Cells(7,1).EntireRow.Delete 18wb.SaveAs(fullpath("Book1"), (app.Version.to_f >= 12.0) ? 51 : -4143) 19app.Quit
VBAマクロの部分は、ほぼそのまま取り入れています。特別の変更・工夫はしていません。
今回、ユーザーがExcel2007以降を使っている場合は xlsxファイルを保存するようになっています。
行全体、列全体といった時に、Excel2003までとそれ以降では最大の行数と最大の列数が異なるため、Excel2007以降を起動している場合に、xls形式で保存しようとすると警告メッセージが出てしまいます。
SaveAs() の書き方がやや面倒なものになっていますが、要は、Excel2003までならxls、Excel2007以降ならxlsxで保存するという意味です。
同じ処理を行うexlapのスクリプトを掲げます。
今回の主題である EntireRow, EntireColumn の記述部分は、win32oleのスクリプトと同じです。
xls と xlsx の違いは、exlapでは気にしなくて大丈夫です。
1# encoding: Windows-31J 2require "./exlap" 3 4File.delete("Book1.xls") if test(?e, "Book1.xls") # 既存のBook1.xlsを削除 5Exlap.new("Book1.xls") do |wb| 6 ws = wb.ss("Sheet1") 7 ws.Range("A1:E7").EntireRow.Value = "test" 8 ws.Range("A8:A9").EntireRow.Value = "8行・9行" 9 ws.Cells(3,1).EntireRow.Clear 10 ws.Range("C1").EntireColumn.Clear 11 ws.Cells(7,1).EntireRow.Delete 12 wb.save 13end
ワークシートオブジェクトには Rows, Columns というプロパティもあります。これらを使って行全体,列全体を扱うこともできますが、「あれも・これも」と書いても仕方ないので触れません。
ただ、Rows.Count によって最大行数、Columns.Count によって最大列数を取得できることを記しておきたいと思います。
VBAマクロで記述すると下のようになります。
Sub Macro1()
MsgBox "最大行数:" & ActiveSheet.Rows.Count & _
" 最大列数:" & ActiveSheet.Columns.Count
End Sub