いつもお世話になっております。
どなたかアドバイス頂ければありがたいです。
現在会社の勤務表をaccess2003にて作成しております。
勤務表テーブル、フォーム1フォームがあり
フォームの各入力コントロール(テキストボックス等)に入力
した値をコマンドボタンのイベントで勤務表テーブルに入れるように
なっています。
各コントロールの状況によってMsgBox関数を使用しメッセージを
表示するようになっているのですが、(例えば出社時間が退社時間が
早い時間で入力されている場合やユーザー名を選択しないで登録
しようとした場合など)
この表示するメッセージを別のファイルに登録しMsgBox関数が
使用される時にそのファイルからメッセージを読み込み表示する
ようにしたいのです。
何か方法がありましたらよろしくお願いします。
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」のコメントが付いた行を書き替えましょう。
この回答への補足
早速の回答ありがとうございます。
アドバイス通りやっているのですが
外部メッセージ(RT![ID])=RT![メッセージ]
の部分でコンパイルエラーになってしまいます。
どうしたらよろしいでしょうか?
メッセージ一覧をリンクで作成しソースはそのまま貼り付けて
いるのですが。
どうかよろしくお願いします。
すいません、私の勘違いでした。
Dim 外部メッセージ(20) As String '最大値20
この部分を標準モジュールに貼り付けてしまっていました。
よって解決できました。
ありがとうございました。非常に感謝しております!!!
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
返信遅くなり大変申し訳ありません。
そして大変感謝しています。
今回は他の方のアドバイスにてやりたいことだできたので
次回以降に参考にさせて頂きます。
本当にありがとうございました。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Excel(エクセル) 出退勤管理の遅刻・早退時間について 3 2023/08/10 15:33
- Access(アクセス) Dlookupにエラーがでてしまう 1 2022/10/31 14:35
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Excel(エクセル) 【vba】日付の形式が勝手に変わってしまう。 1 2022/09/29 10:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
VBAでコントロールのハンドルを...
-
MFC利用/WinMainCRTStartup
-
アプリケーション間での操作
-
msgboxの表示位置
-
textboxに文字列を挿入したい。
-
WM_NCLBUTTONUPについて
-
VBA 複数セルが空白なら印刷さ...
-
MQプログラミング MQGetの手法...
-
警告メッセージのセキュリティ...
-
16進数入力制限方法
-
SetWindowText関数について
-
VBでRegisterWindowMessage関数...
-
vbaから他のアプリを終了
-
WM_CLEARなど使えないメッセー...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
フォームでPDFを表示させた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
デスクトップ上のアイコンの位...
-
メッセージハンドラ
-
SendMessage で ESC など
-
SetWindowText関数について
-
VB.netでFindWindowExやると・...
-
点滅で知らせる方法
-
CloseHandle()
-
SetWindowsHookEx(グローバル...
-
Excel VBA で外部アプリケーシ...
-
VBA 複数セルが空白なら印刷さ...
-
WM_NCLBUTTONUPについて
-
VBでRegisterWindowMessage関数...
-
システム例外のメッセージを変...
-
アプリケーション間での操作
-
マウスホイールをフックしたい
おすすめ情報