こんにちは。ADOについてお教えください。
フォームをロード時に接続プロシージャと切断プロシージャを走らせたいと思います。
ConnectDatabaseを呼び出しは成功しますが、CloseDatabase呼び出しには失敗します。
スコープの問題で、rs、cnのオブジェクトが無い為だと思います。
ConnectDatabaseで作成されたcn、rsオブジェクトを別の関数で処理するにはどのようにコードをかけばよろしいでしょうか?宜しくお願い致します。
Private Sub Form_Load()
Call ConnectDatabase
Call CloseDatabase
End Sub
Module1
------------------
sub ConnectDatabase()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
処理~~~~
end sub
sub CloseDatabase()
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
end sub
No.1ベストアンサー
- 回答日時:
メソッドの外でprivate定義すればいいと思いますが。
予めDB操作として分離できるならばADO操作をクラス化してしまえばいいです。
【Form.frm】
Private Sub Form_Load()
Call ConnectDatabase
Call CloseDatabase
End Sub
Private cn As ADODB.Connection
Private rs As ADODB.Recordset
Private Sub ConnectDatabase()
' 接続処理
End Sub
Private Sub CloseDatabase()
' 切断処理
End Sub
これだと、Form.frmの外(例えばForm2.frm)に行くと、またオブジェクトを生成し直す必要があります。
もしくは
【Form.frm】
Private Sub Form_Load()
Dim db As DatabaseADODB
Set db = DB.Get()
Call db.ConnectDatabase()
Call db.CloseDatabase()
End Sub
【DatabaseADODB.cls】
Private cn As ADODB.Connection
Private rs As ADODB.Recordset
Public Sub ConnectDatabase()
' 接続処理
End Sub
Public Sub CloseDatabase()
' 切断処理
End Sub
【DB.bas】
Private mDb As DatabaseADODB = Nothing
Public Function Get() As DatabaseADODB
If mDb Is Nothing Then
Set mDb = New DatabaseADODB()
End If
Get = mDb
End Function
みたいにして、どこからでも唯一のDatabaseADODBオブジェクトを取得するようにすれば
どこからでもアクセス可能になります。
が、レコードセットもDatabaseADODBクラス内に含める前提で書くと、レコードセットの
リフレッシュ契機もシビアに考えてあげないとバグになります。
普通は、接続クラスとSQL発行クラス、レコードセットクラスが分かれるものなので。
(1接続に対して1レコードセットではない為)
今作ってるモノの規模により、臨機応変にメンテし易い最小限規模を選択してコード化
すればいいと思います。
勉強なら、最初は簡単な規模から、徐々に色んな場面に対応できる規模の大きいものへと
極めるのもいいでしょう。
わかりやすいコードありがとうございます。とても勉強になりました。仕事でAccessを使っていたのですが、考え方の幅が広がりました。本当にありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/07/07 08:37
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
異なるフォームに属する関数間でACCESSのレコードセットを受け渡しする。
Access(アクセス)
-
Access サブフォームでの選択行の取得
その他(データベース)
-
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
-
4
配列の参照渡しで型が一致しません。
Visual Basic(VBA)
-
5
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
6
SQLの速度をあげるには・・・
Visual Basic(VBA)
-
7
ACCESS──メインフォームでサブフォームのレコード件数をカウントしたい
Access(アクセス)
-
8
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
-
9
ASP レコードセットしたオブジェクトを戻り値に出来ませんか?
Microsoft ASP
-
10
エラー(型が一致しません。)の対処方法
Visual Basic(VBA)
-
11
クラスモジュールを使ったレコードセットの取得
Visual Basic(VBA)
-
12
ado フィルタで 含まない とするには?
Excel(エクセル)
-
13
レコードセット(ADO.Recordset)で処理レコードは何番目?
Visual Basic(VBA)
-
14
もしフォームヘッダーにコントロールがあるのなら
Access(アクセス)
-
15
レコードが存在しなかった場合
Microsoft ASP
-
16
参照設定は2.8と6.0 6.1とどちらにチェッ
その他(Microsoft Office)
-
17
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
18
[ASP+SQL]絞込み済みのレコードセットを一気に計算、SUM?
Microsoft ASP
-
19
VBとアクセスでSQL文に変数を使いたいのですが
Visual Basic(VBA)
-
20
ACCESSのBookmarkプロパティの使い方
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
ASP.net 教えてください!!(...
-
Object型からDouble型へのキャスト
-
C#でフォームのオブジェクト名...
-
vb.net オブジェクト指向につい...
-
VBAでvlookup関数から、別シー...
-
VBA 同じ名前のオブジェクトを...
-
プリコンパイルされたSQL文を取...
-
時間帯判定をする。
-
オブジェクトとコントロールっ...
-
VBScriptで計算して出た値をク...
-
複数プロジェクト間での値渡し
-
空の文字列とnullと""
-
多人数のじゃんけんプログラム
-
Listに格納されているオブジェ...
-
access2002のリレーションシッ...
-
オブジェクト名をforループ内で...
-
COMコンポーネントって何?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
LISTBOXの内容が更新されま...
-
Object型からDouble型へのキャスト
-
JAVAからHTMLへ値を返す方法
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
VBA 同じ名前のオブジェクトを...
-
ASP.net 教えてください!!(...
-
Vbで通常使用するプリンターを...
-
newは明示的にした方が良いのか?
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
-
bmp画像をjpegやpng画像に圧縮...
-
Accessの連結・非連結オブジェ...
おすすめ情報