• 締切済み

New演算子、Byval、ByLefについて

12月からACCESSの勉強をしているのですが、今だに表題のことについていまいちピンときません。New演算子はDB接続などに使いますが、Newする場合としない場合を見る時があってごちゃごちゃしてます。 Byvalに関してもNetで調べてばかりですがどうしても頭に入ってこないです。 少し頭の固い自分に丁寧に教えていただけないでしょうか?

みんなの回答

回答No.3

#2です。 >つまり、Set csDataSet = New DataSetで >=のみが代入の意味ではなく、オブジェクト変数を利用するということは、 >Set と = を使って csDataSetに代入するという理解でよろしいですか? 代入という言葉があっているかわかりませんが、これがインスタンス化です。 値を変数に代入するというイメージとは別です。 値を入れる場所を確保するというイメージの方がいいかと思われます。 >また、NewすることによってDataSetというオブジェクト変数をインスタンス化したものがcsDataSetとなり、 >ここでやっとcsDataSet.プロパティを使用できるということですよね?? はい、その通りです。 >あと調べている中で >クラスは、VBでのClass型のオブジェクトです。 >これにより、自分自身を変数としてクラスに保持することができます。 >つまり、オブジェクトの階層構造を簡単に処理することができます。 >と書かれていたのですがもう少し分かりやすく教えていただけると嬉しいのですが、いかがでしょうか!? これは自作のClassを作成した場合の話でしょう。 ・String型に拡張機能を持たせる為に、自作のClassを作る。 ・データを格納する為のClassを作った場合など。 ---------------------------------------------------------------- 通常、データを格納する際にメンバ変数などを使用します。 Dim strWk1 As String Dim strWk2 As String Dim strWk3 As String Dim intWk1 As Integer Dim intWk2 As Integer この場合、全てワーク変数として使用しますが、型が違う為まとめるとしても下記のようになります。 Dim strWk(2) As String Dim intWk(1) As Integer ※配列にする これでデータを持つ変数を最小限に出来ました。 しかし、実はStringの1~3とIntegerの1~2には決まったデータの値を格納するからわかりやすい変数名をつけたいとする場合に、まとめる事ができません。 Dim strWk1 As String ⇒ Dim strShimei As String Dim strWk2 As String ⇒ Dim strShimeiKana As String Dim strWk3 As String ⇒ Dim strJusho As String Dim intWk1 As Integer ⇒ Dim intNenrei As Integer Dim intWk2 As Integer ⇒ Dim intKaisu As Integer そこで、自作のClassを作成します。 Public Class Data_Wk Public strWk1 As String or Public strShimei As String Public strWk2 As String or Public strShimeiKana As String Public strWk3 As String or Public strJusho As String Public intWk1 As Integer or Public intNenrei As Integer Public intWk2 As Integer or Public intKaisu As Integer End Class そうすると、先程の宣言が・・・ Dim clsWk As Data_Wk となります。 後はSet clsWk = New Data_Wkとしてインスタンス化を行う事で、データ格納クラスができるというわけです。

回答No.2

横からすみません。 変数の宣言とNewの違いがわかってないみたいですね。 例えば・・・ Dim csDataSet As DataSet csDataSetという入れ物が出来ただけです。 この状態だとDataSetのプロパティは使用できません。 Set csDataSet = New DataSet Newを行う事でcsDataSetのインスタンス化を行います。 これで入れ物が実体となり、DataSetのプロパティを使用することが出来るわけです。 ※実際にデバッグして使用するとわかります。 ※実行した場合も「オブジェクトがインスタンスに設定されていません」というエラーが発生するかも。 既に実体として存在する物をSetする場合はNewする必要がありません。 但し、新たに変数を宣言して使用する場合はNewする必要があります。 ADO接続例 '変数の宣言 Dim cn As ADODB.Connection '変数のインスタンス化 Set cn = New ADODB.Connection 'ADO接続 cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Sample.mdb" '接続OPEN cn.Open 'メッセージ MsgBox ("接続成功") '接続CLOSE cn.Close 'オブジェクトの開放 Set cn = Nothing End '変数のインスタンス化の部分をコメントアウトして実行するとADOによるDB接続が出来ない。 '接続先はSample.mdbとなっているので、必要に応じて変更する必要がある。 ------------------------------------------------------- Set hoge = オブジェクト.○○ Set hoge = New オブジェクト.(○○が出ない) これはNewする時にプロパティやメソッドが宣言できませんという意味だと思いますよ。

kataparto
質問者

補足

横でも縦でも入ってきてください笑 どこかの参考書か、ネットやらに、オブジェクト変数を使用する場合、 Setを使って値を代入すると書かれていました。 つまり、Set csDataSet = New DataSetで =のみが代入の意味ではなく、オブジェクト変数を利用するということは、 Set と = を使って csDataSetに代入するという理解でよろしいですか? また、NewすることによってDataSetというオブジェクト変数をインスタンス化したものがcsDataSetとなり、 ここでやっとcsDataSet.プロパティを使用できるということですよね?? あと調べている中で クラスは、VBでのClass型のオブジェクトです。 これにより、自分自身を変数としてクラスに保持することができます。 つまり、オブジェクトの階層構造を簡単に処理することができます。 と書かれていたのですがもう少し分かりやすく教えていただけると嬉しいのですが、いかがでしょうか!?

noname#259269
noname#259269
回答No.1

ソースの具体例を挙げて、これとこれの違いが判らない、と言ってもらった方が的確な回答が得られると思いますが。。。 多少端折っていますが、以下簡単に書いてみます。 --- New については、オブジェクトを新たに作成する場合に必要です。 オブジェクトが既に利用可能になっている状態の時には、New する必要がありません(Access で言うと例えば CurrentDb が既に利用可能になっていると考えていて良い)。 また、New ではなく CreateObject ステートメントを使う場合がありますが、これは New しているのと同じことです。参照設定を追加していない場合には、 New の後ろのクラス名が指定できないので(そのクラス名がどこで定義されているのか VB からは判らない為)、CreateObject を使います。 --- ByVal と ByRef については、サブルーチンの引数に値を渡すケースで説明してみましょう。 ByVal を使うと、サブルーチン内でのみ有効な変数に、呼び出し元の変数の中身をコピーします。コピーするので、サブルーチンの中でその値を変更しても、呼び出し元に影響しません。 一方、ByRef を使うと、呼び出し元の変数自体を、サブルーチンの中で別の名前で利用できるようになります(語弊がありますが、判りやすくする為に今はこのように説明しておきます)。値の入れ物としての変数そのものは同じものを利用していますので、サブルーチンの中でその値を変更すると、呼び出し元の変数の値も変わります。 下記を実行してみてください。MsgBoxに「6」と表示されます。 Sub Test() Dim i As Integer i = 5 Call TestSub(i) MsgBox i End Sub Sub TestSub(ByRef v As Integer) '★ByRef v = v + 1 End Sub 下記を実行してみてください。MsgBoxに「5」と表示されます。 Sub Test() Dim i As Integer i = 5 Call TestSub(i) MsgBox i End Sub Sub TestSub(ByVal v As Integer) '★ByVal v = v + 1 End Sub

kataparto
質問者

補足

>オブジェクトが既に利用可能になっている状態の時には、New する必要がありません なるほど!!そういうことだったんですね!!オブジェクトを利用するにはNewを使ってインスタント化しなければ使えないとばかり思っていたので。。。 CurrentDbを調べてみると、メソッドとなっていますが、これはオブジェクトではないような気がするのですが。。。 >利用可能になっているものはNewを必要としていない。 これはどのようにすれば判断がつくのでしょうか?CurrentDbと調べても、特にそのような記載がないので Dim db As dao.database set db = currentDb このdbはインスタンスということですね? またサンプルソースは今手元にないのですが。。 どこかのソースで Set hoge = オブジェクト.○○ Set hoge = New オブジェクト.(○○が出ない) というソースを見た気がするのです。。 Newすることによってプロパティ、またはメソッドを参照することができないことってありますか? あと、○○はメソッドorプロパティを意味しているのですが、最初に書くのはオブジェクトという解釈でいいんですよね?要するにオブジェクトに対して、振る舞いや状態を設定する・・・ という感じなんですが。 ByVal と ByRef については・・・ >めちゃくちゃ分かりました!!ありがとうございます!!

関連するQ&A