★★★★★★Access2000VBA・Excel2000VBA独学~★★★★★★ 超重要!!! 挫折するオブジェクト式やプログラム(プロシージャ)の書き方、挫折しない書き方、の違い。~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
ここでご紹介するプログラムたち(プロシージャたち)は、
任意の「呼び出しモト」となるExcelファイルから、
「1.csv」というCSVファイルを開いて、
開いた「1」シートの「A1セル」の値をイミディエイトウィンドウに表示する処理が書いてあります。
5つです。
(とりあえず、の、5つ、です。ほかに もう少し色んな書き方があります。以下の記事もご参考にしてください。『★★★ Access2000VBA・Excel2000VBA独学~「シート指定(=選択)の基本」~「Excelが発売されて20年も経ってるのに」、「ExcelVBAを教える教室やサイトが当時の100倍以上も激増しているのに」、なぜ未だに初心者が自力でエラー解決ができないのか? 』)
5つとも、ぞれぞれ、少しずつ、動きや書き方が異なります。
で、この5つの中で、「OpenTest01」が、(冗長で「ムダ」もありますものの・でも)、「一番省略の無い書き方」で「一番基本となる」書き方です。
もちろん、意味が分かっていれば、一番「挫折しません」。
エラーも一番少ないです。(Excel自体にバグがあるとエラーになることもあるかもしれませんので「絶対」ではないですが。)
「OpenTest02」以降は、この「OpenTest01」から、色々なかたちに「省略」をしていきます。
(ただ、「OpenTest02」の書き方ができることも、基本となる重要な書き方で、これの意味が分からないと本当にVBAは上達がありえなくなってしまいますので、これの意味、特に、「OpenTest01」と「OpenTest02」の違いは「死んでも」理解できるようになってください。
現実的な書き方としては「OpenTest01」よりも「OpenTest02」のほうが良く使われます。)
そして一番挫折しない書き方は、「OpenTest02」「OpenTest01」です。
「OpenTest03」もまあまあ挫折しにくいです。
一方、「OpenTest04」と「OpenTest05」は「挫折しやすい書き方」です。
特に「OpenTest05」は最悪です。(「どうしても」の「やむを得ない」場合以外は。)
なお、最初に「省略する書き方」を習ってしまい、そればかり使っていると、大変残念ながら、VBAは100%、「上達できません」。
当然、「挫折」が待っています。
例えば「OpenTest04」や「OpenTest05」のような書き方です。
特に、「OpenTest04」はエラーは出ないものの、CSVファイルのA1セルの値が取得できません。
(当方のPCでは、2010でも、Office 365の Excel2019 でもダメでした。2010と共存させてるからかしらん?基本、特にVBAでは、複数バージョンの共存は不具合が起きやすいのでおススメしません。一般操作は不具合は少ないかもしれませんが。)
結論としましては、
ここに書いてある5つのコードの何がどう違うか?が分かることは非常に重要です。
逆に言いますと、
「明確にその違いや使いどころを述べることができなければ」、
大変残念ながら、VBAは100%、「上達できません」。
ですので、どうか、これらのプロシージャたちの「違い」がわかるように、学習を進めていってください。
CSVファイルを開くと、ファイル名がそのままシート名となるようですので、以降のサンプルプログラムを試すときは必ず「1.csv」というファイル名で試してください。
もし「より汎用的にしたい」というときはその点を考慮してください。
なお、「1.csv」の中身は、カンマ区切りで1行目が列名になっていればなんでもOKです。
以降のプログラムどおりにするなら、「d:\1」フォルダに「1.csv」を置いてください。
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 |
' ' Option Explicit '################################################################################################ '「1.csv」というCSVファイルを開いて、 '開いた「1」シートのA1セルの値を表示する処理。5つ。 '5つとも、ぞれぞれ、少しずつ、動きや書き方が異なります。 ' '「OpenTest01」が、(冗長でムダはありますものの)、 '「一番省略の無い書き方」で「一番基本となる」書き方です。 ' '「OpenTest02」以降は、この「OpenTest01」から、色々なかたちに「省略」をしていきます。 ' 'なお、最初に「省略する書き方」を習ってしまい、そればかり使っていると、 '大変残念ながら、VBAは100%、「上達できません」。 '例えば「OpenTest04」や「OpenTest05」のような書き方です。 ' '特に、ここに書いてある5つのコードの何がどう違うか?が '「明確にその違いを述べることができなければ」、 '大変残念ながら、VBAは100%、「上達できません」。 ' 'ですので、どうか、これらのプロシージャたちの「違い」がわかるように、 '学習を進めていってください。 ' 'CSVファイルを開くと、ファイル名がそのままシート名となるようですので、 '以降のサンプルプログラムを試すときは必ず「1.csv」というファイル名で試してください。 'もし「より汎用的にしたい」というときはその点を考慮してください。 ' '################################################################################################ Sub OpenTest01() Dim o_CSVjj As Workbook Dim o_WS01jj As Worksheet Set o_CSVjj = Excel. _ Application. _ Workbooks.Open("d:\1\1.csv") Set o_WS01jj = Excel. _ Application. _ Workbooks.Item("1.csv"). _ Worksheets.Item("1") Debug.Print o_CSVjj.Name Debug.Print o_WS01jj.Range("A1").Value End Sub '############################################## Sub OpenTest02() Dim o_CSVjj As Workbook Dim o_WS01jj As Worksheet Set o_CSVjj = Excel. _ Application. _ Workbooks.Open("d:\1\1.csv") ' Set o_WS01jj = Excel. _ ' Application. _ ' Workbooks.Item("1.csv"). _ ' Worksheets.Item("1") Set o_WS01jj = o_CSVjj. _ Worksheets.Item("1") Debug.Print o_CSVjj.Name Debug.Print o_WS01jj.Range("A1").Value End Sub '############################################## Sub OpenTest03() ' Dim o_CSVjj As Workbook Dim o_WS01jj As Worksheet Excel. _ Application. _ Workbooks.Open "d:\1\1.csv" Set o_WS01jj = Excel. _ Application. _ Workbooks.Item("1.csv"). _ Worksheets.Item("1") ' Debug.Print o_CSVjj.Name Debug.Print o_WS01jj.Range("A1").Value End Sub '############################################## Sub OpenTest04() ' Dim o_CSVjj As Workbook Dim o_WS01jj As Worksheet Excel. _ Application. _ Workbooks.Open "d:\1\1.csv" Set o_WS01jj = ActiveSheet ' Set o_WS01jj = ActiveWorkbook.ActiveSheet ' Debug.Print o_CSVjj.Name Debug.Print o_WS01jj.Range("A1").Value End Sub '############################################## Sub OpenTest05() ' Dim o_CSVjj As Workbook ' Dim o_WS01jj As Worksheet Excel. _ Application. _ Workbooks.Open "d:\1\1.csv" ' Debug.Print o_CSVjj.Name Debug.Print Range("A1").Value End Sub ' ' |
以降は、上記のコードの違いをコメントをつけて説明させていただいたものです。
上手く説明できていないかもしれませんが、ヒントにしてみてください。
(プログラミングの場合、「必ず」「例外」があります。なのでコメントも、
「絶対」ということではなく、「ほぼ、あてはまる」という意味での「ヒント」
としてください。)
CSVファイルを開くと、ファイル名がそのままシート名となるようですので、以降のサンプルプログラムを試すときは必ず「1.csv」というファイル名で試してください。
もし「より汎用的にしたい」というときはその点を考慮してください。
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 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 |
' ' Option Explicit '################################################################################################ '「1.csv」というCSVファイルを開いて、 '開いた「1」シートのA1セルの値を表示する処理。 '(CSVファイルは、Excelで開くと、基本、ブックとみなされて扱われます。※CSV=カンマ区切りのファイル。) ' 'このサンプルでは、1.csvファイルは単に開くだけではなくて、Openメソッドで開きつつ、 '同時に「オブジェクト」としても扱います。 'そしてそれはOpenメソッドがやってくれます。Openメソッドは、指定したファイル(=ブック) 'を開きつつ、その開いたブックをオブジェクトとして、ユーザー側に投げ返してくれます。 ' 'ただ、実験のため、返ってきたブックオブジェクトの流用は「しません」。 '(=ここでのブックオブジェクト=1.csvファイルをオブジェクト変数「o_CSVjj」に代入したモノ ' 'シートは「オブジェクト」として扱います。 ' '################################################################################################ Sub OpenTest01() Dim o_CSVjj As Workbook Dim o_WS01jj As Worksheet Set o_CSVjj = Excel. _ Application. _ Workbooks.Open("d:\1\1.csv") '↑ '1.csvファイルを開きつつ、同時に、 '「o_CSVjj」というオブジェクト変数の中に、1.csvファイルを、 '「オブジェクトとして代入」します。 Set o_WS01jj = Excel. _ Application. _ Workbooks.Item("1.csv"). _ Worksheets.Item("1") '↑ '「o_WS01jj」というオブジェクト変数の中に、「1」シートを、 '「オブジェクトとして代入」します。 '実験のため、「o_CSVjj」はあえて、流用していません。 Debug.Print o_CSVjj.Name Debug.Print o_WS01jj.Range("A1").Value End Sub '################################################################################################ 'OpenTest01と同様、1.csvファイルを開いて、 '開いた「1」シートのA1セルの値を表示する処理。 '(CSVファイルは、Excelで開くと、基本、ブックとみなされて扱われます。) ' 'こちらのサンプルも、1.csvファイルは単に開くだけではなくて、Openメソッドで開きつつ、 '同時に「オブジェクト」としても扱います。 'それは前項のOpenTest01()と同様、Openメソッドがやってくれます。 ' 'ただし、こちらでは、ブックオブジェクトの流用を「します」。 '(前項のOpenTest01()ではしませんでしたが。) '(=ここでのブックオブジェクト=1.csvファイルをオブジェクト変数「o_CSVjj」に代入したモノ ' 'シートはOpenTest01と同様「オブジェクト」として扱います。 ' '################################################################################################ Sub OpenTest02() Dim o_CSVjj As Workbook Dim o_WS01jj As Worksheet Set o_CSVjj = Excel. _ Application. _ Workbooks.Open("d:\1\1.csv") '↑ '1.csvファイルを開きつつ、同時に、 '「o_CSVjj」の中に、1.csvファイルを、 '「オブジェクトとして代入」します。。 ' Set o_WS01jj = Excel. _ ' Application. _ ' Workbooks.Item("1.csv"). _ ' Worksheets.Item("1") ' ↑ '「OpenTest01」プロ―シージャで使ったコード内容。 '次のコード記述方法とどこが異なるか比較してみてください。 '次のコードの方が(ブックオブジェクトの流用がしてあるため) '少し簡潔になっています。 Set o_WS01jj = o_CSVjj. _ Worksheets.Item("1") ' ↑ '上記のコードは、「o_CSVjj」の中に、1.csvファイルを、 '「オブジェクトとして代入」してないと '動かないコードです。 ' '「o_WS01jj」というオブジェクト変数の中に、「1」シートを、 '「オブジェクトとして代入」します。 '実験として、「o_CSVjj(ブックオブジェクト)」を流用しています。 Debug.Print o_CSVjj.Name Debug.Print o_WS01jj.Range("A1").Value End Sub '################################################################################################ 'OpenTest01や02と同様、1.csvファイルを開いて、 '開いた「1」シートのA1セルの値を表示する処理。 ' 'ただし、こちらのサンプルでは、1.csvファイルは開くだけで、 '「オブジェクト」としては扱いません。 '当然、ブックオブジェクトの流用もしません。(というか、「できません」。) '(Openメソッドを使ってはいますがオブジェクト変数に受けてはいませんので。) ' 'だだ、シートは「オブジェクト」として扱います。 '################################################################################################ Sub OpenTest03() ' Dim o_CSVjj As Workbook Dim o_WS01jj As Worksheet Excel. _ Application. _ Workbooks.Open "d:\1\1.csv" '↑ '1.csvファイルを開きます。 '開くだけで、オブジェクト変数への代入はしません。 'なので、「Dim o_CSVjj As Workbook」という命令は不要のため 'コメントアウトしてあります。 '同じ理由で、のちのちの、「Debug.Print o_CSVjj.Name」という命令も 'エラーになるため、コメントアウトしてあります。 ' 'なお、基本、「メソッド」「各種関数」「自作関数(またはプロシージャ)」のうち、 '「何らかの動作をしつつ」、「同時に値かオブジェクトを返す」、 'というモノ、(例えば、××.Addメソッドや××.Openメソッド、 ' Msgbox関数、などなど・・・)については、 '「返り値=戻り値」を「あえて使わない」場合・・・ 'つまり、「何らかの動作」「だけ」をさせる場合は、 '「引数の指定時」に、カッコが必要ありません。 '名前付き引数を使う時もカッコが必要ありません。 ' '※ちなみにですが、「プロパティ」も、「メソッド」も、「各種VBA関数」も、 ' 「自作関数」も、全部、「同じような仕組み」で動いていますが、 ' 基本、「プロパティ」と「各種VBA関数(WorksheetFunctionプロパティを ' 使うものも含む)」の場合は、戻り値を使うことが多いので、よくカッコが要ります。 ' 特に「各種VBA関数(WorksheetFunctionプロパティを使うものも含む)」の場合 ' は、ほぼ100%近く、要ると思います。 ' 「プロパティ」の場合は、値の設定をするときは、カッコは使いませんが、 ' 値の取得の場合は、基本、カッコが要ります。 ' なお、戻り値を使う場合は、「名前付き引数を使う時」もカッコが必要です。 ' 例外があるかどうかはチェックしていませんが、基本、要ると思っておいて良いと思います。 ' ただ、「例外があるかもしれない」ということも、常に意識しておくことも ' 大変重要です。例外があると気が付かなくてエラーが何日も解決できないことも ' ありますので。 ' ' 「メソッド」と「自作関数」の場合も、「戻り値」を使う場合は引数の指定に ' カッコが要りますが、「戻り値」を使わない場合はカッコが要りません。 ' 「自作関数」の場合は作った人次第なのでわかりませんが、 ' 「メソッド」の場合はカッコを使わない場合のほうが多いか、半々くらいかも? ' 「メソッド」の場合はオブジェクトを返すメソッドもそこそこありますし、 ' 動作の「成功・失敗」のような何かが返ってきて、それを取得することも ' ありますので・・・。(IF文での条件に使うとか・・・。) ' こちらもチェックしていません。ご自分でも調べてみてください。 ' 'ここでは「Workbooks.Open」メソッドによって、 '「ファイルを開く」という「動き」だけをさせていて、 'その時に返ってくる「Workbookオブジェクト」をあえて取得していません。 '本来ならWorkbooks.Openメソッドによって、ファイルを開くと同時に、 '「1.csv」が「Workbookオブジェクト」として返ってくるので、それを取得し、 '例えば「o_CSVjj」というオブジェクト変数に代入することが可能なのですが、 'そこをあえて、 '「o_CSVjj」というオブジェクト変数には代入していません。 'なので、カッコは要りません。 Set o_WS01jj = Excel. _ Application. _ Workbooks.Item("1.csv"). _ Worksheets.Item("1") '↑ '「o_WS01jj」というオブジェクト変数の中に、「1」シートを、 '「オブジェクトとして代入」します。 '実験のため、「o_CSVjj」はあえて、流用していません。 'といいますか、「o_CSVjj」の変数宣言自体をコメントアウトで使ってないので、 '当然「Set = ・・・」もしていませんので、 '「そもそも流用自体」が「できません」。 ' Debug.Print o_CSVjj.Name '←1.csvファイルをオブジェクトとして扱っていないため(オブジェクト変数に代入していないため)、実行するとエラーになります。 Debug.Print o_WS01jj.Range("A1").Value End Sub '################################################################################################ '上記のプロシージャを「ActiveSheet」を用いて、さらに簡素化したものです。 '(こちらのサンプルも、1.csvファイルは開くだけで「オブジェクト」としては扱いません。) 'ただし、「ActiveSheet」を用いていますので、エラーや不具合がとても出やすいです。 '非常に注意が必要な書き方です。 '実際、このコードは、「Debug.Print o_WS01jj.Range("A1").Value」の行で、 'エラーは出ないものの、セルの値を取得できません。 'もしこれが「Excelの仕様」だとすると、「欠陥品」ということになるんだ、と '思いますけど・・・。僕のExcelだけかな?それともマシンパワーが足りないのかしら? 'Office 365の Excel2019 でもダメでした。 '################################################################################################ Sub OpenTest04() ' Dim o_CSVjj As Workbook Dim o_WS01jj As Worksheet Excel. _ Application. _ Workbooks.Open "d:\1\1.csv" Set o_WS01jj = ActiveSheet '←呼び出しモトのExcelファイルのSheet1が取得されてしまう。 ' Set o_WS01jj = ActiveWorkbook.ActiveSheet '←こちらのコードじゃないと、CSVファイルのA1セルの値を取得できません。バージョンや環境によって違うのかもしれませんが・・・。 'イミディエイトウィンドウでのテストで、「Set o_WS01jj = ActiveSheet」の行を '実行する直前の状況は以降のようなかたちでした。 'ここから分かることは、「ActiveSheetの親となるブック」と、「ActiveWorkbook」は、 '「同じだと思いきや」、「実際は」「異なる」「同一ではない」 '「ActiveWorkbook と ActiveSheet とは無関係」ということのようです。 'ヘルプによるところの 、 '『 一番手前に表示されている、アクティブ ウィンドウ内にあるブック 』と、 '『 作業中のブック 』とは、「異なる」「同一ではない」ということのようです。 'でもこれほんと?難しいですね。2010でも Office365 の Excel2019でも同じ結果となりました。 ' '? ActiveSheet.name 'Sheet1 'Sheet1 ' '? ActiveSheet.parent.name 'Book1 ←呼び出しモトのExcelファイルの名前 'Book1 ' '? ActiveWorkbook.ActiveSheet.name '1 '1 ' '? ActiveWorkbook.Name '1.csv '1.csv ' '※2020/11/27 追記 '今日、再度試してみましたら、今回は正常に動きました。 '? ActiveSheet.name 'とやると、 '1.csvの最初のシート、「1」シートの名前が返ってきます。 'そのA1セルの値も返ってきました。 '結局僕のミスか、パソコンの調子が悪かったということかもしれません。 '2010と2019を共存させているので何かのタイミングで誤作動を起こしたのかもしれません。 'いずれにしても、「Active××××」は、名前を決め打ちする場合とくらべて、 '「ユーザーがアホな時はもちろん、パソコンの調子が悪いときに誤作動が起きる可能性も 'ゼロではない」 'ということはわかりました。 '滅多に起こらない誤作動だと思いますけど、自分のアホさも信用ならないので、同じように '「可能性」として覚えておこうと思います。 '次のプロシージャも、今日は正常に動きました。 ' Debug.Print o_CSVjj.Name Debug.Print o_WS01jj.Range("A1").Value End Sub '################################################################################################ '上記のプロシージャをさらに、「ActiveSheet」を命じて形に使うこと「すら」せず、 'さらに簡素化したものです。「Rangeからいきなり書く」ということをしています。 '(こちらのサンプルも、1.csvファイルは開くだけで「オブジェクト」としては扱いません。) 'ただし、「ActiveSheet」を用いて「すら」いませんので、エラーが「メッチャクチャに」出やすいです。 '(「Rangeからいきなり書く」場合「ActiveBook」、「ActiveSheet」を指定したことになるので似たようなものですが、でも意味が異なってくる場合もあります。) '基本、「サンプル用限定」の書き方なので、本番では絶対に使ってはいけません。 '特に、「他人が使うプログラム」では、「死んでも使ってはいけない書き方」、です。 'この例では、結果的に運よくCSVのA1セルの値が取得できてますが、エラーが出ないのは、 'それは「単なる」「マグレ」であり、 '「Active××××××」と同様、「Rangeからいきなり書き出すこと」が、「バグの”超”温床」 'であることには変わりはありません。 'Applicationを 「国」、 'Workbooks.Item(××)を 「都道府県」、 'Worksheets.Item(××)を 「市区町村」、 'Range(××)を 「番地、ビル名」 'と置き換えて考えてみた場合、Rangeから書き出すことは、 '「いきなり番地とビル名から書き出した・かつ・それだけしか書いてないハガキや封筒」 'と同じことです。 'そんなものが「まともに届くわけない」ということをしっかりイメージしてください。 '「エラーが出ないほうが不思議・・・」ということをしっかりイメージしてください。 '################################################################################################ Sub OpenTest05() ' Dim o_CSVjj As Workbook ' Dim o_WS01jj As Worksheet Excel. _ Application. _ Workbooks.Open "d:\1\1.csv" ' Debug.Print o_CSVjj.Name Debug.Print Range("A1").Value End Sub ' ' |
ちなみにですが、最後の5番目のプロシージャの、「Debug.Print」の行の前に「Stop」を書いて実行し、そこで止まった時点でイミディエイトウィンドウで4番目と同じようなテストコードを色々実行してみたら、以下のようになりました。
? ActiveSheet.name
Sheet1
? ActiveSheet.parent.name
Book1
? ActiveWorkbook.ActiveSheet.name
1
? ActiveWorkbook.Name
1.csv
?ActiveSheet.Range("A1").Value
?Range("A1").Value
a
? Range("A1").Parent.name
1
? ActiveSheet.Range("A1").Parent.name
Sheet1
基本、4つめのプロシージャと同じです。
しかし、「? ActiveSheet.Range("A1").Parent.name」でEnterして、なぜそこで、現在アクティブなブックのシートの名前じゃなくて、呼び出しモト(非アクティブなブック)のシートの名前が返ってくるのかがわかりません。
「ActiveSheet」を消して、「? Range("A1").Parent.name」でEnterすると、ちゃんと現在アクティブなブックのシートの名前(このテストでは「1」)が、返ってきます。
CSVを開いたからかな?と思ってxlsxを開いてみても結果は同じでした。
結局5番目のプロシージャで CSVのA1セルの値が取得できたのは、単に「運がよかっただけ」でした。
「Active××××××」が「多くのシーンで」「バグの温床」であることには変わりはありません。
でもほんと、よくわかりません。
Worksheet.Rangeプロパティのヘルプには、「オブジェクト修飾子を指定せずに、Range("A1")みたいな感じで書くと、ActiveSheet.Range のショートカットとなります。」と書いてあります。
そのことからすると、「Range("A1")」と「ActiveSheet.Range("A1")」は同じもの・・・・だと思っていましたが、上記の結果によると、2つ以上?のファイルを扱う場合はそうでもないよう・・・・です。
ほんとかなこれ?
僕の超アホな勘違いだといいんですけど・・・。
でも・・・
ナゾ。。。。
です。。。
※2020/11/27 追記
今日、再度試してみましたら、今回は正常に動きました。
? ActiveSheet.name
とやると、
1.csvの最初のシート、「1」シートの名前が返ってきます。
そのA1セルの値も返ってきました。
結局僕のミスか、パソコンの調子が悪かったということかもしれません。
2010と2019を共存させているので何かのタイミングで誤作動を起こしたのかもしれません。
いずれにしても、「Active××××」は、名前を決め打ちする場合とくらべて、
「ユーザーがアホな時はもちろん、パソコンの調子が悪いときに誤作動が起きる可能性もゼロではない」
ということはわかりました。
滅多に起こらない誤作動だと思いますけど、自分のアホさも信用ならないので、同じように「可能性」として覚えておこうと思います。
次のプロシージャも、今日は正常に動きました。
ちなみにですが、「階層構造」という意味合いを考える場合、
例えば郵便において、
Applicationを 「国」、
Workbooks.Item(××)を 「都道府県」、
Worksheets.Item(××)を 「市区町村」、
Range(××)を 「番地、ビル名」
と置き換えて考えてみた場合、
例えば OpenTest05() の例のように「いきなりRangeから書き出す」ということは、
「いきなり番地とビル名から書き出した・かつ・それだけしか書いてないハガキや封筒」
ということと同じことです。
そんなものが・「まともに届くわけない」
そんな宛先で・「まともに届くわけない」
・・・ということをしっかりイメージしてください。
「エラーが出ないほうが不思議・・・」
・・・ということをしっかりイメージしてください。
- 投稿タグ
- 「ニセモノ」への道, 「本物」に近づくために, AccessVBA, Accessの独学, Access操作の基礎, Accesの独学, ADO/DAO, ExcelSQL, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, MicrosoftQuery, ODBC, SQL, パソコンでの自動化, マクロ, 独学, 自動化