カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作]
行全体(EntireRow)、列全体(EntireColumn)の処理を取り上げます。
行全体を指定するには EntireRowプロパティを、
列全体を指定するには EntireColumnプロパティを用います。
たとえば下のように記述します。
Range("A3").EntireRow.Value = "test"
Cells(3,1).EntireRow.Value = "test"
上の2行は同じ処理をするものです。A3セルが所属する行全体、
つまり3行目全体を「test」という文字で埋め尽くします。
Excel2003のxlsファイルなら、3行目の第1列から第256列まで、どのセルにも「test」と書き込まれます。
Excel2007以降の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」にします。
「概要」で書いたことを改めてマクロとして記述してみると下のとおり。
1行から7行までを test で埋め尽くし、
8行と9行は「8行・9行」という文字で埋め尽くします。
その上で、3行全体と3列全体をClearします。
そして、7行目をDeleteします。結果、8行目以降が繰り上がります。
Sub Macro1()
Range("A1:E7").EntireRow.Value = "test"
Range("A8:A9").EntireRow.Value = "8行・9行"
Cells(3,1).EntireRow.Clear
Range("C1").EntireColumn.Clear
Cells(7,1).EntireRow.Delete
End Sub
先のマクロと同じ処理を行うVBScriptを示します。
マクロ処理に該当する部分は、ほぼ同じように書けます。
ですが、ワークブックの保存をどうするかが問題になります。
行全体・列全体といったとき、xls形式とxlsx形式では、その行数・列数が違ってきます。xlsx形式の方が何倍か大きい数です。
Excel2007以降で新規にワークブックを開くと、最大行数が1,048,576行です。
一方、xls形式の最大行数は 65,536行。
xlsx形式の下でマクロの処理を実行し、保存する段階になってxls形式で保存しようとすると、書き切れずに はみ出してしまうデータが生じます。その旨のエラーメッセージが出ることになります。
といったトラブルを避けるためには、起動しているExcelのバージョンをチェックして、Excel2007以降ならxlsx形式で保存する必要があります。
OLEを利用する自動一括処理のVBScriptでは、こうしたトラブル回避の工夫も必要になります。
1Option Explicit 2Dim FSO 3Dim EXLapp, WBobj 4Const xlOpenXMLWorkbook = 51 ' xlsx形式 5Const xlWorkbookNormal = -4143 ' xls形式 6 7Set FSO = CreateObject("Scripting.FileSystemObject") 8On Error Resume Next ' Book1.xls* が存在しない時はスキップ 9FSO.DeleteFile(FSO.GetAbsolutePathName("Book1.xls*")) 10Set EXLapp = CreateObject("Excel.Application") ' Excelの起動 11EXLapp.Visible = True ' Excelを見える状態に 12Set WBobj = EXLapp.Workbooks.Add() ' Workbookの新規作成 13With WBobj.ActiveSheet 14 .Range("A1:E7").EntireRow.Value = "test" 15 .Range("A8:A9").EntireRow.Value = "8行・9行" 16 .Cells(3,1).EntireRow.Clear 17 .Range("C1").EntireColumn.Clear 18 .Cells(7,1).EntireRow.Delete 19End With 20If CSng(EXLapp.Version) >= 12.0 Then ' Excel2007以降(xlsx) 21 WBobj.SaveAs FSO.GetAbsolutePathName("Book1"), xlOpenXMLWorkbook 22Else ' Excel2003まで(xls) 23 WBobj.SaveAs FSO.GetAbsolutePathName("Book1"), xlWorkbookNormal 24End If 25EXLapp.quit
FSO.DeleteFile(……)
によりファイルを削除することができます。
パラメータとして “Book1.xls*” のようにワイルドカードを指定できるので、Book1.xls, Book1.xlsx などを一括で削除できます。
ただし、該当のファイルが存在しない場合、エラーメッセージが出てそこでプログラムが中断されてしまいます。
そこで、該当のファイルがないときは、何ごともなかったかのように次のステップに進めるようにするため On Error Resume Next
を記述しました。
この記述があると、すぐ次の行でエラーが発生しても、エラーを無視して更に次の行に進みます。
On Error Resume Next
FSO.DeleteFile(FSO.GetAbsolutePathName("Book1.xls*"))
上の2行により、Book1.xls, Book1.xlsx などが存在すれば削除し、なければ何もせず次に進む、ということになります。
Excelのバージョンは、VBAで書くと Application.Version で確認できます。
このVersionプロパティは、数値ではなく文字列でバージョン番号を保持しています。
Excel2007なら “12.0”, Excel2010だと “14.0” といった具合です。Excel2003は、確か “11.0” だと思います。
文字列のままだと大小の比較が意図したようにいかないことがあるので、念のため CSng() 関数で数値に変換した上で比較します。
数値に変換した値が 12.0 以上のときは xlsx形式、それ未満だと xls形式で保存します。
上のVBScriptは、そうした処理を行っています。
〜 以上 〜