忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBAスタンダード対策】WorksheetFunction.CountIf による条件付きデータ件数のカウントを攻略!

指定した条件に一致するセルの個数を数えるExcel関数 COUNTIF。VBAの WorksheetFunction オブジェクト を経由して呼び出す際の正しい構文と引数の指定方法をマスターしましょう。

1. 問題:WorksheetFunction オブジェクトを用いた COUNTIF 関数の実行

【 問題 】 下記のコードは、Sheet1 のセル範囲 A2:A100 の中から、セル B1 に入力されている検索条件に一致するセルの個数をカウントし、変数 cnt に格納してメッセージボックスに表示しようとしています。空欄 ( A ) に入る正しい記述はどれでしょうか?

Sub CountMatchingRows()
    Dim cnt As Long
    Dim rng As Range
    Dim criteriaCell As Range

    Set rng = Worksheets("Sheet1").Range("A2:A100")
    Set criteriaCell = Worksheets("Sheet1").Range("B1")

    cnt = ( A )

    MsgBox "該当件数: " & cnt & " 件"
End Sub

① WorksheetFunction.CountIf(rng, criteriaCell)
② Application.WorksheetFunction.CountIf(rng, criteriaCell)
③ Application.WorksheetFunction.CountIf(rng.Address, criteriaCell.Value)
④ WorksheetFunction.Count(rng, criteriaCell)

2. 正解:WorksheetFunction.CountIf の呼び出しに関する正解

正解: ② Application.WorksheetFunction.CountIf(rng, criteriaCell)

3. 解説:WorksheetFunction.CountIf の構文と引数指定のルール

VBAで条件付きカウントを行う際は、Application.WorksheetFunction.CountIf(範囲, 検索条件) の形式で呼び出します。

[ CountIf 関数の構造と引数指定のポイント ]

1. 階層構造の完全指定(Application.WorksheetFunction)
VBAの標準的な記法として、最上位の Application オブジェクトから明示的に指定した Application.WorksheetFunction.CountIf(...) が最も厳密かつ推奨される呼び出し方法です。

2. 検索対象の範囲は Range オブジェクトで渡す!
第1引数(カウント対象範囲)には、文字列アドレス("A2:A100")ではなく、Range オブジェクト(rngを渡す必要があります。
・③の rng.Address のように文字列を渡すと型が一致せずエラーとなります。

3. COUNT 関数との違い(④のひっかけ)
COUNT:数値が含まれるセルの個数を数える(条件指定不可)
COUNTIF:指定した条件を満たすセルの個数を数える
そのため、条件セル(criteriaCell)を指定して数える場合は CountIf を使う必要があります。

ここが試験に出る!: スタンダード試験では、CountIfSumIf などのワークシート関数を呼び出す際、「第1引数にセル範囲(Rangeオブジェクト)が正しくセットされているか」「Application.WorksheetFunction のオブジェクト階層が正しいか」 が狙われます。


4. まとめ

「条件に一致する件数を数えるなら Application.WorksheetFunction.CountIf(範囲, 条件) 」。この構文をマスターしておけば、Forループで1行ずつ判定・カウントする重い処理を書かずに、1行のコードで高速にデータ件数を取得できるようになります。


PR

【VBAスタンダード対策】WorksheetFunction オブジェクトによるワークシート関数の呼び出しを攻略!

Excelに標準で用意されている便利な関数(VLOOKUPSUMCOUNTIF など)をVBAコード内から呼び出して使う際に必須となるのが WorksheetFunction オブジェクト です。正確な呼び出し構文と、VBA組み込み関数との違いをマスターしましょう。

1. 問題:WorksheetFunction オブジェクトを用いたVLOOKUP関数の実行

【 問題 】 下記のコードは、セル A1 の値を検索キーとして、Sheet1 のセル範囲 A1:B10 から対応するデータをVLOOKUP関数で検索し、変数 result に格納しようとしています。空欄 ( A ) に入る正しい記述はどれでしょうか?

Sub CallWorksheetFunctionTest()
    Dim result As Variant
    Dim key As String
    key = Range("A1").Value

    result = ( A )(key, Worksheets("Sheet1").Range("A1:B10"), 2, False)

    MsgBox result
End Sub

① Application.VLookup
② Application.WorksheetFunction.VLookup
③ Excel.VLookup
④ Worksheet.VLookup

2. 正解:WorksheetFunction 呼び出し構文の正解

正解: ② Application.WorksheetFunction.VLookup

3. 解説:WorksheetFunction オブジェクトの構造とエラー処理の罠

VBAからExcelのワークシート関数を呼び出す基本的な構文は Application.WorksheetFunction.関数名(...) です。

[ WorksheetFunction の構造とひっかけポイント ]

1. 階層構造の基本:
Application オブジェクトの下位にある WorksheetFunction プロパティ を介して各ワークシート関数を呼び出します。
・VBAエディタ(VBE)では、Application.WorksheetFunction. まで入力すると、利用可能なワークシート関数が自動メンバー表示(補完機能)されます。

2. 誤り(③, ④)の理由:
・③(Excel.VLookup)や ④(Worksheet.VLookup)といったオブジェクト構成はVBAの文法上に存在しないためコンパイルエラーとなります。

★ ここが試験に出る!(① Application.VLookup との違い)
Application.WorksheetFunction.VLookup
  検索値が見つからない場合、VBAの実行時エラー1004が発生しマクロが停止します(On Error GoTo 等でのエラートラップが必要)。
Application.VLookup(WorksheetFunctionを省略)
  検索値が見つからない場合、エラーで停止せず変数にエラー値(IsError で判定可能)を返します
※スタンダード試験では、基本構文である Application.WorksheetFunction.関数名 を問う問題が最も基本として出題されます。

ここが試験に出る!: スタンダード試験では、WorksheetFunction 経由で呼び出す際、セル範囲の引数には文字列ではなく Range("A1:B10") のように Range オブジェクトを渡す必要がある 点も併せて狙われます。


4. まとめ

「ワークシート関数を呼び出す標準記述は Application.WorksheetFunction.関数名(...) 」。この構文を押さえておけば、VBAのループ処理を使わずに SUMIFCOUNTIFVLOOKUP などを活用して大量データを一括集計・検索する高速なマクロを構築できるようになります。


【VBA】ブック内の全シート名を一括取得!Sheets.CountとForループでシート一覧を表示する方法

Excelファイル内にどんなシートが存在するのかを把握したり、特定のシートを探して処理を行いたいとき、ブックに含まれる全シート名を順番に取得する手法はVBA開発の基本テクニックです。今回は `Sheets.Count` と `For` ループを使ったシンプルな実装方法を解説します。

1. 基本概念:Sheets.Count と Sheets(i)

Excel VBAでは、ブックに含まれるシートの総数を Sheets.Count で取得できます。これを `For` ループの終了条件に指定することで、1番目のシートから最後のシートまで順番に処理を適用できます。

[ 構成要素 ]
Sheets.Count:ブック内の全シート数(ワークシート+グラフシート等)を返す
Sheets(i).Name:i 番目のシート名(文字列)を取得する

2. 実践サンプル:全シート名をイミディエイトウィンドウに出力する

ポイント:インデックス番号(1からSheets.Countまで)を順番に回す

以下のサンプルコードを実行すると、アクティブなブックに含まれる全てのシート名がイミディエイトウィンドウに順番に出力されます。

Sub Macro1()
  Dim i As Long
  
  ' 1番目のシートから最後のシートまでループ
  For i = 1 To Sheets.Count
    Debug.Print Sheets(i).Name
  Next i
End Sub

3. 実行結果

イミディエイトウィンドウに、ブック内のシート一覧が上から順に表示されます。

Sheet1
Sheet2
Sheet3

4. 【超重要】よくある注意点と「ハマりやすい罠」

注意点1:変数 i のデータ型は Variant ではなく Long にする

ループのカウント変数(`i`)に `Variant` 型を使うと、余計なメモリを消費し処理速度が低下します。数値のカウントには整数型(Long)を使うのがVBAの鉄則です。
Dim i As Variant  ' 非推奨(低速・無駄なメモリ消費)
Dim i As Long    ' 推奨(高速で標準的)

注意点2:Sheets と Worksheets の違いに注意する

`Sheets` はグラフシート等も含めたすべてのシートを対象とします。普通の「セルがある表シート」だけを正確に対象にしたい場合は、`Worksheets` を使用するのが安全です。
For i = 1 To Worksheets.Count  ' ワークシートのみを厳密にカウント

5. エンジニアの視点:For Each ループを使ったよりスタイリッシュな書き方

1. For Each ws In Worksheets: インデックス番号(`i`)を使わずに `For Each` 文を使うと、コードがより直感的で読みやすくなります。プロのエンジニアが現場でよく書く「いけいけ」な記法です。

Sub ShowAllSheetNames()
  Dim ws As Worksheet
  For Each ws In Worksheets
    Debug.Print ws.Name
  Next ws
End Sub


2. 全シート一括処理の基盤: 「全シートの特定セルをまとめてクリアする」「全シートをPDF化して出力する」といった高度な自動化も、このシートループ処理が基本骨格になります。


6. まとめ

シート一覧の取得は、複数シートをまとめて操作するマクロの第一歩です。変数の型(`Long`)や `Worksheets` コレクションの選び方に気をつけて、拡張性の高いスマートなコードを作成していきましょう!


【VBAスタンダード対策】Application.InputBox メソッドと Type 引数を攻略!

ユーザーにデータ入力を促すダイアログボックス。VBA組み込みの InputBox 関数とは異なり、Application.InputBox メソッド では Type 引数を指定することで、マウスによるセル範囲の選択や入力データ型の制限が可能です。記述ルールと正解の選択肢を押さえましょう。

1. 問題:マウスによるセル範囲の取得と Type 引数

【 問題 】 下記のコードは、ダイアログボックスを表示してユーザーにマウスでワークシート上のセル範囲を選択させ、選択されたセル範囲(Rangeオブジェクト)をオブジェクト変数 rng に格納しようとしています。空欄 ( A ) に入る正しい記述はどれでしょうか?

Sub SelectCellRange()
    Dim rng As Range

    On Error Resume Next
    ( A ) Application.InputBox(Prompt:="セルを選択してください", Type:=8)
    On Error GoTo 0

    If Not rng Is Nothing Then
        MsgBox "選択されたセル: " & rng.Address
    End If
End Sub

① rng =
② Set rng =
③ rng.Value =
④ Set rng.Address =

2. 正解:InputBox メソッドの代入記述に関する正解

正解: ② Set rng =

3. 解説:Application.InputBox メソッドと Type:=8 の重要ルール

Application.InputBox メソッドで Type:=8 を指定すると、戻り値としてセル範囲を表す Range オブジェクトが返されます。

[ Application.InputBox の構造とポイント ]

1. Type:=8 の場合は Set キーワードが必須!
Type:=8 で返されるデータは「Range オブジェクト(参照型)」です。VBAではオブジェクト変数(rng)にオブジェクトを代入する際、必ず頭に Set を記述しなければなりません(①のように Set を省くと「オブジェクト変数または With ブロック変数が設定されていません」というエラーになります)。

2. InputBox 関数(VBA組み込み)との決定的な違い
InputBox 関数:戻り値は常に「文字列(String)」。セル選択は不可。
Application.InputBox メソッドType:=8 を指定することで「マウスによるセル選択」が可能となり、Rangeオブジェクトを取得できる。

3. キャンセル時のエラー回避(On Error Resume Next)
Type:=8 のダイアログでユーザーが「キャンセル」ボタンを押すと、Rangeオブジェクトではなく False が返されるため型エラーが発生します。そのため、コード内のように On Error Resume Next でエラーを回避するのが定石です。

ここが試験に出る!: スタンダード試験では、「Type:=8(セル範囲)には Set が必要」「Type:=1(数値)や Type:=2(文字列)などの基本型には Set は不要」という、代入時の Set の要否と Type 引数の値(数値:1、文字列:2、セル範囲:8)の組み合わせが頻繁に狙われます。


4. まとめ

「セル範囲を選択させるなら Set rng = Application.InputBox(..., Type:=8) 」。このパターンを押さえておけば、マクロ実行時にユーザーへ集計対象セルを自由に選択させるようなインタラクティブで柔軟なツールを作成できるようになります。


【VBAスタンダード対策】MkDir ステートメントによるフォルダ作成処理を攻略!

VBAで新しいフォルダ(ディレクトリ)を自動生成する際に使用するのが MkDir ステートメント です。指定方法の記述ルールや、すでにフォルダが存在する場合の挙動などの重要な注意点をマスターしましょう。

1. 問題:MkDir ステートメントによるフォルダ作成

【 問題 】 C:\Data フォルダの中に、Backup という名称の新しいフォルダを作成したい。空欄 ( A ) に入る正しい記述はどれでしょうか?

Sub CreateFolderTest()
    Dim folderPath As String
    folderPath = "C:\Data\Backup"

    ( A )
End Sub

① CreateFolder folderPath
② MkDir folderPath
③ MkDir(folderPath)
④ Application.MakeDirectory folderPath

2. 正解:MkDir ステートメントの記述に関する正解

正解: ② MkDir folderPath

3. 解説:MkDir ステートメントの構文とエラー回避のポイント

指定したパスに新しいフォルダを作成するには MkDir ステートメント(Make Directoryの略)を使用します。

[ MkDir の構文構造と注意ルール ]

構文:MkDir 作成したいフォルダのパス

1. 記述のルール(ステートメント):
MkDir は関数ではなくステートメント(命令文)のため、引数をカッコ ( ) で囲まず、MkDir folderPath のように空白を空けてパスを指定します。

2. 誤り(①, ③, ④)の理由:
・①(CreateFolder): CreateFolder は FileSystemObject (FSO) のメソッドであり、標準VBAステートメントではありません。
・③(MkDir(folderPath)): 単一の引数を戻り値なしで呼び出す際にカッコをつける記述はVBAの構文違反となります。
・④(Application.MakeDirectory): Application オブジェクトにこのようなメソッドは存在しません。

3. 実務・試験での超重要注意点(同名フォルダの存在):
作成しようとするフォルダがすでに存在する場合、実行時エラー75(「パス名またはファイル名が正しくありません。」)が発生してプログラムが停止します。実務では Dir(folderPath, vbDirectory) 等で事前チェックを行うのが定石です。

ここが試験に出る!: スタンダード試験では、フォルダを作成する MkDir と、フォルダを削除する RmDir の名称の対応や、すでにフォルダが存在する場合のエラー判定問題がよく出題されます。


4. まとめ

「フォルダの作成は MkDir フォルダパス 」。このステートメントを押さえておけば、当日の日付名がついたフォルダ(例: C:\Data\20260814)を自動作成してレポートを格納するような実務マクロも簡単に組めるようになります。