Excel VBA | 上級問題セット

VBA
スポンサーリンク

ここでは VBA の上級者向けとして、以下の分野をすべて網羅した問題セットを紹介します。

  • クラスモジュール
  • Dictionary
  • JSON(Parse/Serialize)
  • Web API 呼び出し(WinHTTP)
  • ADO(DBアクセス)
  • 標準モジュール設計(疎結合・責務分離)

すべて 実務レベルの課題形式で、必要なコード例も付けます。


【1】クラスモジュール:社員オブジェクトを作る

問題

社員を表すクラス Employee を作成し、以下のメンバーを持たせよ。

  • プロパティ:Name(String)、Age(Long)、Department(String)
  • メソッド:GetInfo() → “名前/ 年齢 / 部署” 形式で返す
    標準モジュールから 3 人分の Employee を作り、Debug.Print で情報を表示せよ。

模範コード(クラス Employee.cls)

Public Name As String
Public Age As Long
Public Department As String

Public Function GetInfo() As String
    GetInfo = Name & " / " & Age & " / " & Department
End Function
VB

呼び出し側

Sub Q1()
    Dim e As Employee
    Set e = New Employee

    e.Name = "田中"
    e.Age = 30
    e.Department = "総務"

    Debug.Print e.GetInfo
End Sub
VB

【2】クラス:商品の小計・消費税を計算する

問題

商品クラス Product を作成し、
価格 × 数量の 小計、および 10% の 税込価格 を返すメソッドを作れ。


【3】クラス:CSV を読み込んで行オブジェクトを格納する

問題

  • LineItem クラス:Columns() 配列を持つ
  • CSVReader クラス:Load(path) → LineItem のコレクションを返す
    標準モジュールから CSV を読み込み、3 行目の 2 列目を表示せよ。

※実務でよくある「1行=1オブジェクト」構造。


【4】Dictionary:社員名簿(名前→部署)を管理する

問題

以下の要件で Dictionary を使う。

  • キー:社員名
  • 値:部署名
  • 追加→検索→一覧表示→削除 の処理を作成

ヒントコード

Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")

dic("佐藤") = "開発"
dic("田中") = "総務"

Debug.Print dic("佐藤")
VB

【5】Dictionary:商品ID → 商品情報オブジェクトのマップ

問題

  • Key:商品ID(String)
  • Item:前問の Product クラス

クラスと Dictionary の組み合わせによる「オブジェクトマップ」を作成し、
ID=”A001″ なら税込価格を表示せよ。


【6】JSON:Dictionary → JSON への変換

問題

以下のデータを JSON に変換せよ。(JSON.stringify 相当)

Name: "山田"
Age: 40
Skills: ["Excel", "VBA", "SQL"]

VBA-JSON(JsonConverter.bas)使用可。

ヒント

JsonConverter.ConvertToJson(dict)
VB

【7】JSON:JSON → Dictionary 配列への変換

問題

以下の JSON をパースし、
Name を全員分 Debug.Print せよ。

[
  {"Name": "田中", "Score": 80},
  {"Name": "鈴木", "Score": 90}
]

【8】Web API:HTTP GET リクエストでデータ取得

問題

以下の API から JSON を取得せよ(例:ダミー API)。

https://jsonplaceholder.typicode.com/posts/1

WinHttpRequest を使い、取得した JSON の title を表示せよ。

ヒントコード

Dim http As Object
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

http.Open "GET", url, False
http.Send
body = http.ResponseText
VB

【9】Web API:HTTP POST でデータを送信

問題

以下の JSON を POST し、返ってきたレスポンスを表示せよ。

{"name": "Taro", "age": 20}

Content-Type: application/json
を指定すること。


【10】ADO:Access DB から社員一覧を取得

問題

Access(.accdb)ファイルから
社員テーブル(Employees)を SELECT するプログラムを作成し、
Name 列をすべて表示せよ。

ヒントコード

Dim cn As Object, rs As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.accdb"
Set rs = cn.Execute("SELECT * FROM Employees")
VB

【11】ADO:データをINSERTして追加

問題

Access の Employees テーブルへ
(”Suzuki”, 28, “Sales”)を INSERT せよ。


【12】標準モジュール設計:疎結合のデータ処理アーキテクチャを組む

問題(大型)

次の仕様で、役割ごとにモジュールを分割した設計を行うプログラムを作れ。


【仕様】

1. CSV 読み込み

ファイルから以下の形式を読み取る:

Name, Score
Tanaka,80
Suzuki,90
Sato,70

2. データ処理

Score が 80 以上の人だけ抽出。

3. 結果を JSON に変換。

4. 結果 JSON を API に POST。


モジュール分割例

  • CsvReader.bas
    → CSV 読み込みだけ担当
  • ScoreFilter.bas
    → データ抽出だけ担当
  • JsonWriter.bas
    → JSON 生成だけ担当
  • ApiClient.bas
    → Web API POST だけ担当
  • Main.bas
    → 上記の呼び出し・制御

「責務の分離」「テストしやすさ」「再利用性」を意識して作る。

タイトルとURLをコピーしました