Access2000VBA・Excel2000VBA独学~用語:Setと「New」キーワードのことについて。「New」って何?~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
※注意!!!超重要
結局この記事は間違いとわかりましたので、あまり参考にはしないでほしいのですが、ただ、「最初のうちはどのくらいバカでも大丈夫か?」の「ダメサンプル」になると思いましたので、一応残しておきます。
Newについては必ず、以下のWebページなどをご参考にしてください。
https://thom.hateblo.jp/entry/2015/12/14/040608ーーー
https://thom.hateblo.jp/entry/2016/09/27/221527ーーー
(ーーーは取り除いてください)
※関連記事:★重要!!!
~用語:「COMオートメーション(OLE?)」、そして「CreateObject」関数や「GetObject」関数と「参照設定」の違い、「事前バインディング・実行時バインディング」について~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
' ' 'New の確認 ' '「New」キーワードの意味がわからなかったのでヘルプなどと実際の動きを見てみました。 ' '「New」は、「コレクション名.Add」を使わずに、 '「新規」の何らかのオブジェクトのインスタンスを '(クラス=設計図から)作る場合に使う?のでしょうか?なんだかそんな感じに見えました。 ' '逆に言うと「New」されたときは、そのコードの中に、「Add や Add×××」は使われていない。 'つまり、「New」自体が、「Add」と同じような意味なのかも。 '(100%とは断言できないけど、そんな風。) 'どちらも「新規登録する」「新しく作る」という動詞? 'ヘルプにはインスタンスをつくる、と書いてある。 'インスタンス(実体)を作る、ってことは多分「新規」ってこと以外にないですよね? ' '「Add」と「New」を1行の中に同時に書いたら、「Add」「Add」とか、「New」「New」みたいな意味に 'なってしまうのかも? 当然きっとエラー。もともとインテリセンスにも出てこない。 ' '逆にいうと、「コレクション名.Add・・・」では作れないオブジェクトの '新規のインスタンスを作る場合に使う?のかな? ' '「コレクション名.Add」で新規のものが作れるオブジェクトを観察すると? ' →「ユーザーがデータ入力やデータ操作等をできる場所」や、 ' あるいは、「形と境界線」をもつ オブジェクト? ' '新規のものが、「コレクション名.Add」では作れないオブジェクトを観察すると? ' →それらをもたない、「空の」「ガワ(外郭)」としてなどのオブジェクト? ' (たとえば、ExcelやWordのアプリケーションウィンドウや、 ' ADOなどのConnectionオブジェクト(データベースへの接続オブジェクト)、など。) ' 基本、AddとかAdd××というメソッドを持つオブジェクトはコレクションが多かった。 ' (オブジェクトブラウザ調べ。) ' あるいは、「コレクション」を持たないオブジェクト? ' あるいは、「親」を持たない最上位のオブジェクト? ' もっと単純に、単に「Add」メソッドを「保持・保有」していないオブジェクト= ' =最初から「Add」メソッドを「用意されていない」オブジェクトは、 ' 「New」でしか「新規作成」ができない、というだけのことなのかも? ' '※ちなみに「ヘルプ」を読むと・・・、 '「Add」メソッドには、本当にたくさん、色んなオブジェクトに対する「Add」メソッドが '存在するのですが、どのオブジェクトの「Add」メソッドを読んでみても、 '「コレクションに単一オブジェクトを新規作成する」というニュアンスが見受けられます。 'どうやら、そんな感じっぽいです。 ' 'さらにちなみに、「QueryTableオブジェクト」のヘルプでも調べてみました。 '「QueryTableオブジェクト」はADOのレコードセットをもとにしても作れるみたいで、 'ただそのとき、ADOのレコードセットの作成には、Openメソッドを使って作れるようで、 'つまり、「Addが無い」からか、「New」が使われていました。 'それに対してそのレコードセットをもとにした「QueryTableオブジェクト」の新規作成は '「Add」が使われていました。もちろんその際は「New」は使われていません。 ' 'なので、やはり、 ' '『Add や Add××× といったメソッドが用意されていないオブジェクトは New が用意 ' されているので New で新規作成する。(New=インスタンス・実体の作成=新規作成するの意。) ' Add や Add××× が用意されているオブジェクトは New が用意されていないので、Addで新規作成する。 ' (Addはヘルプには「オブジェクトの追加」と書かれていることが多いですが、「オブジェクトの追加」 ' は「インスタンスの新規作成」と同義だと思うので、そういう理解でよさそう。) ' Newが使えるものは階層が最上階のもの(=それ以上の上位のオブジェクトを持たないもの)が多い。 ' Add や Add××× が使えるものは、上位の階層のオブジェクトを持ち(つまり自分は下位。)、かつ、 ' Add や Add××× = 「コレクション内への単一オブジェクト(インスタンス= 実体)の追加」 という ' 意味合いの場合が多い。 ' New は 大きなもの を どーん、と1、2個の追加、 ' Add は少し細かいものを 5個、10個、100個、と追加・・・、という雰囲気でとらえてもいいかも?』 ' 'というニュアンスの理解で、ひとまず、今のところは良さそうです。 '違ってるとわかったら、また変えます。 ' ' '「Set」との関係は次のような感じに見えます・・。 ' '通常のオブジェクト変数へのオブジェクトの代入は・・・ 'Set ×× = 既存のオブジェクトを返す関数やオブジェクト式(”既存”のオブジェクトを返すもの) ' なので、この場合は、既存のオブジェクトへの参照、というかたち。 ' ' 'Newを使った場合は・・・、 'Set ×× = 既存のオブジェクトではなく「今あるものとは別に、”新規に” オブジェクトを作りつつそれを返されたもの」。 ' (かつ、「コレクション名.Add」では作れないもの。 ' たとえば、ExcelやWordのアプリケーションウィンドウや、 ' ADOなどのConnectionオブジェクト(データベースへの接続オブジェクト)、など。) ' なのでこの場合は、既存ではなく新規に作ったオブジェクトへの参照、というかたち。 ' '######################################################################### '######################################################################### '「New」のことを調べてみたコード '######################################################################### '######################################################################### Sub test000() Dim xlapp As Excel.Application Dim bk01 As Workbook Dim wsh01 As Worksheet Dim shp01 As Shape '=================================== '「New」を使って新規作成する例 '=================================== '★★ (01) 新しいExcelの「ガワ(Applicationオブジェクト)」のインスタンス作成をしつつ、 '同時にその新しくできたものをオブジェクト変数に放り込む操作。 Set xlapp = New Excel.Application 'Applicationオブジェクトの上位には何もないっぽいので、だから「New」を使う? 'オブジェクトブラウザで調べると、Applicationオブジェクトは「Add」メソッドを '保持・内包していません。「AddCustomList」メソッドは持っていますけど・・・。 ' '「Applicationオブジェクトの上位には何もないっぽい」ことの証拠は、 'イミディエイトで『? TypeName(Application.Parent) 』とやっても '「Application」と返ってくるから。 '★★ (02) その「ガワ」を非表示から「表示」に切り替え xlapp.Visible = True '※ちなみに、ここで「New」を使わないと、「ガワ」は新設されずに、 ' 今現在・表示されている「ガワ」が「流用」されます。 ' Newは、明示的に、「今あるやつと別のやつをはっきりと作る・・・、 ' という意味もあるっぽいですね。 ' 「Excel.」は省略しても、「New」さえ書いておけば ' ちゃんと、明示的に新しい「ガワ」ができます。 '=================================== '以降は、Newを使わずに、「Add」で、新規作成をする例 '=================================== '★★ (03) ガワの中に、新しいブックを1個作りつつ、 'その新しくできたブックをオブジェクト変数に放り込む操作。 Set bk01 = xlapp.Workbooks.Add 'Workbookの上位に 'ApplicationオブジェクトがあるのでNewできない? '→→ それとも、もとからAddがあるので、Addを使い、それゆえNewが使えないだけ? ' ちなみに、xlappの前で「New」と打っても、インテリセンスには変数宣言時の内容しか ' 出てこないので、やっぱり、AddやAdd×××を持つものにはNewは用意されていないって ' ことなのかしら? '※新規ブックを作るだけで終わるなら、Setはいらず、「xlapp.Workbooks.Add」だけでもOK。 ' それで一応、のっぺらぼうのシート(ここでは=ブック)が表示されます。 ' ただ、階層的に、オブジェクトを下位へ下位へとどんどんと作っていきたいなら、 ' 毎回その都度「Set」して階層化していったほうがいい気がします。 ' もちろん、「必須!」というわけではないですけど、でも、階層構造を頭の中にイメージ ' しやすい気がするし、短くも書け、かつ、上位や下位のオブジェクトの機能をそのまま流用 ' できるので、結果として、便利になるし、中級へ上がるための練習にすごくなると思います。 ' (階層構造をしっかり意識できてないと、そもそもヘルプがちゃんと読めないですし・・・。 ' 階層構造全図をしっかり意識・イメージできていれば、ヘルプの理解度が2倍になります。) '★★ (04) Workbookの中に、新しいワークシートを1個作つつ、 'その新しくできたブックをオブジェクト変数に放り込む操作。 Set wsh01 = bk01.Worksheets.Add 'これも、Worksheetオブジェクトの上位に 'Applicationオブジェクトや 'WorkbookオブジェクトがあるのでNewできない? '→→ それとも、もとからAddがあるので、Addを使い、それゆえNewが使えないだけ? '★★ (05) Worksheetの中に、新しいシェイプを1個作つつ、 'その新しくできたブックをオブジェクト変数に放り込む操作。 Set shp01 = wsh01.Shapes.AddTextbox(msoTextOrientationHorizontal, 100, 100, 200, 50) 'これも、Shapeオブジェクトの上位に 'Applicationオブジェクトや 'Workbookオブジェクト、 'WorksheetオブジェクトがあるのでNewできない? '→→ それとも、もとからAdd×××× があるので、Addを使い、それゆえNewが使えないだけ? End Sub ' ' |