アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

少し頭の固い自分に丁寧に教えていただけないでしょうか?

A 回答 (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としてインスタンス化を行う事で、データ格納クラスができるというわけです。
    • good
    • 0

横からすみません。



変数の宣言と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する時にプロパティやメソッドが宣言できませんという意味だと思いますよ。

この回答への補足

横でも縦でも入ってきてください笑
どこかの参考書か、ネットやらに、オブジェクト変数を使用する場合、
Setを使って値を代入すると書かれていました。

つまり、Set csDataSet = New DataSetで
=のみが代入の意味ではなく、オブジェクト変数を利用するということは、
Set と = を使って csDataSetに代入するという理解でよろしいですか?

また、NewすることによってDataSetというオブジェクト変数をインスタンス化したものがcsDataSetとなり、
ここでやっとcsDataSet.プロパティを使用できるということですよね??

あと調べている中で
クラスは、VBでのClass型のオブジェクトです。
これにより、自分自身を変数としてクラスに保持することができます。
つまり、オブジェクトの階層構造を簡単に処理することができます。

と書かれていたのですがもう少し分かりやすく教えていただけると嬉しいのですが、いかがでしょうか!?

補足日時:2009/03/06 00:59
    • good
    • 0

ソースの具体例を挙げて、これとこれの違いが判らない、と言ってもらった方が的確な回答が得られると思いますが。

。。

多少端折っていますが、以下簡単に書いてみます。

---

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

この回答への補足

>オブジェクトが既に利用可能になっている状態の時には、New する必要がありません

なるほど!!そういうことだったんですね!!オブジェクトを利用するにはNewを使ってインスタント化しなければ使えないとばかり思っていたので。。。
CurrentDbを調べてみると、メソッドとなっていますが、これはオブジェクトではないような気がするのですが。。。

>利用可能になっているものはNewを必要としていない。
これはどのようにすれば判断がつくのでしょうか?CurrentDbと調べても、特にそのような記載がないので

Dim db As dao.database
set db = currentDb

このdbはインスタンスということですね?

またサンプルソースは今手元にないのですが。。
どこかのソースで

Set hoge = オブジェクト.○○
Set hoge = New オブジェクト.(○○が出ない)

というソースを見た気がするのです。。
Newすることによってプロパティ、またはメソッドを参照することができないことってありますか?

あと、○○はメソッドorプロパティを意味しているのですが、最初に書くのはオブジェクトという解釈でいいんですよね?要するにオブジェクトに対して、振る舞いや状態を設定する・・・
という感じなんですが。

ByVal と ByRef については・・・
>めちゃくちゃ分かりました!!ありがとうございます!!

補足日時:2009/03/05 00:52
    • good
    • 0

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