• ベストアンサー

access2003 変数の値を別ファイルから読み込む方法について

いつもお世話になっております。 どなたかアドバイス頂ければありがたいです。 現在会社の勤務表をaccess2003にて作成しております。 勤務表テーブル、フォーム1フォームがあり フォームの各入力コントロール(テキストボックス等)に入力 した値をコマンドボタンのイベントで勤務表テーブルに入れるように なっています。 各コントロールの状況によってMsgBox関数を使用しメッセージを 表示するようになっているのですが、(例えば出社時間が退社時間が 早い時間で入力されている場合やユーザー名を選択しないで登録 しようとした場合など) この表示するメッセージを別のファイルに登録しMsgBox関数が 使用される時にそのファイルからメッセージを読み込み表示する ようにしたいのです。 何か方法がありましたらよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

まず、以下の内容のテキストファイルを作りましょう。 --ここから------------ 0,"メッセージだほ" 1,"メッセージほにゃらら" 2,"メッセージほげほげ" 3,"メッセージはふはふ" 4,"メッセージんがぐぐ" (略) 19,"メッセージばぶばぶ" 20,"メッセージぴろぴろ" --ここまで------------ 次に、以下の方法で、そのテキストファイルをデータベースにリンクします。 1.データベースを開く 2.テーブルタグを表示 3.テーブルリストで右クリックして「テーブルのリンク」を選ぶ 4.「ファイルの種類」を「テキストファイル(*.txt;*.csv...)」にして、前述のメッセージが書き込まれているテキストファイルを選択 5.区切り記号付きを選択し、次へ 6.区切り記号にカンマを選択し、次へ 7.「フィールド1」を「ID」に、「フィールド2」を「メッセージ」に変える 8.リンクテーブル名を「メッセージ一覧」などと指定する 9.完了を押し、リンクを完了する そうしたら、前述のテキストファイルは、通常のテーブルと同様に扱えます。 フォーム1のVBコードの先頭に以下のように追加します。 --ここから------------ ption Compare Database ←元からある行 Option Explicit ←元からある行 Dim 外部メッセージ(20) As String '最大値20 --ここまで------------ フォーム1の「開く時」にイベントプロシージャを記述します。 --ここから------------ Private Sub Form_Open(Cancel As Integer)   Dim DB As DATABASE   Dim RT As Recordset   Dim i As Long   Set DB = CurrentDb   Set RT = DB.OpenRecordset("メッセージ一覧", dbOpenDynaset)   For i = 0 To 20 '最大値20     If RT.EOF Then       Exit For     End If     外部メッセージ(RT![ID])=RT![メッセージ]     RT.MoveNext   Next   RT.Close   Set RT = Nothing   DB.Close   Set DB = Nothing   (元からある文) (以下略) End Sub --ここまで------------ 実際に使う場合は、   MsgBox 外部メッセージ(3) などと書きます。 上記では、メッセージの番号は0~20です。増やす場合は「最大値20」のコメントが付いた行を書き替えましょう。

leadman
質問者

お礼

すいません、私の勘違いでした。 Dim 外部メッセージ(20) As String '最大値20 この部分を標準モジュールに貼り付けてしまっていました。 よって解決できました。 ありがとうございました。非常に感謝しております!!!

leadman
質問者

補足

早速の回答ありがとうございます。 アドバイス通りやっているのですが 外部メッセージ(RT![ID])=RT![メッセージ] の部分でコンパイルエラーになってしまいます。 どうしたらよろしいでしょうか? メッセージ一覧をリンクで作成しソースはそのまま貼り付けて いるのですが。 どうかよろしくお願いします。

その他の回答 (2)

noname#140971
noname#140971
回答No.3

テキストファイル[C:\Temp\Message.txt]: 警告文01: これはメッセージ文1です。 警告文02: これはメッセージ文2です。 多分、複数の警告文から任意の文を選択する仕組みにしないと実用性がありません。 Private Sub コマンド0_Click()   MsgBox GetMessage(CurrentProject.Path & "\Message.txt", "警告文01") End Sub Private Function GetMessage(ByVal filName As String, ByVal ID As String) As String   Dim Msg As String      Do     Msg = FileRead(filName)     If CutStr(Msg, ":", 1) = ID Then       GetMessage = Trim(CutStr(Msg, ":", 2))       FileRead "", True       Exit Do     End If   Loop Until Msg = "" End Function で、このように警告文識別子に従って該当する警告文を戻す関数を作成する必要があるかと思います。 GetMessage関数は、非常にシンプルだと思います。 Msgが無くなるまでファイルを1行単位で読み込みます。 で、コロン(:)で区切られた識別子が一致すればメッセージをセットしてDoループから抜け出します。 その際に<FileRead "", True>でファイルを閉じます。 なお、GetMessage関数では、FileRead関数とCutStr関数を使っています。 Public Function FileRead(ByVal FileName As String, Optional isStop As Boolean = False) As String On Error GoTo Err_FileRead   Static isOpen As Boolean   Static fso  As Object   Static fil  As Object   Static txs  As Object      If Not isOpen Then     isOpen = True     Set fso = CreateObject("Scripting.FIleSystemObject")     Set fil = fso.GetFile(FileName)     Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   End If   FileRead = txs.ReadLine Exit_FileRead:   If Len(FileRead) = 0 Or isStop Then     isOpen = False     Set txs = Nothing     Set fil = Nothing     Set fso = Nothing   End If   Exit Function Err_FileRead:   Resume Exit_FileRead End Function Public Function CutStr(ByVal Text As String, _             ByVal Separator As String, _             ByVal N As Integer) As String   Dim strDatas() As String      strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function

leadman
質問者

お礼

返信遅くなり大変申し訳ありません。 そして大変感謝しています。 今回は他の方のアドバイスにてやりたいことだできたので 次回以降に参考にさせて頂きます。 本当にありがとうございました。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

追記。 MsgBoxに複数行のメッセージを出したい場合は、テキストファイルを --ここから------------ 0,"メッセージだほ",, 1,"メッセージほにゃらら","メッセージ2行目だよもん", 2,"メッセージほげほげ","2ぎょ~め","3行目も~" 3,"メッセージはふはふ",, 4,"メッセージんがぐぐ",, (略) 19,"メッセージばぶばぶ","これも2行あったり", 20,"メッセージぴろぴろ",, --ここまで------------ のようにして、テーブルのリンク時に、フィールド名を「ID」「メッセージ」「メッセージ2行目」「メッセージ3行目」にしてリンクします。 で、フォーム1の「開く時」の     外部メッセージ(RT![ID])=RT![メッセージ] の行の次に --ここから------------     If Not IsNull(RT![メッセージ2行目]) Then       外部メッセージ(RT![ID]) = 外部メッセージ(RT![ID]) & Chr(13) & Chr(10) & RT![メッセージ2行目]     End If     If Not IsNull(RT![メッセージ3行目]) Then       外部メッセージ(RT![ID]) = 外部メッセージ(RT![ID]) & Chr(13) & Chr(10) & RT![メッセージ3行目]     End If --ここまで------------ を追加しましょう。 この例では「3行まで」出せます。

関連するQ&A