• ベストアンサー

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

  • ACCESS2003 リストボックスについて教えて頂けませんか?

    こんにちは、何度も助けていただいているのですが、 また、わからないことがありまして進めなくなってしまいました。 どなたかアドバイス頂ければと思います。 現在Access2003にて会社の勤務表を作成するという課題に 取り組んでおります。 今回の疑問点は 入力用のフォーム フォーム1にはユーザー名コンボボックス、 日付Calendarコントロール、出社時間、退社時間、作業時間、 作業内容テキストボックス、登録、クリアコマンドボタン、 勤務状況表示リストボックスの各コントロールがあります。 登録をする際には各コントロールを選択ないし入力をし、 登録ボタンで各コントロールの値を勤務状況表示リストボックス に表示するようになっています。(1日分の登録を1行で表示。 登録状況に関わらず1ヶ月毎に表示しているので、まだ何もしていなく ても1ヶ月分の31行が表示されており、毎日登録をしていくことで 時間などがうまっていくようになっています。) ここまでは何も問題ないのですが、 勤務状況表示リストボックスに表示されている任意の日付、 例えば8日の行を選択した時に8日の行に表示されている ユーザー名、日付、出社時間、退社時間、作業時間、作業内容を 入力をした各コントロールと連動し表示させるようにしたいのです。 いろいろ調べてはいるのですがなかなかいい方法が見つかりません。 今の段階では1日の行しか選択できない状態です。 どなたかよい方法をご存知ありませんでしょうか? よろしくお願いします。

  • アクセス サブフォームのレコードの値が変更したら

    フォームの中にテーブルに基づいたサブフォームを入れています。 サブフォームはデータシートビューで表示しています。 そのサブフォームのレコードの値が変わったら msgboxを表示させるにはどのイベントで行なえば良いですか? サーブフォームのコントロールに Private Sub ページ名_AfterUpdate() MsgBox "" End Sub としたら確かにメッセージボックスは表示されるのですが 全てのコントロールにつけないとだめですか? 「サブフォームのレコードの値が変更したら」 とするにはどうすればいいでしょうか?

  • Access2003 DateSerial関数について教えて頂けないでしょうか?

    いつも助けていただき感謝しています。 また、わからないことがでてしまいまして、どなたかアドバイス 頂けないでしょうか? 現在access2003にて勤務表を作成中です。 作成中に様々なアドバイス頂き大分進んだのですが今回は、、、 勤務表テーブルとフォーム1フォームがあります。 フォームにはユーザーを選択するコンボボックスと年月を検索する コマンドボックス(例えば2008年04月分の勤務を検索したい場合に押します。) があります。(他のコントロールもあるのですが今回は影響ないと思いますので省略します。) 検索コマンドボックスを押した際、ユーザーコマンドボックスにて選択されている ユーザーを使用。空白ならインプットボックスを表示させ検索したいユーザーを入力してもらい、 そのユーザーを使用します。 その後、さらにインプットボックスを表示し検索したい月を入力してもらい ユーザーの検索したい月の勤務をフォーム内のリストボックスに表示させたいのですが、、、 インプットボックスに入力された月をどのように勤務表テーブルの日付フィールドと比較 すればよいのかわかりません。 SQL文でユーザー名から勤務表テーブルのデータを検索selectできるところまでいったのですが 条件にインプットボックスの値を使用するようにためしてもうまくいきません。 DateSerial関数を使用するなどやってはみたのですが、、、どなたかアドバイスよろしく お願いします。 Private Sub コマンド90_Click() Dim user Dim userkensaku3 Dim username Dim userkensaku2 Dim kensaku Dim tukisuu Dim saisyouti Dim gennzai If IsNull(コンボ56) = True Then user = InputBox("検索したいユーザー名を入力して下さい。 " ) userkensaku3 = DCount("*", "ユーザー", "ユーザー名='" & user & "'") Else username = コンボ56 userkensaku2 = DCount("*", "ユーザー", "ユーザー名='" & username & "'") End If kensaku = userkensaku2 Or userkensaku3 If kensaku = 0 Then MsgBox ("検索したいユーザーは登録されていません。登録をするか、入力をやり直して下さい。") Else tukisuu = InputBox("検索したい年、月を入力して下さい。" & vbCrLf & vbCrLf & "例 2008/06", "検索年月入力画面") saisyouti = Format(DMin("[日付]", "勤務表"), "yyyy/mm") gennzai = Format(Date, "yyyy/mm") End If If tukisuu = "" Then MsgBox ("値が入力されていません。") ElseIf tukisuu < saisyouti Then MsgBox ("検索対象外です。入力をやりなおして下さい。") ElseIf tukisuu > gennzai Then MsgBox ("検索対象外です。入力をやりなおして下さい。") ElseIf user = "" Then リスト42.RowSourceType = "Table/Query" リスト42.RowSource = "select ユーザー名,日付,出社,出社属性,退社,退社属性,作業時間,作業内容 from 勤務表 " & _ "where ユーザー名 ='" & username & "' ;" End If End Sub

  • ACCESS 2003の条件分岐について教えて頂けないでしょうか?

    access2003を勉強中です。 先週1週間かけても解決できないことがありまして、どなたか教えて頂けないでしょうか。 内容は 会社で使用する勤務表に関してです。 ユーザー名(コンボボックス)、日付(カレンダーコントロール)、 出社時間(テキストボックス)、退社時間(テキストボックス 、作業内容(テキストボックス)をユーザーが入力し「登録」 コマンドボタンのイベントで入力した内容を、勤務表テーブルに 反映させたいのです。 その時に同じユーザーの同じ日付を2件入力させないようにしたいので フォームに入力された内容からユーザー名と日付によって、 同じ内容が勤務表テーブルに無ければinsert、有ればupdateと 条件分岐をしたいのです。 しかし、 Public Sub kinmu() Dim mmrs As ADODB.Recordset Dim mmcn As ADODB.Connection Set mmrs = New ADODB.Recordset Set mmcn = Application.CurrentProject.Connection mmrs.Open "勤務表", mmcn, adOpenKeyset, adLockOptimistic mmrs.MoveFirst If DCount("[ユーザー名] & [日]", "[勤務表]", "[ユーザー名]=[Forms]![フォーム1]![コンボ56]" & _ "and[日]=[Forms]![フォーム1]![テキスト88]") = 0 Then mmcn.Execute "INSERT INTO 勤務表 ([ユーザー名],[日],[出社],[退社],[作業内容]) VALUES ([Forms]![フォーム1]![コンボ56],[Forms]![フォーム1]![テキスト88],[Forms]![フォーム1]![テキスト8],[Forms]![フォーム1]![テキスト17],[Forms]![フォーム1]![テキスト28]);" Else mmcn.Execute "UPDATE 勤務表 SET (ユーザー名=[Forms]![フォーム1]![コンボ56],日=[Forms]![フォーム1]![テキスト88],出社=[Forms]![フォーム1]![テキスト8],退社=[Forms]![フォーム1]![テキスト17],作業内容=[Forms]![フォーム1]![テキスト28] where [ユーザー名]=[Forms]![フォーム1]![コンボ56] and [日]=[Forms]![フォーム1]![テキスト88]);" End If として、「登録」コマンドボタンのイベントとしてCallキーワードによって呼び出そうとしているのですが、うまくいきません。 最初はDCount関数で件数を求め、それを変数に入れる。 IIF関数による分岐。などいろいろ試してはいたのですが、、、。 どなたか教えて下さい。よろしくお願いします。

  • パラメータ入力ダイアログボックスについて

    access2003を勉強中です。 先日会社で使用する勤務表に関して質問をさせて頂き親切な方の協力によりなんとか進むことができました。 そして情けない話、またつまってしまってまして、本やネットにて調べているのですが解決できていません。 どなたかアドバイス頂けないでしょうか? 内容は ユーザー名、日付、出社、退社、勤務内容を入力するフォームが ありまして、「登録」コマンドボタンで入力した内容を勤務表 テーブルに反映させるようになっています。 フォームの中で「検索」コマンドボタンを作成し、イベントで インプットボックスを表示し、入力月のデータを勤務表テーブルから 取り出しフォームのリストボックスに表示させようとしています。 Dim inputatai as integer inputatai = inputbox("検索したい月を入力して下さい。") if inputatai => 0 AND inputatai <= 12 Then ,,,, 1から12が入力されれば勤務表テーブルから該当データを取り出し、 それ以外は再度入力を促すMsgBoxを表示しようとしていたのですが、、、 この場合条件分岐にSQLのSELECT文が使用できないことは わかったので一度コードを削除して他の部分にとりかかっていたの ですが、それ以降フォームを開くとパラーメータの入力ダイアログ ボックスが出るようになってしまい、どうしても出ないように できません。どうすれば出ないようにできるのでしょうか? どなたかご存知のかたよろしくお願いします。

  • Access テーブルの添付ファイル型への登録

    お世話になります。 Access2010 Accessにて社員情報を登録するツールを作成しているのですが、 テーブルの添付ファイル型への登録方法をご教示願います。 社員情報を新規登録するためのフォーム「社員情報登録」があり、 そこで社員の画像を選択させ、最終的にテーブルの添付ファイル「画像」 に登録したいところです。 現状、ファイル選択ダイアログから画像ファイルを選択させ、その画像ファイルの パスを取得するところまでは出来てます。 なお、フォーム上にはイメージコントロール「画像」を設置し、  Me.![画像].Picture=画像ファイルのパス で表示させてます。 フォーム上の登録ボタンが押されたときに、単純にAddNewして テーブル![画像]=画像ファイルのパスだとエラーになって しまうと思うのですが・・テーブルの添付ファイル型フィールド「画像」に ファイルを登録する方法をお教え下さい。 **************** 別の質問になるのですが、添付ファイルコントロールは、テーブルの 添付ファイルを表示させる為のものという認識です。 なので、新規登録する画面ではまだレコードが存在しない状態なので 添付ファイルコントロールは使えないと思うのですが、その認識で 間違いないでしょうか。 なので、新規登録画面では使えないけど、修正画面では使えると思ってます。 (既にレコードが存在するので、画像が登録されていたら表示できる) 以上、宜しくお願い致します。

  • ACCESS.ルックアップの値以外を受け付けないようにしたい。

    ACCESS2007を使用しています。 テーブルのフィールド設定でルックアップを設定しています。 表示コントロール:コンボボックス 値集合タイプ:値リスト ここで、値集合ソースにリストしたもの以外はテーブルに格納されないように したいのですが、可能でしょうか? 「入力チェック」を「YES」にしているのですが、 この場合でもテーブルでの直接入力やフォームを使用しての入力ではエラーがでますが、 Excelからの複数セルまとめてのコピー&貼り付けを行うと貼り付けられてしまいます。 解決する方法がありましたら教えてください。

  • Access2003にて・・・

     こんにちは。Accessにて、詰まってしまいまして、お知恵をお借りできればと思っています。よろしくお願いします。 Access2003 にて テーブルAには、 品番、品名、単価の3つのフィールドがあります。 このテーブルをもとにして、フォームAを単票形式で作成しました。 このフォームを、品番を登録したりするためではなく、品名や単価の確認用として使用したいと考えています。そこで、「品番」コントロールに品番を入力すると、あとの2つのコントロールに自動でデータが表示されるようにできればいいな、と思いました。  「品番」コントロールはコンボボックスに変更し、テーブルAの品番から値を取得するよう設定し、ここを入力したあと更新後処理であとの2つのコントロールに値を表示するような設定をするのかな、というところまで至って、はてここにどのような処理を書き込めばいいのかで詰まってしまいました。  このやり方がそもそも間違っているのかもしれません。テーブルをもとにするのではなく先にクエリを作っておくのがいいのかもしれませんが、自分なりにいろいろ試してみたのですが、なかなかうまくいかなくて…  何か方法はありますでしょうか?他にここへ組み込むサブフォームやら、別のフォームを表示させるボタン等考えているのですが、上記の方法ができるかできないかでフォームAのつくりを変えようと思っているので、とりあえずは必要と思われることだけ書きました。言っていただければどんどん補足させていただきますので、何か方法がございましたらご教授お願いいたします。 (ちなみに、私のAccessレベルは初心者でございます…)

  • Access2003 コントロールの(?)エラーメッセージ

    Access2003 コントロールの(?)エラーメッセージ excelからインポートしたデータでテーブルを作り、そこから、今後もデータを増やしていけるようにフォームを作ろうとしています。 まず、オートフォームでフォームを作りました。 データの中に「カテゴリー」を表示するフィールドがあり、そこはフォーム入力時にプルダウンで選んで登録できるように、コンボボックスを使ってカテゴリーフィールド(コントロール)を作りなおしたところ、「例えば数値型のフィールドに文字列を挿入しようとした」というようなエラーメッセージが出ます。 このフィールドは元からテキスト値が入っていたところで、プルダウンで選べるようにしたカテゴリーリストのテーブルの方もテキスト値で入力しています。 なので、このエラーメッセージが「例えば」と言っているのと全く同じエラー(数値型のフィールドにテキスト値を入れる)がでているわけではないとは思うのですが、他に何が悪のいかがわかりません。 どこをどうしたらいいのでしょうか?

  • access(アクセス):検索して、該当すればメッセージを表示したい

    よろしくお願いいたします。 フォームのテキストボックスに数字を入力したときに この数字がテーブルのリストに存在する数字の場合は、 「該当有」とメッセージボックスで表示したく思っております。 例 テーブル   フォーム    メッセージボックス  1       2       該当有と表示  2       9       なにも表示しない  3      1,9       該当有と表示  4  5 メッセージボックスの表示の仕方はわかるのですが、 関数で検索をどのようにしたらよいかわかりません。 よろしくお願いいたします。

専門家に質問してみよう