【Excel VBA】連想配列:外部ファイルを読み込み、IDに紐づくメッセージを出力する

■作成するプログラムの概要

・Excelの「メッセージ表示」シートに「メッセージID」を入力する。

・「メッセージ表示」ボタン押下時、取得した「メッセージID」に紐づくメッセージを「message.csv」ファイルから取得する。

■フローチャート

■プログラム仕様

処理名メッセージ表示
処理概要「メッセージ表示」ボタン押下時、
セルに入力したIDと同じIDをメッセージファイルから取得し、
メッセージを表示する。
引数なし
戻り値なし

 

入力処理内容出力
【主処理】
シート名をセットする。
シート名:メッセージ表示
メッセージファイル(フルパス)をセットする。
パス:D:\macro\メッセージ取得_表示\message.csv
ファイルオブジェクトをセットする。
ファイルオープンオブジェクトをセットする。
連想配列をセットする。
【csvファイル】
メッセージファイル
message.csv
(ID,メッセージ)
■ループ処理:メッセージファイルの最終行まで
|1行ずつ読み込む。
|一時配列に、カンマ区切りの要素を格納する。
|連想配列にIDとメッセージを格納する。
【セル値】
メッセージID
セルに入力したメッセージIDを取得する。
▼条件分岐
|【IDを入力していない場合】
|入力なしを出力する。・・・①
------
|【IDがファイルに存在する場合】
|対応するメッセージを出力する。・・・②
------
|【IDがファイルに存在しない場合】
|IDなしを出力する。・・・③
------
|【上記以外】
|ID取得エラーを出力する。・・・④
【セル値】
①入力なし
②メッセージ
③IDなし
④ID取得エラー
【例外処理】
エラーメッセージを出力する。【MsgBox】
エラーメッセージ
【終了処理】
シート名を解放する。
ファイルオブジェクトを解放する。
ファイルオープンオブジェクトを解放する。
連想配列を解放する。

■画面レイアウト

①セル(N3)にメッセージIDを入力する。

②「メッセージ表示」ボタン押下時、セル(N6)に対応するメッセージを出力する。

■ファイルレイアウト

・message.csv

00001,こんにちは
00002,ありがとう
00003,さようなら

■サンプルコード

Option Explicit

' シート名の定数
Private Const SHEETNAME_MESSAGE     As String = "メッセージ表示"

' メッセージID取得行列の定数
Private Const INPUT_MESSAGE_ID_ROW  As Integer = 3
Private Const INPUT_MESSAGE_ID_COL  As Integer = 14

' メッセージ表示行列の定数
Private Const OUTPUT_MESSAGE_ID_ROW As Integer = 6
Private Const OUTPUT_MESSAGE_ID_COL As Integer = 14

' メッセージファイルのファイル名とパス
Private Const MESSAGE_FILE_NAME     As String = "message.csv"
Private Const MESSAGE_FILE_PATH     As String = "D:\macro\メッセージ取得_表示\"


' 処理名    :メッセージ表示
' 処理概要  :「メッセージ表示」ボタン押下時、
'               セルに入力したIDと同じIDをメッセージファイルから取得し、
'               メッセージを表示する
' 引数       :なし
' 戻り値    :なし
Public Sub btn_click_GetMessageID()

    Dim sht_message     As Worksheet    ' シート格納変数
    Dim filename        As String       ' ファイル名(フルパス)
    Dim fso             As Object       ' ファイルオブジェクト
    Dim openfile        As Object       ' ファイルオープンオブジェクト
    Dim strLine         As String       ' ファイルを1行ごとに格納
    Dim msg_dictionary  As Object       ' 連想配列:メッセージID,メッセージ
    Dim tmp_list()      As String       ' 一時格納配列
    Dim input_message   As String       ' セルから取得したメッセージID
    

On Error GoTo btn_click_GetMessageID_error
    
    ' シート名をセット
    Set sht_message = Sheets(SHEETNAME_MESSAGE)
    
    ' メッセージファイル(フルパス)をセット
    filename = MESSAGE_FILE_PATH & MESSAGE_FILE_NAME
    
    ' ファイルオブジェクトをセット
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' ファイルオープンオブジェクトをセット
    Set openfile = fso.opentextfile(filename)
    
    ' 連想配列をセット
    Set msg_dictionary = CreateObject("Scripting.Dictionary")
    
    ' メッセージファイルの最終行まで繰り返し
    Do Until openfile.AtEndOfStream = True
        ' 1行ずつ読み込み
        strLine = openfile.ReadLine
        
        ' 一時配列に、カンマ区切りの要素を格納(0:ID、1:メッセージ)
        tmp_list() = Split(strLine, ",")
        
        ' 連想配列にIDとメッセージを格納
        msg_dictionary.Add tmp_list(0), tmp_list(1)
        
    Loop
    
    ' 「メッセージ表示」シートにフォーカス
    With sht_message
        
        ' 入力したメッセージIDを取得
        input_message = _
            .Cells(INPUT_MESSAGE_ID_ROW, INPUT_MESSAGE_ID_COL).Value
    
        ' IDが入力していない場合
        If input_message = "" Then
        
            ' ID入力を出力
            .Cells(OUTPUT_MESSAGE_ID_ROW, OUTPUT_MESSAGE_ID_COL).Value = _
                "IDを入力してください"
        
        ' メッセージIDがファイルに存在する場合
        ElseIf msg_dictionary(input_message) <> "" Then
            
            ' メッセージを出力
            .Cells(OUTPUT_MESSAGE_ID_ROW, OUTPUT_MESSAGE_ID_COL).Value = _
                msg_dictionary(input_message)
        
        ' メッセージIDがファイルに存在しない場合
        ElseIf msg_dictionary(input_message) = "" Then
            
            ' IDなしを出力
            .Cells(OUTPUT_MESSAGE_ID_ROW, OUTPUT_MESSAGE_ID_COL).Value = _
                "IDが存在しません"
        
        ' メッセージID取得の例外処理
        Else
        
            ' エラーを出力
            .Cells(OUTPUT_MESSAGE_ID_ROW, OUTPUT_MESSAGE_ID_COL).Value = _
                "エラーID取得エラー"
            
        End If
        
    
    End With
    
    ' 終了処理へ
    GoTo btn_click_GetMessageID_exit

' 例外処理
btn_click_GetMessageID_error:
    
    ' エラーメッセージを出力
    MsgBox Err.Description
    
    ' 終了処理へ
    GoTo btn_click_GetMessageID_exit

' 終了処理
btn_click_GetMessageID_exit:
    
    ' オブジェクト系を解放
    Set openfile = Nothing
    Set fso = Nothing
    Set sht_message = Nothing
    Set msg_dictionary = Nothing
    
End Sub

■実行結果

▼正常系

・「00001」入力後、「メッセージ表示」ボタンを押下する。

・「00002」入力後、「メッセージ表示」ボタンを押下する。

・「00003」入力後、「メッセージ表示」ボタンを押下する。

▼異常系

・セル(N3)にIDを入力せずに「メッセージ表示」ボタンを押下する。

・セル(N3)について、メッセージファイル(message.csv)に存在しないID「00004」を入力し、「メッセージ表示」ボタンを押下する。

コメント