3-04.ブックとシートの操作:ブックのパスを取得するには?

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プロパティでフルパスをメッセージボックスに表示

 

2022年9月12日

3-03.ブックとシートの操作:名前を付けて保存するには?

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

書き込みパスワードを指定する

 

 

 

 

2022年9月12日

3-02.ブックとシートの操作:確認画面なしでブックを閉じるには?

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

 

 

2022年9月12日

3-01.ブックとシートの操作:ブックを開くには?

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を指定する

  

 

 

  

 

  

 

2022年9月12日

2-15.計算・データ処理:フィルターの結果をコピーするには?

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

 

実行結果。絞り込んだ結果のみがコピーされている

 

2022年9月12日

2-14.計算・データ処理:フィルターで抽出した数を調べるには?

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

 

実行結果

 

2022年9月12日

2-13.計算・データ処理:ワークシート関数を使うには?

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

 

実行結果

 

2022年9月12日

2-12.計算・データ処理:フィルターを設定するには?

AutoFilterメソッド

セル.AutoFilter

データの抽出に使うフィルター(オートフィルター)機能を利用するには、フィルターを設定したい表内のセルを1つ指定してAutoFilterメソッドを実行します。引数Fieldに条件を指定

する列、引数Criteia1に条件を指定します。次のサンプルコードは、A1セルを含む表にフィルターを設定し、2列目が「東京」であるデータのみを抽出します。

 なお、フィルターの設定を解除するには、もう一度AutoFilterメソッドを実行します。


フィルター機能を使い、2列目が「東京」のデータのみを抽出

Sub Sample()

Range(“B1″).AutoFilter Field:=2, Criteria1:=”埼玉県”

End Sub

 

実行結果

 

 

2022年9月12日

2-11.計算・データ処理:うるう年を判定するには?

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

 

実行結果

 

2022年9月12日

2-10.計算・データ処理:月末の日付を調べるには?

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

 

実行結果

 

2022年9月12日