Microsoft Access 掲示板

ACCESSの標準モジュール、クラスモジュールについて

4 コメント
views
4 フォロー
Private Sub コマンド30_Click()

 Dim myDB As DAO.Database
 Dim myRS As DAO.Recordset
 
    Set myDB = CurrentDb
    Set myRS = myDB.OpenRecordset("MT_test", dbOpenTable)
    
    
    
        With myRS
            .AddNew
            !社員ID = txt社員ID.Value
            !氏名 = txt氏名.Value
            !生年月日 = txt生年月日.Value
            !勤続年数 = txt勤続年数.Value
            .Update

        End With
        
        MsgBox "登録しました。"
    
    myRS.Close: Set myRS = Nothing
    myDB.Close: Set myDB = Nothing
       
End Sub

このようなコードで、入力フォームを作成しました。
同様のフォームが、残り7個あります。

全てのフームで

 Dim myDB As DAO.Database
 Dim myRS As DAO.Recordset
 
    Set myDB = CurrentDb
    Set myRS = myDB.OpenRecordset("MT_test", dbOpenTable)


   処理

   MsgBox "登録しました。"
    
    myRS.Close: Set myRS = Nothing
    myDB.Close: Set myDB = Nothing
       
End Sub

以前、購入した書籍に、ADOなのですが、下記のコードがありました。
接続プロシージャと、切断プロシージャを下記のように記載して、
Callで呼び出すというものです。

Private adoCn As Object
Private adoRs As Object
Private strSQL As String
Sub DBconnect(flg As Boolean) 'DB接続プロシージャ
  Dim DBpath As String
  
  DBpath = ThisWorkbook.Path 'DBが同じ階層にある場合
  
  Set adoCn = CreateObject("ADODB.Connection")
  If flg = True Then Set adoRs = CreateObject("ADODB.Recordset")
  adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
             "Data Source=" & DBpath & "\UQ成約処理.accdb;" 'Accessファイルを開く
End Sub
Sub DBcut_off(flg As Boolean) 'DB切断プロシージャ
  If flg = True Then adoRs.Close 'レコードセットのクローズ
  adoCn.Close 'コネクションのクローズ
  Set adoRs = Nothing 'オブジェクトの破棄
  Set adoCn = Nothing
End Sub

DAOきっとこのような書き方もできるのではないかと思いました。
NETで検索していると、クラスモジュールに、記載している例をみつけました。

https://t-yumi.jp/gengo/access/20170430020608876.html

ACCESS、クラスモジュールで検索していると、恐らくhatena様が記載したYahoo知恵袋の回答を見ました。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1267696062
ここに記載しているブログはすべて拝見しました。

そして、下記の部分を、標準モジュール、またはクラスモジュールで書き直したいと思いました。

 Dim myDB As DAO.Database
 Dim myRS As DAO.Recordset
 
    Set myDB = CurrentDb
    Set myRS = myDB.OpenRecordset("MT_test", dbOpenTable)
 myRS.Close: Set myRS = Nothing
 myDB.Close: Set myDB = Nothing

この部分だけでも変更しよと思い下記のコードを記載しました。

Sub DBcut_off(flg As Boolean) 'DB切断プロシージャ
  If flg = True Then myRS.Close 'レコードセットのクローズ
  adoCn.Close 'コネクションのクローズ
  Set myRS = Nothing 'オブジェクトの破棄
  Set  myDB = Nothing
End Sub

コンパイルエラー、引数は省略できません

NETで調べてもDAOは、HITしないようです。

お手数ですが、どのように記載するのか、ご教示をお願いします。

hideki
作成: 2021/08/17 (火) 10:03:43
通報 ...
1

このようなコードで、入力フォームを作成しました。
同様のフォームが、残り7個あります。

この入力フォームが連結フォームで連結したテーブルを更新するのが目的なら、そもそもADOもDAOも必要ありません。
というかVBAコード自体必要ありません。

VBAでテーブル更新しているということは、非連結フォームで設計しているのでしょうか。
だとしたら、非連結にしている目的はなんでしょう。

検索しても見つからないのは、Accessにおいてそのようなことする必然性がほぼないからです。

2
hideki 2021/08/17 (火) 10:42:47 49c85@96514

回答ありがとうございます。
非連結で入力フォームを作成したのは、作動が重くならないとNETで見つけたからです。
連結でも、非連結でも、作動は、関係ないのでしょうか?
環境としては、ネットワークドライブで、ACCESSを8人で共有して利用しています。

3

経験上、8人ぐらいなら、連結でもそんなに重くならないと思います。

新規データの入力フォームなら、「データ入力用」プロパティを「はい」にしておけば全レコードを読みに行くこともないので。

非連結で入力フォームを作成したのは、作動が重くならないとNETで見つけたからです。

たまに、そのような話も見かけますが、実際、非連結でのコードはそんなに簡単ではないし、そんなにメリットはないと思います。

共有時の非連結フォームに関する私の見解は下記の質問にも回答してますので、参考にしてください。

デフォルトの楽観的排他制御 Microsoft Access 掲示板 - zawazawa

4
hideki 2021/08/17 (火) 11:36:23 49c85@96514

回答ありがとうございました。
hatena様の見解を参考にさせていただきます。