アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。

どなたかアドバイス頂ければありがたいです。

現在会社の勤務表をaccess2003にて作成しております。

勤務表テーブル、フォーム1フォームがあり

フォームの各入力コントロール(テキストボックス等)に入力

した値をコマンドボタンのイベントで勤務表テーブルに入れるように

なっています。

各コントロールの状況によってMsgBox関数を使用しメッセージを

表示するようになっているのですが、(例えば出社時間が退社時間が

早い時間で入力されている場合やユーザー名を選択しないで登録

しようとした場合など)

この表示するメッセージを別のファイルに登録しMsgBox関数が

使用される時にそのファイルからメッセージを読み込み表示する

ようにしたいのです。

何か方法がありましたらよろしくお願いします。

A 回答 (3件)

まず、以下の内容のテキストファイルを作りましょう。


--ここから------------
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![メッセージ]

の部分でコンパイルエラーになってしまいます。

どうしたらよろしいでしょうか?

メッセージ一覧をリンクで作成しソースはそのまま貼り付けて

いるのですが。

どうかよろしくお願いします。

補足日時:2008/07/15 13:16
    • good
    • 0
この回答へのお礼

すいません、私の勘違いでした。

Dim 外部メッセージ(20) As String '最大値20

この部分を標準モジュールに貼り付けてしまっていました。

よって解決できました。

ありがとうございました。非常に感謝しております!!!

お礼日時:2008/07/15 13:24

テキストファイル[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
    • good
    • 0
この回答へのお礼

返信遅くなり大変申し訳ありません。

そして大変感謝しています。

今回は他の方のアドバイスにてやりたいことだできたので

次回以降に参考にさせて頂きます。

本当にありがとうございました。

お礼日時:2008/07/17 11:00

追記。



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行まで」出せます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!