Private Sub ADO1()
Dim cn As New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName
cn.Close: Set cn = Nothing
End Sub
Private Sub ADO2()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName
cn.Close: Set cn = Nothing
End Sub
は、
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
を簡素化したものが
Dim cn As New ADODB.Connection
になるのでしょうか?
No.1
- 回答日時:
こんにちは。
VBAの問題集があれば、出てきそうな典型的な質問です。
>Dim cn As ADODB.Connection
>Set cn = New ADODB.Connection
>を簡素化したものが
>Dim cn As New ADODB.Connection
>になるのでしょうか?
いいえ、そうではありません。同じことをしているわけではありません。
>Dim cn As New ADODB.Connection
これは、直接、インスタンスを作っていることで、Applicationに直に結びついています。言い換えれば、ユーザーが自由にできるオブジェクトが存在しません。
Private Sub ADO1()
Dim cn As New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName
cn.Close
Set cn = Nothing '←ここが生きていません。
End Sub
こちらは、一旦、インスタンスを生成し、次に、オブジェクトを作っていますから、
>Dim cn As ADODB.Connection
>Set cn = New ADODB.Connection
では、ユーザーが自由になるオブジェクトが存在します。
Private Sub ADO2()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName
cn.Close
Set cn = Nothing '←メモリからオブジェクトは消えています。
End Sub
したがって、オブジェクト変数を Dim 宣言した後に SET ステートメントを使ってインスタンスを生成するほうが、変数を作成や消去のタイミングをより細かく制御できます。
VBAの問題集があれば解いて勉強してみたいです。
「ADO1はユーザーが自由にできるオブジェクトが存在しません。
ADO2は一旦インスタンスを生成し次にオブジェクトを作っているから
ユーザーが自由になるオブジェクトが存在します。」
ということですか。
ADO2のほうがよさそうですね。
各「cn」をウォッチウインドウに登録して動きを見てみましたが、
メモリがオブジェクトから消えるなどの動きがよくわかりませんでした。
Set cn = Nothing
の部分の違いは、どうやって確認すればいいのでしょうか?
再度ご回答頂ければ幸いです。
No.2ベストアンサー
- 回答日時:
こんにちは。
#1の回答者です。>各「cn」をウォッチウインドウ[→ローカルウィンドウ]に登録して動きを見てみましたが、
>Set cn = Nothing
>の部分の違いは、どうやって確認すればいいのでしょうか?
すみません、中途半端な説明でした。
こういう風に考えてみたらどうでしょうか。
Private Sub ADO1()
Dim cn As New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName
cn.Close
Set cn = Nothing '←ここが生きていません。
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName '●
cn.Close
End Sub
●の部分で、オブジェクトを生成していないのに、再び、オブジェクトが生成されます。当たり前のような気がしますが、これでは、ユーザーの手でコントロールとしているとは言えませんね。
>VBAの問題集があれば解いて勉強してみたいです。
この種の問題は、VBA上級問題ですが、プロ級の内容です。この問題は、すでに、あるプロの方が触れているものなのですが、一応、これを書くにあたって、事前に確認しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- 数学 どういう意味ですか? 1 2022/12/07 22:39
- 数学 cos^2(x+π/4)=Σ(n=-∞から∞)Cn・e^(inx)が全てのxに対して成り立つように定 2 2023/02/09 17:56
- Visual Basic(VBA) バックグラウンドのプロセスのエクセルを閉じる方法 4 2022/05/12 15:39
- Amazon amazonを語る迷惑メールについて 1 2023/03/06 22:53
- 数学 cos^2(x+π/4)=Σ(n=-∞から∞)Cn・e^(inx)が全てのxに対して成り立つように定 1 2023/02/06 18:17
- 数学 上三角行列のn乗の証明 2 2023/07/23 21:45
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- 数学 初項3、公差6の等差数列{an}と、初項1、公差4の等差数列{bn}がある。この2つの数列に共通に含 2 2022/03/24 18:57
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
多人数のじゃんけんプログラム
-
C#でフォームのオブジェクト名...
-
Excelで =EMBED("Acrobat Docu...
-
COMコンポーネントって何?
-
Vbで通常使用するプリンターを...
-
bmp画像をjpegやpng画像に圧縮...
-
文字列でクラス型名を取得したい
-
Accessの連結・非連結オブジェ...
-
VBAのWindowオブジェクトとWork...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ArrayLsitのデータ取得
-
Listに格納されているオブジェ...
-
Listに格納されたオブジェクト...
-
JAVAからHTMLへ値を返す方法
-
Visual Studioでのbmpファイル...
-
.getElementById()のエラーにつ...
-
javaでは基本型の参照渡しは無...
-
LISTBOXの内容が更新されま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報