• 締切済み

ACCESSのフォームについて

ACCESS勉強中の若輩もんです。 今一つのテーブルに顧客の住所や電話番号など15項目程度あります。 フォームで数人の入力作業員が打ち込んでいきます。 その中にツアーNo.というフィールドがありまして、それは一回フォームを開いて入力作業をしたらほとんど変わらず同じNo.を入れているのです。 作業の効率やミスを防ぐため、フォームを開く時にNo.を最初に入れるフォームを作り、一度の入力で顧客一人一人に反映させたいのです。 まだまだ初心者なので、ご教授お願いいたします。

みんなの回答

noname#140971
noname#140971
回答No.4

Option Compare Database Option Explicit Private Sub Form_Load()   Me.ツアーNo_既定値 = DBLookup("ツアーNo_初期値", "各種設定", "ID=1")   Me.ツアーNo.DefaultValue = Me.ツアーNo_既定値 End Sub Private Sub ツアーNo_既定値_AfterUpdate()   CnnExecute "UPDATE 各種設定 SET ツアーNo_初期値=" & Me.ツアーNo_既定値   Me.ツアーNo.DefaultValue = Me.ツアーNo_既定値   PauseMsg "[各種設定]![ツアーNo_既定値] を更新しました。", 2 End Sub 上記のやり方は、[各種設定]という様々な初期値等を記憶しておくテーブルを用意する方式。 フォームの起動時に[各種設定]に記憶された初期値を呼び出して表示します。 同時に関連するフィールドの既定値も更新します。 初期値が変更されたならば、[各種設定]を更新しメッセージで知らせます。 まあ、担当者が入れ替わろうが、途中でフォームを閉じようが同値の入力が保障されます。 さて、問題は、このやり方の実現の方法です。 僅か5行の VBAコードですが、なかなか難しいと思います。 Private Sub Form_Load()   Me.ツアーNo_既定値 = DLookup("ツアーNo_初期値", "各種設定", "ID=1")   Me.ツアーNo.DefaultValue = Me.ツアーNo_既定値 End Sub DBLookup 関数を Access がサポートしている DLookup関数に変更しました。 多少、実行速度が遅くなりますが2行は実現dきました。 Private Sub ツアーNo_既定値_AfterUpdate()   CnnExecute "UPDATE 各種設定 SET ツアーNo_初期値=" & Me.ツアーNo_既定値   Me.ツアーNo.DefaultValue = Me.ツアーNo_既定値   MsgBox "[各種設定]![ツアーNo_既定値] を更新しました。" End Sub 2秒経過したら自動的にメッセージを閉じる PauseMsg 関数も MsgBox 関数に変更。 多少、ユーザにとっては煩わしいですが、「そんなもん」と思ってもらうことにします。 さて、残るは CnnExecute 関数です。 これが無ければ、[各種設定]の更新も1行とはいきません。 そこで、 CnnExecute 関数だけは、以下に示しておきます。 Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute    Dim isOK As Boolean    Dim cnn As ADODB.Connection       isOK = True    Set cnn = CurrentProject.Connection    With cnn      .Errors.Clear      .BeginTrans      .Execute strSQL      .CommitTrans    End With Exit_CnnExecute: On Error Resume Next    cnn.Close    Set cnn = Nothing    CnnExecute = isOK    Exit Function Err_CnnExecute:    isOK = False    If cnn.Errors.Count > 0 Then      ErrMessage cnn.Errors(0), strSQL      cnn.RollbackTrans    Else      MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _         vbExclamation, " 関数エラーメッセージ"    End If    Resume Exit_CnnExecute End Function

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

別のフォームに入力した値を、 複数のフォームへの入力で使うのでなければ わざわざ別のフォームに入力するのは面倒ですね 単に連続して入力する場合の省力を考えるのなら 最後に入力されたものを規定値にセットしてやる とするほうが簡単です ツアーNoの更新後イベントに Private Sub 数量_AfterUpdate() Me.ツアーNo.DefaultValue = "'" & Me.ツアーNo & "'" End Sub 表示されているものは規定値ですから他のものに書き換えることもできます

  • Te-Sho
  • ベストアンサー率52% (247/472)
回答No.2

初心者の方という事なので説明の仕方を悩んでしまうのですが... 制御としては可能です。 その代わりですがVBAを使用する方法が一番簡単です。 始めにAccessアプリケーション内で有効な変数を定義し、その変数を設定するための簡単なコードを標準モジュールとして作成します。 -------------------------------------------------------------- Option Compare Database Dim TourNo As Integer -------------------------------------------------------------- Public Sub setTourNo(inTourNo As Integer) TourNo = inTourNo End Sub -------------------------------------------------------------- Public Function getTourNo() As Integer getTourNo = TourNo End Function -------------------------------------------------------------- このモジュール名を仮にPropsとして保存します。 次にツアーNo入力フォームを作ります。選択用のコンボボックスの作り方などは割愛します。コンボボックス名はコンボ0とします。決定ボタンはコマンド0とします。 コマンドボタンのイベントプロパティでクリック時として -------------------------------------------------------------- Private Sub コマンド0_Click() Props.setTourNo (Me.コンボ0) DoCmd.Close acForm, "ツアー入力フォーム" DoCmd.OpenForm "入力フォーム" End Sub -------------------------------------------------------------- として標準モジュールのセットメソッドを呼び出します。 その後にツアーNo入力フォームを閉じて通常の入力フォームをオープンします。 あとはレコード入力のフォームでProps.getTourNoで設定したツアーNoが取得できるとおもいます。 設定は入力フォームの作り方によって変わります。 データ移動時等に直接代入してしまうとレコードが変わるたびに戻ってしまうとおもいますので、実際にいろいろと変更して試して見てください。 また、今回のポイントはVBAを使用した場合の変数の適用範囲(スコープ)ですので、ヘルプやネットを検索する際には上記語句で検索を行って見てください。(VBやVBAの基本ですので頭に入れておくと今後、役に立つと思います。) (ちょっとJavaっぽく書いてしまいました。適用範囲から考えれば標準モジュールPropsのTourNoをDimではなくPublicとし、そのままProps.TourNoとして参照しても問題ありません。その場合はgetTourNoメソッドは不要となります。) ちょっと急いで書きましたので、コンパイルエラー以外のデバッグしてありません。ごめんなさい。

  • toku8
  • ベストアンサー率26% (64/246)
回答No.1

フォームでヘッダー、フッターを表示(表示タイトル使用) ツアーNoのテキスト(入力項目)をヘッダー部分に作成 詳細部へ他の項目テキストを作成

関連するQ&A

専門家に質問してみよう