WorkbookオブジェクトのPathプロパティ
ブック.Path
ブックが保存されているフォルダーのパスを取得するには、WorkbookオブジェクトのPathプロパティを調べます。Pathプロパティが返すパスは、「C:¥***¥***」のように末尾に「¥」記号が付かないので注意しましょう。このパスにブック名などをつなげてフルパスにするには、「& “¥”」のように続けて「¥」を付けた後に、ブック名を指定します。 なお、ブックのフルパスを取得するには、WorkbookオブジェクトのFullNameプロパティを使います。
Sample1:アクティブブックが保存されているフォルダーのパスを表示
Sub Sample1()
MsgBox ActiveWorkbook.Path
End Sub


Pathプロパティでパスをメッセージボックスに表示
Sample2:アクティブブックのフルパスを表示
Sub Sample2()
MsgBox ActiveWorkbook.FullName
End Sub


FullNameプロパティでフルパスをメッセージボックスに表示
WorkbookオブジェクトのSaveAsメソッド
ブック.SaveAs Filename:=フルパス
ブックに名前を付けて保存するには、WorkbookオブジェクトのSaveAsメソッドを実行します。保存しようとしたフォルダーに、すでに同じ名前のブックが存在する場合、上書きする
かどうかの確認ダイアログが表示されます。この確認で「いいえ」または「中止」をクリックすると、SaveAsメソッドはエラーになります。
引数Filenameには、保存するファイルのフルパスを指定します。そのほか、表のようなオプションを引数に指定できます。標準のファイル形式(xlsx)以外で保存する場合、ファイル名の拡張子を適切に記述するだけでなく、引数FileFormatでファイル形式を指定する必要があります。例えばCSV形式なら「xlCSV」、Excel 97-2003形式なら「xlExcel8」などと指定します。 なお、ファイル名を変えずに上書き保存する場合はSaveメソッドを使います。
CドライブのREFフォルダーにBook.xlsxという名前で保存する
Sub Sample()
ActiveWorkbook.SaveAs Filename:=”C:¥REF¥Book.xlsx”
End Sub
表●引数として指定できる主なオプション
Filename |
保存するファイルの名前(フルパス) |
FileFormat |
保存するファイルの形式 |
Password |
読み取りパスワードを指定する |
WriteResPassword |
書き込みパスワードを指定する
|


WorkbookオブジェクトのCloseメソッド
ブック.Close SaveChanges:=True/False
ブックを閉じるには、WorkbookオブジェクトのCloseメソッドを実行します。このとき、ブックに変更があると、ブックを閉じる前に「変更を保存しますか?」という確認ダイアログが表示されます(図)。ブック内に“自動再計算”の関数が使われていても、確認ダイアログが表示されます。
この確認画面を表示せずに即座にブックを閉じるには、引数SaveChangesを指定します。変更を上書き保存して閉じるにはTrue、変更を保存しないで閉じるにはFalseを指定します。
ブックを閉じるときに表示される確認ダイアログ。この表示を防ぐには、Closeメソッドの引数SaveChangesを指定する
Sample1:アクティブブックを、変更を保存せずに閉じる
Sub Sample1()
ActiveWorkbook.Close SaveChanges:=False
End Sub

Sample2:ExcelBook.xlsxを上書き保存して閉じる
Sub Sample2()
Workbooks(“ExcelBook.xlsx”).Close SaveChanges:=True
End Sub

WorkbooksコレクションのOpenメソッド
Workbooks.Open FileName:=フルパス
ブック(ファイル)を開くときは、WorkbooksコレクションのOpenメソッドを実行します。引数Filenameには、開きたいブックのフルパスを指定します。パスを指定せずに、ファイル名だけを指定した場合は、カレントフォルダーに存在するブックと認識されます。開いたブックは、実行後に必ずアクティブブックとなります。
オプションとして指定できる引数には、ファイル名のほかに、読み取り専用、パスワード、フォーマットなどがあります。主なオプションを表に示します。例えば、パスワードで保護されたブックを開く場合は、Password:=”パスワード” のように引数を追加します。引数は「,」で区切ります。
Cドライブ直下のExcelBook.xlsxを開く
Sub Sample()
Workbooks.Open Filename:=”C:¥ExcelBook.xlsx”
End Sub
表●引数として指定できる主なオプション
Filename |
開くファイルの名前(フルパス) |
ReadOnly |
読み取り専用モードで開くにはTrueを指定する |
Format |
テキストファイルを開く場合は、この引数で区切り文字を指定する |
Password |
読み取りパスワードを指定する |
WriteResPassword |
書き込みパスワードを指定する |
AddToMru |
最近使ったファイルの一覧にファイル名を追加するには、Trueを指定する |

CurrentRegionプロパティ
セル.CurrentRegion.Copy
フィルターで絞り込んだ結果だけを別セルにコピーするには、絞り込まれた表に対してCurrentRegionプロパティを使います。すると、フィルターで非表示になっているセルは含まずに、抽出結果全体を指定できます。
この結果をコピーするには、Copyメソッドを使います。「セル.Copy コピー先」のような書き方でコピー先を指定すればOKです
フィルターの結果を別シートにコピーする
Sub Sample()
Range(“B1″).AutoFilter Field:=2, Criteria1:=”群馬県”
Range(“B1”).CurrentRegion.Copy Sheets(“copy”).Range(“B1”)
End Sub
実行結果。絞り込んだ結果のみがコピーされている


SUBTOTAL関数
WorksheetFunction.Subtotal(3, セル範囲)
フィルターで絞り込んだ結果が何件あるかを返すプロパティは、VBAにありません。絞り込んだ結果の数を調べるには、ワークシート関数のSUBTOTAL関数を使います。
SUBTOTAL関数は、指定したセル範囲のうち、非表示になっているセルを除外して集計する関数です。1つ目の引数に指定する番号に応じて、件数を調べたり、合計を求めたり、平均を求めたりできます。指定する番号は表の通りです。
なお、VBAからワークシート関数を呼び出すには、WorksheetFunctionを用います(左参照)。
SUBTOTAL関数で集計する内容を指定するための番号(主なもの)
≪集計方法≫ |
≪関 数≫ |
≪内 容≫ |
1 |
AVERAGE |
平均 |
2 |
COUNT |
数値の個数 |
3 |
COUNTA |
空白以外の個数 |
4 |
MAX |
最大値 |
5 |
MIN |
最小値 |
9 |
SUM |
合計 |
フィルター機能で抽出した件数を表示
Sub Sample()
Dim cnt As Long
cnt = WorksheetFunction.Subtotal(3, Range(“C2:C8”))
MsgBox cnt & “件あります”
End Sub
実行結果


WorksheetFunctionコレクション
WorksheetFunction.関数名(引数)
VBAからワークシート関数を呼び出して利用するには、WorksheetFunctionコレクションを使います。例えばVBAには、セルに入っている数値の合計を一発で求めるような関数はありません。しかし、WorksheetFunctionコレクションを使ってワークシート関数の「SUM」を呼び出せば、セルの合計を簡単に求められます。VBAで処理するよりも、ワークシート関数を使った方が高速なケースもあります。
注意したいのは、引数の指定方法です。ワークシート関数では、引数に「B2:B4」とったセル参照を文字列で指定します。一方、VBA上では「Range(B2:B4)」のようにRangeなどを使って指定する必要があります。
なお、IF関数など、VBAから呼び出せないワークシート関数もあります。
ワークシート関数のSUMを使ってセルの合計を求める
Sub Sample()
MsgBox WorksheetFunction.Sum(Range(“A1:A4”))
End Sub
実行結果


AutoFilterメソッド
セル.AutoFilter
データの抽出に使うフィルター(オートフィルター)機能を利用するには、フィルターを設定したい表内のセルを1つ指定してAutoFilterメソッドを実行します。引数Fieldに条件を指定
する列、引数Criteia1に条件を指定します。次のサンプルコードは、A1セルを含む表にフィルターを設定し、2列目が「東京」であるデータのみを抽出します。
なお、フィルターの設定を解除するには、もう一度AutoFilterメソッドを実行します。
フィルター機能を使い、2列目が「東京」のデータのみを抽出
Sub Sample()
Range(“B1″).AutoFilter Field:=2, Criteria1:=”埼玉県”
End Sub
実行結果


DateSerial関数
DateSerial / Day
ある年がうるう年かどうかを判定するには、どうすればよいでしょう。うるう年のルールには「4年に1度」というだけでなく、いくつかの例外ルールがあり、計算で求めようとすると意外と厄介です。
そこで、Excelのシリアル値の仕組みをうまく使って簡単に判定する方法を紹介しましょう。すなわち、その年の「3月1日」をまず求めて、その1日前=2月の末日を調べます。その日が29日だったら、うるう年というわけです。
次のサンプルコードは、A1セルに入力した西暦年がうるう年かどうかを判定します。DateSerial関数でその年の3月1日を求め、そこから1を引いて2月の末日を取得。これをDay関数の引数に指定すれば、「日」の部分の数値だけを取り出せます。その結果が「29」かどうかをIf文で判定すればOKです。
指定した年がうるう年かどうかを判定
Sub Sample()
Dim y As Long
y = Range(“B3”).Value
If Day(DateSerial(y, 3, 1) – 1) = 29 Then
MsgBox y & “年はうるう年です。”
Else
MsgBox y & “年はうるう年ではありません。”
End If
End Sub
実行結果


DateSerial関数、Year関数、Month関数
DateSerial / Year / Month
ある日付を基に、その月の末日を調べるには、DateSerial関数とYear関数、Month関数を組み合わせます。「翌月1日」の日付データ(シリアル値)を作り、そこから1日分を引けば、翌月1日の前日=当月末が求められます。
Year関数とMonth関数はそれぞれ、指定した日付の年の数値と月の数値を返す関数です。これらを使って求めた年月の数値のうち、月の数値に「1」を加え、日の数値を「1」とすれば、DateSerial関数で「翌月1日」の日付データを生成できます。この日付から「1」を引けば、その前日である当月末となります。
当月末の日付を求める
Sub Sample()
Dim y As Long, m As Long
With Range(“B3”)
y = Year(.Value)
m = Month(.Value)
End With
MsgBox DateSerial(y, m + 1, 1) – 1 & “が月末日です。”
End Sub
実行結果

