gooドクター有料プランが1ヶ月間無料!

NEWキーワードとCreateObjectは同じことをするのでしょうか?

Sub ADO_Sample1()
Dim cn As New ADODB.Connection
Set cn = CreateObject("ADODB.Connection")

cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" & _
"D:\Mail.mdb;Jet OLEDB:Database;"

Debug.Print "ファイルに接続できました。"

cn.Close: Set cn = Nothing
End Sub

このようなコードの時、
Set cn = CreateObject("ADODB.Connection")
は、あってもなくても問題ないようです。

NEWとCreateObjectがある場合は、
2度データベースに接続してしまうのでしょうか?

NEWとCreateObjectがあってもエラーにならない理由を教えてください。

gooドクター

A 回答 (3件)

>Dim cn As New ADODB.Connection


>じゃダメなのでしょうか?
>変数の宣言とインスタンスの生成(?)を同時に行わな方がいいですか?

言語によって、インスタンス生成のタイミングが違う事を、
判って使う分には「ダメ」な事は無いと思います。

「ダメ」ならそんな書き方出来ないように設計するだろう、
と思うからです。

因みに、VB VBA では宣言と New を一行で書いてしまっても
「変数の宣言とインスタンスの生成」が同時にされる事はありません。
最初にインスタンスのメソッドなりプロパティなりを使用する
タイミングでインスタンスが生成され、インスタンス生成時の
最初に実行されるメソッドである Initialize が実行されます。

この最初に実行されるメソッドの事を「コンストラクタ」と、
オブジェクト指向では呼びます。

対して、VB.NET では、Dim cn As New ADODB.Connection
が書かれている位置で、インスタンスが生成され 、
コンストラクタが実行されます。

コンストラクタで何か処理をさせている場合、実行されるタイミングの
違いを見誤ると、意図通りの動作にならないかも知れません。また、
使いもしない段階でインスタンスを生成するのは、メモリの無駄使いでも
あります。
    • good
    • 2
この回答へのお礼

Dim cn As New ADODB.Connection
が間違いなのであれば、
使えないように設計されているはずですね。

Dim cn As New ADODB.Connection
をしてるからって、
「変数の宣言とインスタンスの生成」が同時にしてるわけではないようですね。

「コンストラクタ」と言う用語は初めて聞きました。
そのような言葉があるのですね。有難うございます。

お礼日時:2013/05/28 20:40

> Set cn = CreateObject("ADODB.Connection")


> は、あってもなくても問題ないようです。

本来は、
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
こうすべきなので。

> 2度データベースに接続してしまうのでしょうか?

VBAが裏で前回の参照を解放してからまた、新たにセットし直してるのでそれはないです。
    • good
    • 0
この回答へのお礼

本来ならば
Set cn = CreateObject("ADODB.Connection")
ではなく、
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
するべきなのですね。

ちなみに
Dim cn As New ADODB.Connection
じゃダメなのでしょうか?
変数の宣言とインスタンスの生成(?)を同時に行わな方がいいですか?

お礼日時:2013/05/25 08:40

> NEWとCreateObjectがある場合は、


> 2度データベースに接続してしまうのでしょうか?
質問内容に記載されているコードならば cn.Open は一回しか実行しないので、接続も一回のみです

> NEWとCreateObjectがあってもエラーにならない理由を教えてください。
同じ変数に入れているため、上書きされているだけ

Set cn = CreateObject("ADODB.Connection")
こちらが有効になる(結果的に同じことをしているだけなので動作は変わらない)


なぜ New と CreateObject の2つがあるのかは
VBSとVBAの違いですね。

VBSだと参照設定が使えないため CreateObjectを使います。
VBA(たとえばExcel)だと、DLLの参照設定が出来るため Newキーワードでオブジェクトが作成できます。
    • good
    • 0
この回答へのお礼

>同じ変数に入れているため、上書きされているだけ

とてもわかりやすい例えです。イメージしやすいです。

CreateObject関数でもできる理由は、VBSの為なのですね。
たしかにVBSでは参照設定の仕方がわかりませんでした。

ありがとうございました。大変参考になりました。

お礼日時:2013/05/25 08:39

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

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング