マンガでよめる痔のこと・薬のこと

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

になるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (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上級問題ですが、プロ級の内容です。この問題は、すでに、あるプロの方が触れているものなのですが、一応、これを書くにあたって、事前に確認しました。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2012/11/11 23:10

こんにちは。



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 ステートメントを使ってインスタンスを生成するほうが、変数を作成や消去のタイミングをより細かく制御できます。
    • good
    • 0
この回答へのお礼

VBAの問題集があれば解いて勉強してみたいです。

「ADO1はユーザーが自由にできるオブジェクトが存在しません。
ADO2は一旦インスタンスを生成し次にオブジェクトを作っているから
ユーザーが自由になるオブジェクトが存在します。」

ということですか。

ADO2のほうがよさそうですね。

各「cn」をウォッチウインドウに登録して動きを見てみましたが、
メモリがオブジェクトから消えるなどの動きがよくわかりませんでした。

Set cn = Nothing 
の部分の違いは、どうやって確認すればいいのでしょうか?
再度ご回答頂ければ幸いです。

お礼日時:2012/10/30 20:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング