行全体・列全体の指定

カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作

2016/08/13

行全体(EntireRow)、列全体(EntireColumn)の処理を取り上げます。

△ 関連の Program Page


《このページの目次》


    

1. 概要

行全体を指定するには 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」にします。

目次に戻る


    

2. マクロ

 「概要」で書いたことを改めてマクロとして記述してみると下のとおり。

 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

目次に戻る


    

3. OLEを利用するVBScript

 先のマクロと同じ処理を行うVBScriptを示します。

 マクロ処理に該当する部分は、ほぼ同じように書けます。

 ですが、ワークブックの保存をどうするかが問題になります。

 行全体・列全体といったとき、xls形式とxlsx形式では、その行数・列数が違ってきます。xlsx形式の方が何倍か大きい数です。

 Excel2007以降で新規にワークブックを開くと、最大行数が1,048,576行です。

 一方、xls形式の最大行数は 65,536行。

 xlsx形式の下でマクロの処理を実行し、保存する段階になってxls形式で保存しようとすると、書き切れずに はみ出してしまうデータが生じます。その旨のエラーメッセージが出ることになります。

 といったトラブルを避けるためには、起動しているExcelのバージョンをチェックして、Excel2007以降ならxlsx形式で保存する必要があります。

 OLEを利用する自動一括処理のVBScriptでは、こうしたトラブル回避の工夫も必要になります。

    

△ vovXL04.vbs

 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

    

(1) ファイル削除とエラー処理

 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 などが存在すれば削除し、なければ何もせず次に進む、ということになります。

    

(2) Excelのバージョン確認

 Excelのバージョンは、VBAで書くと Application.Version で確認できます。

 このVersionプロパティは、数値ではなく文字列でバージョン番号を保持しています。

 Excel2007なら “12.0”, Excel2010だと “14.0” といった具合です。Excel2003は、確か “11.0” だと思います。

 文字列のままだと大小の比較が意図したようにいかないことがあるので、念のため CSng() 関数で数値に変換した上で比較します。

 数値に変換した値が 12.0 以上のときは xlsx形式、それ未満だと xls形式で保存します。

 上のVBScriptは、そうした処理を行っています。

〜 以上 〜