★★★★★★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」を置いてください。

  
  
以降は、上記のコードの違いをコメントをつけて説明させていただいたものです。
上手く説明できていないかもしれませんが、ヒントにしてみてください。
(プログラミングの場合、「必ず」「例外」があります。なのでコメントも、
 「絶対」ということではなく、「ほぼ、あてはまる」という意味での「ヒント」
 としてください。)

CSVファイルを開くと、ファイル名がそのままシート名となるようですので、以降のサンプルプログラムを試すときは必ず「1.csv」というファイル名で試してください。
もし「より汎用的にしたい」というときはその点を考慮してください。

  
  
ちなみにですが、最後の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から書き出す」ということは、
「いきなり番地とビル名から書き出した・かつ・それだけしか書いてないハガキや封筒」
ということと同じことです。

そんなものが・「まともに届くわけない」
そんな宛先で・「まともに届くわけない」

・・・ということをしっかりイメージしてください。

「エラーが出ないほうが不思議・・・」

・・・ということをしっかりイメージしてください。