VBA(Access)

【Access VBA】データ一覧フォームから単票フォームを起動させる

スポンサードリンク

Accessフォームを活用することで効率よくデータを入力できるのはなんとなく分かるけど、どのように作り込めばいいか悩んでいませんか?

今回は、データ一覧フォームから単票フォームを起動させる方法を解説します。

システム開発や導入が未経験の人にとっては、画面遷移の流れを組むのは敷居が高く感じてしまうかもしれません。

この記事を書いているぼく自身も、Excelに限界を感じてAccessの学習を始めているので、以前はフォームをどのようにAccessデータベースに組み込んだらよいかイメージできませんでした。
しかし、システムベンダーとの交渉窓口の経験を通じ、業務システムの画面構成や遷移について深く学ぶことができました。
そのときに学んだ知識は、自分でAccessデータベースを構築するときにも大きく役立っています。

特に大事なのは、データ一覧から単票フォームを起動させる方法です。
この方法は、業務システムを構築するときに欠かせないものであり、ユーザーにストレスなくシステムを操作してもらうための基礎だと言えるでしょう。
本記事では、そんなシステム構築で必ず押さえておきたい、画面遷移で使えるテクニックを解説していきます。

今回もサンプルデータベースを準備していますので、是非活用してください。

≫ サンプルデータベース 「Input_SlipData_01」

スポンサードリンク

完成品の動作

サンプルデータベースのフォーム「F02発注伝票M」を開きます。

サブフォームの下には、「編集」「データ削除」「新規作成」の3つのボタンが配置されています。
どのような動きになるのかをそれぞれ確認していきましょう。

まずは新規作成ボタンをクリックしてみます。

空欄の単票フォームが起動しました。

フォームの起動時には管理番号が自動で発行されます。
管理番号を発行する一連の動作は、自動採番という用語でよく使われるので覚えておきましょう。

発注者も自動入力されます。

開いた単票フォームは閉じておきましょう。

次に、サブフォームの特定のデータを選択した状態で編集ボタンをクリックしてみます。

データが入力された状態の単票フォームが起動しました。

サブフォームで選んだデータと、起動した単票フォームのデータが連動していることを確認しておきましょう。
確認が済んだらフォームを閉じます。

次に削除ボタンをクリックしてみます。

単票フォームは起動せず、削除処理に対する警告が表示されました。

「はい」をクリックするとデータが削除されます。

新規作成ボタンのクリック後に作動するコード

新規作成ボタンをクリックした時に作動するコードですが、以下のように標準モジュール「M_Cmd」内のプロシージャ「発注伝票新規作成」を実行させています。。

Private Sub 新規作成_Click()
    発注伝票新規作成
End Sub

プロシージャ「発注伝票新規作成」のコードは以下に書き出しておきます。

Sub 発注伝票新規作成()

    Dim CN As ADODB.Connection
    Dim RS As ADODB.Recordset
    Dim SQL As String

    Dim bsyo As String
    Dim yyyy As Integer
    Dim mm As Integer
    Dim ban As Integer
    
    DoCmd.OpenForm "F02発注伝票T", acNormal, , , acFormAdd
    Forms![F02発注伝票T]![発注伝票_ラベル].Caption = "発注伝票入力フォーム(新規作成)"
    Forms![F02発注伝票T]![発注者].Enabled = True
    
    '発注者と部署の自動入力
    Set CN = CurrentProject.Connection
        'レコードセットを取得
        Set RS = New ADODB.Recordset
        SQL = "SELECT * FROM T00発注者マスタ;"
        RS.open SQL, CN, adOpenKeyset, adLockOptimistic
        'データの反映
        RS.MoveFirst
        Forms![F02発注伝票T]![発注者].Value = RS!発注者
        Forms![F02発注伝票T]![部署].Value = RS!部署
    '終了
    RS.Close:  Set RS = Nothing
    CN.Close:  Set CN = Nothing

    Forms![F02発注伝票T]![発注日].Value = Date
    Forms![F02発注伝票T]![月名].Value = Month(Date)
    Forms![F02発注伝票T]![年].Value = Year(Date)
    
    '変数の指定
    bsyo = Forms![F02発注伝票T]![部署].Value
    mm = Forms![F02発注伝票T]![月名].Value
    yyyy = Forms![F02発注伝票T]![年].Value
    
    '発注番号月単位の自動入力
    Set CN = CurrentProject.Connection
        'レコードセットを取得
        Set RS = New ADODB.Recordset
        SQL = "SELECT Max (発注番号月単位) AS 番号Max FROM T02発注伝票" & _
        " GROUP BY 年, 月名, 部署 HAVING 年=" & yyyy & " AND 月名=" & mm & " AND 部署='" & bsyo & "';"
        RS.open SQL, CN, adOpenKeyset, adLockOptimistic
        'データの反映
        Forms![F02発注伝票T]![発注番号月単位].Value = RS!番号Max + 1
        '終了
    RS.Close:  Set RS = Nothing
    CN.Close:  Set CN = Nothing

    ban = Forms![F02発注伝票T]![発注番号月単位].Value
    Forms![F02発注伝票T]![管理No] = bsyo & "-" & mm & "-" & ban

End Sub

かなりコードは長いので、ステップインやイミディエイトウインドウなどデバッグ機能をうまく活用して読み解いてください。
参考までに要点をかんたんにまとめておきますが、以下の2つが特に大事なポイントです。

  • 新規作成モードでフォームを開く(12~14行目)
  • 管理番号を取得するための自動採番プログラム(39~50行目)

自動採番プログラムは実務ではよく求められる機能ですので、本記事のコードを参考にするとよいでしょう。
ここでは同じ区切り(月単位と部署単位)で最新番号を取得するため、ADOを活用しています。

スポンサードリンク

編集ボタンのクリック後に作動するコード

編集ボタンをクリックした後に作動するコードです。

Private Sub 編集_Click()

    DoCmd.OpenForm "F02発注伝票T", acNormal, , "発注登録No=" & Me.F02発注伝票DS!発注登録No.Value, acFormEdit
    Forms![F02発注伝票T]![発注伝票_ラベル].Caption = "発注伝票フォーム(編集)"

End Sub

OpenFormメソッドでは、SQLのWhere句のようにフィルタ条件を指定できます

また、編集モードであることが分かるよう、Captionの表示も変えています。

他にも非連結フォームで都度データを当てはめる方法などもありますが、OpenFormメソッドの機能をうまく使うのがシンプルで楽です。
複数人同時使用でトランザクション制御したい場合、非連結フォームを導入するのも有効ですが、手間をかけて非連結フォームを作り込む機会は限定されます。

削除ボタンのクリック後に作動するコード

削除ボタンをクリックした時に作動するコードです。

Private Sub 項目削除_Click()

Dim h As Integer
    h = MsgBox("この履歴を本当に削除しますか?", vbYesNo)
    If h = vbYes Then
        stSQL = "DELETE FROM T02発注伝票 WHERE 発注登録No = " & Me.F02発注伝票DS!発注登録No.Value & ";"
        DoCmd.SetWarnings False
        DoCmd.RunSQL stSQL
        DoCmd.SetWarnings True
        Me.F02発注伝票DS.Requery
    Else
    End If
    
End Sub

RunSQLメソッドでSQLのDELETE文を実行しています。
RunSQLはDELETE文だけでなく、INSERTやUPDATEなど、他のSQL文でもよく使う機能です。

RunSQLメソッドの前に「DoCmd.SetWarning False」とあるのは、警告表示を無効にするためです。
Accessでは、アクションクエリ(データを変更するSQL)を実行するときに必ず警告が表示されます。
複数のRunSQLメソッドを一気に実行する度、毎回警告が表示されると操作性が下がるので、ここで無効にしています。

処理がひととおり終われば、「DoCmd.SetWarning True」で標準の設定に戻してあげましょう。

また、サブフォームの情報を最新にするため、Requeryメソッドを実行します。
Requeryを実行し忘れると、フォームの再起動後しかデータ変更が反映されません。

まとめ

今回は、データ一覧フォームから単票フォームを起動させる方法を解説しました。

新規作成の場合、空白の単票フォームを開くだけです。

一方、既に入力されているデータを編集したい時は、OpenFormメソッドのパラメータ設定をうまく活用することも大事です。
OpenFormメソッドのパラメータを調べたいときは、Microsoft Leanサイトにしっかり解説していますので、日頃から見慣れておきましょう。

以上でデータ一覧フォームから単票フォームについての解説を終わりますが、本記事の内容を今使っているAccessデータベースに活用してみましょう。
きっとさらに操作性が上がっているはずです。

スポンサードリンク

スポンサードリンク

-VBA(Access)