VBAにおける、D&D・マウスホイール操作について

VBAの弱点、ドラッグ&ドロップとマウスのホイール操作について

VBAでは、ドラッグ&ドロップ(以下、D&D)とマウスのホイール操作が使用できません

D&D操作について

外部ファイルをD&D操作で直接VBAに読み込ませるには、2通りの方法がありますが、いずれも不安要素が大きいです

まず、よくあるのがリストビューコントロールを使用する形です
このリストビューコントロールは、ユーザーフォームの追加コントロールです
「その他のコントロール」から追加して使用することが出来ます
そのコントロールには、D&Dを検知するイベントがあり、そこからデータを操作することが出来るようになります

ただ、このコントロールは追加する操作が必要なのが難点です
そして最大の難点が、新しいExcelではコントロール自体が存在していないことです
これから主流になっていくであろう、64bitのExcelにはありません

永遠に使い続けられる処理を作成するのは幻想ではありますが、可能性ではなく実際に無くなっているコントロールを使い続けるのは少し不安です

なので、このコントロールでの解説は当サイトでは行っていません
別のWebサイトであれば、使用コード・イベントが解説されていますので、検索すればすぐに見つかりますので、そちらにお任せします

もう1つの方法が、WinAPIを使用する方法です

これはSleep関数などのように単体のAPIでサクッと使用できる、というような処理にはならないのでハードルが高いです
APIは便利ですし、それでしか実行できないことは任せますが、ハードルの高いAPIはbit違いによるメンテナンスも考慮すると、こちらも不安が残ります

そこで、本質的な話です

そもそもD&Dを使用したい場面について
これは単純に指定ファイルをシートやフォームに挿入したり処理を実行する際に、「ダイアログを開いて選択して挿入ボタンをクリックする」という操作を省くために使用したいのだと思います

確かに、D&D操作になれていると出来ないと不便に感じてしまいます
しかし、その操作の実現には不安要素が多いのが現実です

そして、この操作の最終目的は何かというと、D&D操作によって指定ファイルを操作することです、決してD&D操作が目的ではありません
なので、ユーザーからの依頼でどうしてもそれが無いと嫌だという状況以外においてはダイアログボックスでの運用をおすすめします
ダイアログボックスについては以下の記事から確認してください

マウスホイール操作について

ユーザーフォームのリストコントロールなどで上下移動したい場合などにマウスのホイール操作は使用できません

これはVBAでは、このボタン自体が認識されていないためです
ホイールを回す操作だけでなく、押し込む操作も使用できません

これをVBAで実装するにはWinAPIが必要になります
これも上記とほぼ同様なのですが、非常にハードルが上がります

実際、自分は別のWebサイトにあるコードを見てもあまり理解できません
そもそもホイールの概念自体がVBAに存在していないので、そこにその操作を放り込むというのは考えからも非常に困難なことが容易に想像できます

そこで、また本質の話です

このホイール操作で実現したいのは、ホイール操作ではない、という点です
要は、リストなどをマウス操作で簡単に上下移動したいのが目的です

それならば、頑張ってAPIを使用するよりも仕様内で考えてみます

SpinButtonコントロールのMouseMoveイベントを利用します
このコントロールを移動させたいコントロールの隣に配置し、その矢印上にマウスを移動させると、リストなどの選択を上下に移動させるような処理を作成します

これなら、マウスのクリックやドラッグ操作も必要なく簡単に操作できます

結論として

あらゆる言語のあらゆる知識を動員すれば、出来ないことなどなんにもありません

ただ、それには費用対効果をしっかり考える必要があります
効果に対して、費用が掛かりすぎる場合はデメリットの方が大きいので別の方法を考えるか、仕様としてあきらめるかです

勉強のためなら、どんどん突き詰めていくと良いと思いますが、仕事で使用するものであればメンテナンスのことは考えておきたいです

できないことを頑張るより、できることを頑張るほうが精神的にもいいです
そのほうがVBAも楽しめます

結論は、「仕様なのでできません、せやからこの方法でええやん♪」こう言うことにしましょう

Debug.Printについて

当サイトで頻出するDebug.Printについてと選択した理由

当サイトでは、値の取得であったりコード動作の確認にはタイトルのコードを使用しています

Debug.Print "出力内容"

このコードはイミディエイト画面に引数の内容を出力するコードです

値の取得などではMsgBox関数の使用も構わないのですが、履歴が残らず動画での動作説明を行わない当サイトでは少々無理があります

なお、動画に関しては当サイトの理念からいくとあまり必要は無さそうなので作成する予定はありません

画像の解説では、途中経過が省かれてしまうので履歴の残るこのコードでの解説を行うこととしました

初心者の方には、このコードは分かりにくいこともあるかもしれませんが、使えるようになると非常に便利なコードなので、当サイトを使用するにあたっては慣れていってください

当サイトのサンプルコードで、このコードが出てきているものを実行したが何も起きないと思ってしまった人もいるかもしれません
イミディエイト画面を表示していないと、そう感じてしまいます

MsgBox関数であれば明確に表示されるので、ユーザーとしてはそちらが良いかもしれないとも思ったのですが、やはり全ての記事で統一する解説方法を考えた時にこのイミディエイト出力に行き着いたので、わかりにくい方にはご容赦いただきたいと思います

デバッグモードについて

処理の実行確認を行うデバッグについて、操作方法と解説

デバッグモードとはコードの動きを確認することです
このモードを実行する事で、処理作成の動きの確認やバグ発生時の原因の特定に役立ちます

この力はコーディング力よりも重要です

どれだけのコーディング力があっても、いきなり思い通りの処理をテストせずに作成できる人もいないと思います、少なくとも自分は無理です
バグの無い処理をいきなり完成させることが出来る人もまずいないでしょう

つまり、コーディングした後にこのデバッグモードを有効に活用することによって安定の処理作成やバグの発見につながるわけです
そのため、デバッグ力は非常に重要な要素です

コードなんて調べりゃ出てくるし、このサイトでコピペするだけでも作れますが、このデバッグは完全にあなたの力でやりきるしかありません

デバッグモードの操作方法

デバッグモードの各操作メニュー
デバッグ操作のメニュー画面

デバッグメニューにある項目から操作を行います
基本的にコードの動きを確認しながら行うので、このメニューから選択してデバッグすることはありません

そのために、全てショートカットキーがありますので解説します

ステップインの動き
ステップインの動き

「F8」を押していくと、コードを1行ずつ実行していくステップイン操作ができます
基本的にはこの操作でデバッグは行います

1行実行して結果を確認して、次の1行を実行する・・・という形で処理の動きを確認していきます

キーを押し続ければ、その間処理がずっと実行されていきます

カーソル行まで実行の動き
カーソルまで実行する動き

「Ctrl+F8」でカーソルの行まで一気に処理を実行する事ができます
コード行数が多い場合に、後半部分を確認するのに前半部分をいちいちステップインで確認するのは手間になる場合に使用します

ただ、これに関してはブレークポイントやStopステートメントと同じ動きになるので、そちらのほうが便利かもしれません

カーソル行に飛ぶ動き
処理を飛ばす動き

「Ctrl+F9」処理をカーソル行に移動させることができます
その間の処理は実行されません

前半の処理が後半の処理に影響を与えず、動作確認が完了している場合に使用します

処理を実行しないので、処理時間がかかるような場合には上記の移動やブレークポイントより有効なのでよく使用します

ステップオーバーとステップアウトは、処理を呼び出した際に行う操作です

サブプロシージャ実行時のステップインの動き
ステップインでの動き

まずは、画像の様な処理をCallで呼び出している処理の動きをステップインで確認してください

ステップオーバーの動き
ステップオーバーの動き

「Shift+F8」でステップオーバー操作になります
この操作は呼び出し処理はデバッグせずに実行のみを行う操作です

サブ処理テストのプロシージャには移動せずに、処理は実行されています

ステップアウトの動き
ステップアウトの動き

「Ctrl+Shift+F8」でステップアウトの操作になります
この操作は呼び出し処理内で行うと、その処理は実行して抜け出す動きになります

画像の動きですが、サブ処理テストの行で操作するとプロシージャを抜けて、呼び出し元の次の処理に移動します
この時処理は実行されています

ステップオーバーとステップアウトの動きを確認してもらうと分かりますが、これはブレークポイントで十分対応できます
なので、この2つはあまり使用場面は無いと思いますので、覚える必要はありません
この操作の動きの確認だけしてもらえばいいです

デバッグ操作で覚えてほしい操作

上記で一通り紹介しましたが、結局ブレークポイントやStopステートメントを活用することにより、そちらのほうが便利であったりします

なので、デバッグ操作で覚えておきたいのは以下の操作です

・ステップイン「F8」-1行ずつ実行する
・カーソル行に飛ばす「Ctrl+F9」-処理を実行せずに移動する

の2つです、これに合わせてもう1つ

・処理の継続「F5」-処理を通常通りに実行する

この通常実行は、処理途中で後の確認は必要ない場合に残りの処理を実行させる場合やブレークポイント設置個所まで通常実行を行いたいときに使用します

実行時エラー表示
実行時エラーの表示画面

また、画像のような実行時エラー画面が表示されたらデバッグボタンを押してください
すると、そのエラーの発生した行がデバッグモードで停止していますのでバグの修正を行ってください

修正が完了したら、F5で通常実行したりして動作の確認を行います

デバッグが難しい場面

以上のようなデバッグ操作でほぼ処理の動きの確認は行えます
ただ、デバッグ操作では動きの確認が難しい場面もあります

例えば、SendKeysメソッドはアクティブなアプリに対してキーストロークを送信するメソッドですが、これをデバッグ中に行えば当然アクティブアプリはVBEになるのでうまくデバッグできません

またユーザーフォームのSetFocusメソッドも同じですが、このメソッドは指定のコントロールにフォーカスを取得させます
デバッグ中ではVBEがフォーカスを得ているので、このコードをデバッグモードで実行してもうまくいきません

他にも表示関係でもありえますが、デバッグ操作はデバッグ力の一部と思っていてください

基本的なデバッグ力は、探し出す力になります
これは99%経験によるものと思いますので、いろんな処理を作ってデバッグモードで動きを確認してみてください
気づけばこの力はついてきているはずです

バインディングについて

FSOなどExcel以外のアプリ操作の使用に際するバインディングについての解説

バインディングとは、通常のVBAコードでは実現が難しかったり、不可能な場合にVBA標準以外のアプリなどを利用して処理を作成する際に、アプリなどのインスタンスを作成する操作のことをいいます

インスタンスの作成とは、アプリを内部的に起動する状態のことです

このバインディングには「事前バインディング」「実行時バインディング」の2通りの方法があります

事前バインディング

処理を実行する前に行うため、事前バインディングといいます

これは、VBEでの参照設定を行う必要があります

参照設定の開き方
参照設定の開き方

ツールメニューの中にある「参照設定」を選択します

FSOの参照設定の項目の説明
参照設定を行う画面

選択すると、参照設定画面が表示されます
この画面の左のリストから、使用したいライブラリファイルにチェックを入れてOKボタンを選択することにより参照設定が完了します

これはPCの環境によってリスト内にあるものも変化しますので、作成環境と使用環境が同じライブラリファイルが無いとエラーになります

また、この設定はVBEの設定であるため他のPCでは都度同様の操作が必要になります
行わないとエラーが発生します

実行時バインディング

処理の実行時に行うものを実行時バインディングといいます

こちらはCreateObject関数を使用してインスタンスの作成を行います
この関数は引数に指定された文字列に対するアプリのインスタンスを作成します

実行時の環境にあわせてバージョンも自動的に指定されるため、作成環境ではないPCでも問題なくバインディングが実行できます

変数の宣言方法

それぞれの実際に使用を始める際のコードが少しだけ違います
最初にインスタンスを代入する変数を宣言します
FileSystemObjectを例にします

・事前バインディング
「Dim bhFSO As FileSystemObject
Asまでは通常の変数と同じです、変数の型が作成するインスタンスに対応したものが指定できます
これは事前バインディングを行った場合にしか指定できない型です

・実行時バインディング
「Dim bhFSO As Object
Asまでは同様に同じ、変数の型は固有のものを使用できないためインスタンスを代入できる汎用的な型の「Object」を使用します

インスタンス作成の方法

次に行うのが実際にインスタンスを作成するコードです
上記にもあるようにインスタンスの作成とはアプリを起動することです
これは内部的に起動を行うので、バックグランド処理になります
こちらもFileSystemObjectを例にします

・事前バインディング
「Set bhFSO = New FileSystemObject
事前バインディングの場合は「New」キーワードを使用してインスタンスの作成を行います
この作成を行った時点で、同時に変数に代入されます

・実行時バインディング
「Set bhFSO = CreateObject(“Scripting.FileSystemObject”)
実行時バインディングの場合は、CreateObject関数を使用してインスタンスの作成を行います
この関数の引数「Scripting.FileSystemObject」がFileSystemObjectのアプリケーション名になります

こうして、インスタンスの作成を行うことによりそのアプリケーションをVBAから操作することが可能になります

これはExcel以外のアプリを操作する場合に必須の知識になります
IE制御はもちろん、WordやOutlookなどのアプリも同様です

また、Excelのインスタンスを作成することで、現在使用しているExcelとは別のExcelを複数起動することが可能になりExcelデータを内部処理として実行するようなこともできます

それぞれの使い分け

ここまでの話では、環境設定を行う必要が無い実行時バインディングのみ使用すればいいように感じるかもしれません

ですが実際にコーディングを行う際には事前バインディングの方が圧倒的に便利です

参照設定を行った際のインテリセンス入力
インテリセンス入力が表示される

事前バインディングを行った場合は、画像のようにインテリセンス入力ができるようになります
これの便利さは、通常のコーディング中でもかなり実感できているはずです

外部アプリの場合はそもそもどんなメソッドやプロパティがあるかさえも分かりませんので、これをいちいち調べたり、スペルミスが無いかを確認しながらコーディングを行う必要がある実行時バインディングに比べると、いかに事前バインディングがコーディング上で優位性があるかが分かります

また、オブジェクトブラウザーで使用可能なメソッドやプロパティが参照可能です

オブジェクトブラウザーの見方
FSOのオブジェクトブラウザー

画像の様に、FileSystemObjectクラスにある各メンバー(メソッドやプロパティ)が参照が可能です
ものによりますが、下部にそのメンバーの説明があるためこれである程度どんな操作が可能か分かります

「FileExists」はファイルの存在を確認するメソッドですね、VBA標準の「Dir」関数と似たような機能のものです
戻り値が違うので全く同じ機能ではありません

この様にコーディング上にも非常に優位性がある事前バインディングですが、上記にもあるように環境設定が必要な点から考えると実行時バインディングの方が汎用性があります

あまり気にするレベルではありませんが、事前バインディングの方が処理時間が速くなります

結局どちらにもメリットがあるわけです

どちらも利用する方法

最終的にどうしたらええねんって話ですが、どちらのメリットも使用するのが一番です

まず参照設定を行いましょう

そして、変数の宣言は2つ作成しておきます
これは単純に同じ名前の変数で事前と実行時の2つのコードを使用します
ただ、これではエラーになるので実行時の方はコメントアウトしておきます
以下のような形にします

Dim bhFSO As FileSystemObject
'Dim bhFSO As Object

これで、この変数でインテリセンスが使用できます

インスタンスの作成に関しては実行時のものを使用すればいいです
事前バインディングの場合でもCreateObject関数でのインスタンス作成は可能だからです

Set bhFSO = CreateObject("Scripting.FileSystemObject")

これでインテリセンス入力が可能な状態でコーディングできます
処理が完成したら、変数宣言のコメントアウトを入れ替えます
メンテナンスを考慮すれば、あえて削除する必要も無いと思います

使用後の処理について

そして、オブジェクト変数であるため約束事として最後には変数の解放を行いますが、これに関しては解放を行う前にアプリを終了させる必要があるものもありますので解放タイミングは注意が必要です

Set bhFSO = Nothing

コードで解放を行えます
上記の様にアプリを終了させずに解放しただけでは、バックグラウンドでアプリが起動したままになるものもあります

そういったアプリは終了させてから解放を行います
コードで行えなかった場合は、タスクマネージャーからプロセスを強制終了させてください

バインディングについて色々初心者には難しい話が多いですが、中級者になれば必ずExcelのみでは満足いく処理が作成出来なくなってきますのでその段階で導入を考えてください

なお、自分は環境設定を行う前提の処理作成はあまりしたくないので実行時バインディングで処理を完成させるように注意しています

イミディエイトウィンドウについて

デバッグ時に重要なイミディエイトウィンドウの解説と使い方

イミディエイトウィンドウとはVBEのウィンドウの1つです
表示タブか「Ctrl+Gキー」で表示されます
デバッグ用の画面です

イミディエイト画面でコード実行
イミディエイトウィンドウでコードを実行する

このウィンドウでは、1行の処理を実行する事が出来ます
「MsgBox “”」
この1行をイミディエイトウィンドウの空白行にコピーして、入力カーソルをその行に置いてEnterキーを押すと処理が実行され空白のメッセージが表示されます
処理作成中にちょっとしたテストをしたい場合に使用できます

プロパティ値の取得

イミディエイトでプロパティを取得する
プロパティの取得
?ThisWorkbook.Name

上記のコードのように、行の先頭に「?」を入力してから、取得したいプロパティを入力してEnterキーを押すと、改行後に指定したプロパティ値が出力されます
変数名を指定すると、現在の変数のデータが出力されます
こちらもちょっとしたプロパティ確認に使用できます

プロシージャからイミディエイト画面に出力する
プロシージャからイミディエイトに出力する
Debug.Print ThisWorkbook.Name

プロシージャの実行中にイミディエイトウィンドウに出力することもできます

上記のコードをプロシージャ内にコピーして実行してください
すると、イミディエイトウィンドウにブック名が出力されます

こちらはデータの数が多かったり、データの履歴を確認したい時に使用します
メッセージボックスだと数が多いとめんどくさいし、履歴も残らないので

1行で複数のコードを実行

イミディエイト画面で複数処理を実行する
複数の処理を実行する

イミディエイト上でのコード実行で応用として、コードの1行の終わりに「:」を入力して2行目のコードを連結すると一括で処理が実行できます

画像の動きのように、2つの処理が実行されています

この使い方自体は、プロシージャの通常処理でも使用可能です
ただそれはコードの可読性を落とす可能性が高いので、やめといたほうがいいと思います

「Else : EndIf」など実際の処理は何もないような時ぐらいで抑えておきましょう

イミディエイト画面は非常に便利な機能なので有効に活用してください

いろいろな事(暇なときにどうぞ)

ExcelVBAでの豆知識やこのサイトでのコードの扱いなど

値の入力(代入)と比較

ExcelVBAでは、値の入力(代入)と比較が似ています
値の入力は、Range(“A1”)=100
比較は、この条件式のままIfなどを使用すると比較になります

文字列の扱い方

関数でも同じなのですが、コード中に文字列を扱いたい場合は「”(ダブルクォーテーション)」で挟む必要があります
Shift+2キーで入力できる文字です、自動的に変換はされますが半角で入力します
「”文字列”」 こんな感じで使用します

また、文字列の結合は「&」を使用します
「”単価:” & 10 & “円”」 → 「単価:10円」となります

改行は「vbLf」を使用し、結合と組み合わせます
「”商品A” & vbLf & “単価:” & 10 & “円”」

「商品A
単価:10円」となります

改行には「vbCr」「vbCrLf」が他にもあります
どれもVBAで改行として使用できますが、セル内での改行は「vbLf」が使用されるのでそれに合わせておいたほうが、改行の検索する際に便利です
ちなみに、CrとLfはそれぞれ改行文字として1文字入っています
なので、置換や文字数のカウントでは注意が必要です

ワイルドカード文字

ワイルドカード文字とは、文字列の検証に使う特殊な文字の事です
Excelの検索や置換でも使用するものです
「?」は任意の1文字を表します
「*」は不特定の文字を表します


「VBAの部品庫」を検証する場合
「VBAの???」=○
「VBAの????」=×
「VBAの*」=○
「*VBA*」=○

これらの文字を扱うことで、完全一致ではないものを検索が可能となり
条件に一致するものをまとめて操作することが出来るようになります
FindメソッドやDir関数でこれらの文字を扱うことで、完全一致ではないものを検索が可能となり条件に一致するものをまとめて操作することが出来るようになります

日付データの入力

日付データは文字列や数値とは違う入力ができます(実際の日付データの中身は数値なので数値としての入力も問題ありません)
「#m/d/yyyy#」の形式で入力すると、日付として扱えます
「#1/31/2000#」 こんな感じで使用します
また、時刻まで指定する場合は「#m/d/yyyy h:m:s#」というように西暦年の後にスペースを置いてから時分秒を「:」で区切り入力します
「#1/31/2000 20:13:25#」 こんな感じで使用します

条件式の等符号

Ifで条件式を使う際に必要なのが等符号です
ExcelVBAは代入と比較が同じ「=」を使うので、混乱しないようにしましょう

A=B → AとBは同じ
A<>B → AとBは同じではない

A>B → AはBよりも大きい
A<B → AはBよりも小さい

A>=B → AはB以上
A<=B → AはB以下

文字列の比較は「Like」を使用、ワイルドカード文字も使用できます
A Like “*あ*“ → Aは文字列「あ」を含む
オブジェクトの比較は「Is」を使用
A Is Nothing → オブジェクトAは「Nothing」である(オブジェクトの初期値)

処理の停止

無限ループや処理時間が長く一時処理を停止したい場合は「Escキー」もしくは「Ctrlキー+Breakキー」を押下します
1回では止まらない事もあります、あきらめず押しましょう

Selectionについて

当サイトでは、1行のステートメントでコピペして作るという想定のもと構成していることからセル範囲のオブジェクト指定には「Selection」を使用しています
ただ、このSelectionというのは実際にはワークシート上にあるオブジェクトが対象となっています
つまり、セルだけでなく図形等も含むオブジェクトがSelectionの対象になっています
なのでセルのプロパティやメソッドを、他のオブジェクトで実行するとエラーが発生する恐れがあります
Selectionはこのコード実行前に必ずオブジェクトの指定を行っているはずなので問題は出にくいかもしれませんが、意識として「Selection=選択中のセル」とはならないということを持っておいてください

パスの¥マークとバックスラッシュについて

絶対パスなどで使用するフォルダ内を表す文字「\」について
この画面ではどう見えていますか?
Web上では「バックスラッシュ」という記号になっていることが多いと思います
ですが、エクスプローラーでは「半角の¥マーク」です
なので当然VBAコード上も後者です
これは文字コードが全く同じなので、どちらに見えていても動きには全く問題ないので安心してください
「コピペしたら¥マークになった」これは正常です

引数の入力方法

引数の入力には2通りの方法があります
引数の名称を指定して入力する方法と名称を省略して入力する方法です
例えば、MsgBox関数でいうと

引数の名称指定あり → MsgBox Title:=”タイトル”, Prompt:=”本文”
引数の名称指定省略 → MsgBox “本文”, , “タイトル”

こんな形の指定方法になります
実行時は全く同じ結果が表示されます
引数はインテリセンス入力ができないので、入力はめんどうです
なのでほとんどの場合は後者の省略したほうを使用することが多いです
ただ、当然引数を知らなければ意味不明です
引数の数が多く、途中で改行でもすればさらに分かりにくくなります
とはいえ知らずに作成するのも不可能なので、作成できる時点で知っているはずです
なのに省略をしない方法の利点は、順番を入れ替えれる点と指定外は非入力で良い点かと思います
省略法の場合は、引数の順番は固定で省略時は「,」だけ入力する必要があります
省略しない方法は、順番も好きなように入れ替えれるので分かりやすくなる可能性もあります
先にタイトルがあって、本文がある流れの方が分かりやすければ前者が有用です
このサイトでもどちらかに固定はしていません、引数の必要なコードで臨機応変に使い分ければいいかなと思います
(引数が多く、コピペするひとがわかりにくくなりそうなときは非省略法で解説してます)

日本語の使用について

VBAでは文字コードがUnicode形式となっています
これは1つの文字に対して、2バイトで表現する形式です
半角の文字列であっても2バイトで表現されます
このおかげでVBAでは日本語の変数も使用できますし、日本語に連番で「1」などの半角文字と混在させてもプログラムに支障が無いようになっています
アルファベット圏では無い日本人にはありがたい形式ですね
色々とWeb上でも賛否両論ある日本語使用でありますが、自分としては使用することをおすすめします
主な利点として「コメントが必要ない程分かり易くなる・コード中に出てきたらいきなり日本語なので変数と分かり易い」辺りかなと思います
あと感情的な理由ですが、Microsoftのプログラマーさん達がわざわざ日本語などの母国語文字を使えるように仕様を作ってくれているのです
自分でもそうですが、せっかく作った仕様は使い尽くして欲しいと感じますしね

配列変数の下限値について

配列変数の下限値は通常「0」から始まります
ですが「Option Base」や「( 3 To 5)」などの使い方によって変動してきます
なので、下限値が「0」ではない可能性はあります
ただそれには上記の特別な使い方をした場合に限られます
配列というメモリ上のデータの連番の始点を可変にすることもあまりおすすめできません
なので、このサイトでは下限値は「0」であるという想定の下解説を行いますし
上記の下限値を変更するコードを記事にもしません

知っておくといい用語

ExcelVBAに出てくる用語説明(知ってなくても処理は作れる)

基本的な用語(知ってなくても処理は作れるけど解説が分からなくなる)

ブック
Excelファイル自体のこと、VBAはこれの要素の1つ

プロジェクト
ブックと同義、ブック1つにプロジェクトも1つ。これの下にモジュールがある

モジュール
標準・クラス・オブジェクト(ユーザーフォーム含む)がある

標準モジュール
通常処理作成はここに作成を行う、何個でも作成可能

クラスモジュール
クラス定義を行う、主にはコードの質向上に使う。

オブジェクトモジュール
オブジェクトとは物のことなので、ブック・シート・ユーザーフォームがある

ブック・シートモジュール
ブックモジュールはプロジェクト1つにつき1つ、シートモジュールは作成されたシートの数だけ自動的に作成される

ユーザーフォームモジュール
ユーザーフォームという各コントロールを使用してExcelとは別のウィンドウを作成する、システム作成まですると必須

プロシージャ
処理、これを作るのが仕事です。これが上記のモジュールのどこかに入ってプログラムとして実行されます。モジュール内に何個でも作れますが、ほどほどにしないとどこに何があるか分からなくなります

オブジェクト
前後しますが、セルやシート、図形やフォームのコントロール達。省略可能な場合が多く気づきにくいが、コードのほとんどはこのオブジェクトに対して処理を行っています

コレクション
オブジェクトやデータの集合体、まとめて処理を行ったりループ処理に使用することが多い

プロパティ
オブジェクトの情報です。セルの入力内容や書式設定も全てこれです。これに対して設定を変更したり、情報を取得して処理を行ったりします

メソッド
オブジェクトの動きです。セルのコピペやシートの作成削除がこれです。処理のほとんどが、このメソッドとプロパティの組み合わせで行っています

イベント
オブジェクトに備わっているもの。セル内容を変更・コマンドボタンをクリックなどユーザーが無意識に行う操作で発動するもの。ここにプロシージャを作って無意識下で処理の実行を行うことが可能になる

変数
特定のデータに名前を付けたもの。付けた名前は変わらなくてもデータは変わることの出来るもの

関数・引数
関数とはすでに作成された処理のことです。
VBAでも作成可能ですがそちらはユーザー定義関数と記載するので、関数と記載していた場合はVBA標準関数の事です
その関数が必要とする要素を引数(ひきすう)といいます
省略可能な場合が多いですが、最低1つはほとんどの関数は引数が必要です

定数(じょうすう)
数値を文字列に置き換えたもの。基本的にプロパティの設定値などは内部的には数値で扱われています
しかし、プロパティごとに0がなにで、1がなにで、-1はこう、といちいち覚えてもいられませんし、見直しても分かりにくいことこの上ありません
例えば、色に関していうとわかりやすいです
「65280」この色です。といわれても何色か分かりません
そこで、この数値を定数に置き換えたものが「vbGreen」です
緑色だ、と分かったはずです
これが定数の便利さです、これのお陰で値をいちいち覚えていなくてもプログラムが書けます
こちらもユーザー定義の定数は変数の部類になるので別と思っていてください

参照設定
外部アプリなどを使用する際にExcelVBAにそのアプリを使用可能な状態に設定すること
事前バインディングと実行時バインディングの2通りの方法がある

事前バインディング
VBAの参照設定でコーディング中に設定を行うこと
メリットは、そのコードに対するインテリセンスが可能になることやプロパティやメソッドが確認できることと処理実行前に設定が完了しているため実行時バインディングより動作が早い

実行時バインディング
処理の実行中に参照設定を行うこと
メリットとしては、事前の参照設定を行っていなくても実行可能になること
例えば、参照設定を行っていないPCで作成した処理を実行するとエラーになるが実行時バインディングであればエラーにならず実行可能になる
またバージョン違いに関しても柔軟に対応できる
実行環境を整える必要がない分、こちらの方がメリットが大きいと思います

リファレンス
VBAのヘルプサイトのこと。以前はOfficeソフトに同梱されていたヘルプがネット上に開設されたところ。もちろんOffice持ってなくても閲覧可能です
自動翻訳なので、ん?や定数が日本語化されてて、あかん!ってなりますが、下手な解説サイトよりよっぽど役に立つよ!と身も蓋もない事をあえて言っておきます

ExcelVBAのリファレンスページへのリンク
https://docs.microsoft.com/ja-jp/office/vba/api/overview/excel

文字列として「”」を代入

「”(ダブルクォーテーション)」を文字列として認識させる方法

変数などへの文字列の代入に関して、文字列は通常「”」で囲むことになります
しかし、「”」を文字列として代入させたい場合があります

その場合には2通りの方法を使用します

「”」を連続で入力する

「”」を入れたい箇所に「””」と入れます
「””」とすることで「”」の代入になります

"123""456"
→→→ 123"456

間に「”」が1つ挿入された状態になります

"123""""456"
→→→ 123""456

4つ入力することで、2つ挿入された状態になります

Chr関数で入力する

Chr(34)

Chr関数は文字コードから文字を返す関数です
これを利用する事でも入力できます

"123" & Chr(34) & "456"
→→→ 123"456

Chr(34)を1つ入力すれば、1つ挿入された状態になります

"123" & Chr(34) & Chr(34) & "456"
→→→ 123""456

2つ入力すれば、当然2つ挿入された状態になります

こちらでは、挿入したい個数がイメージしやすいので可読性は良いかもしれません
ただ、コードが長くなってしまうので1行が長くなりすぎる場合は考え物かもしれません

おすすめ書籍

サイト管理者の実際に持っているおすすめの書籍の紹介です

実際に購入して愛読している書籍を紹介していきます
順番に意図はありませんので、気になった書籍はリンクから確認してみてください
アフィリエイトではありませんし、今後するつもりも無いので本当に実際に読み続けていかにVBAの為になるかを実感した書籍ばかりです
この著者の方々に追いつくことは無理でも、少しでも近づきたいものです

Excel VBAパーフェクトマスター

書籍へのリンク 
https://www.shuwasystem.co.jp/book/9784798027098.html

著者 土屋和人氏

もはやこれ無しにVBAを語る言葉を持ちません
この書籍は入門から中級を抜けるまでの内容がオールカラーで非常に分かり易く書かれています
また引数や定数も載っているので、この本を開けば処理作成に困ることがありません
まさに、必須の1冊と言ってもええんちゃうかと思います
この書籍のおかげでこうして、人にVBAを教えることができるまでに成長したのは間違いありません
画像も多くオールカラーなので非常に見やすいです
非常に広い範囲の内容が書かれておりすぐに使える内容も多いのに解説がしっかりとされているので基礎勉強にもしっかり使えます
自分はこれを基本に後は特化書籍を手に入れるようにしています
それほどにこの書籍はベースに向いています
自分の持っているのがこの2010までの分なので、これは絶版になっていますが新しいExcelへの対応した分がありますのでそちらを検討ください

Excel VBA ポケットリファレンス

書籍へのリンク
https://gihyo.jp/book/2010/978-4-7741-4440-5

著者 前田智美氏

初めて買ったVBAの書籍です
VBAを始めてネット情報やマクロの記録だけでやっていて限界を感じて、やっぱり本がいるんちゃうかと思って、とりあえずやりたいことがサクッと載ってるやつがええやろと思い購入しました
リファレンスとあるように、目次からやりたいことがすぐに調べて使用できます
ただ書式の書き方が独特で、オブジェクトや変数がある程度理解していないとよくわかりませんでした
今でこそ、まったく詰まることなく読めるしリファレンスとして無駄な説明は極力少なくする必要がある中、あ~そういうことか~と感じ入る内容がたくさんありました
この理解力に至る前に読むと、中に書いてある非常に素晴らしい情報をうまくキャッチできない可能性はあります
初心者は脱却して、とりあえずうろ覚えのコードを調べるための持ち歩き書籍として有用だと思います

Excel VBAでIEを思いのままに操作できるプログラミング術

書籍へのリンク
https://book.impress.co.jp/books/3384

著者 近田伸矢氏・植木悠二氏・上田寛氏

この本は本当に運命的なタイミングでした
この本を購入した当時、ちょうど初めてWebシステムの操作をできないかと依頼されIEの操作ができることは知ってはいたが、勉強したわけではなかったのであまり思ったように処理作成が進んでいませんでした
そんなときに、この作業のすすみの悪さはやはり知識不足が原因であり
それを補うのがWeb情報の断片的なものでは限界があるのでは?と感じ始め、体系立てて学習できる書籍を探すことに決めて大きな書店にいってすぐに発見しました
それまで書店にいけば必ずVBA本は確認するようにしていたので、だいたい見覚えてしまっていたので記憶の中にこの系統の本が無かったのに発見したのです
本屋さんで思わず「これやん!」と声を上げてしまいましたが、中をサラッと見てさらに思わず「いやいや!これやん!!」とまた声が出ました
少し前にほんのさわり程度のHTMLはやっていたのが幸いし、非常に分かり易かったです
さらにIE制御特有の考え方も初めにしっかり記載されているため、コードに入る前からの導入がすばらしいです
そして、HTMLの代表的なタグを実際の動きと使い方を1つ1つ丁寧に解説されていたので、HTMLに精通する必要無く処理を作成できることも分かりました
また、それまで言葉しか知らなかったWinAPIの使用方法も分かり易く載っていたのでこれでIE制御だけでなくWinAPIもなんとなく使えるようになりました
やはり特化書籍なので、この本1冊でIE制御における処理はカバーできます
仕事上でWebのクロールは無いので、ほとんどがWebシステムの操作性向上でしたが、おかげ様で貢献できたのは本当に良かったです

他の書籍もおいおい追記していきます

変数の宣言の強制について

変数の宣言の強制を行う方法と理由、それの本質的な必要性について

変数の宣言の強制とは、コーディング中に宣言されていない変数の使用を不可にする設定です

宣言していない変数のエラーメッセージ
強制時に発生するエラー

この設定を行うと、宣言されていない変数を使用すると画像のようなエラーが発生します

コンパイルエラーなので、プロシージャの実行前に発生します
ここでOKボタンをクリックすると、対象の変数が選択状態になります

この設定はVBEのオプション設定ではなく、コードを記載することで設定されます

変数の宣言を強制するコード
実際の入力状態

コードは宣言範囲に入力する必要があります
宣言範囲とは、モジュールの最上部になり、画像の様にプロシージャの外側の最上部に記入します

これでこのモジュールでは変数の宣言が強制された状態になります
また、この設定はモジュールごとに必要になるのでシートやユーザーフォームなどにも入力を行う必要があります

全てにいちいち入力するのはめんどうなので、自動入力できる設定が行えます

オプション設定の開き方
設定オプションの場所

まずはオプション画面を開いてください

変数の宣言を強制するオプション設定
設定画面の項目箇所

編集タブの「変数の宣言を強制する」にチェックを入れると、これ以降に作成されたモジュール全てに上記のコードが自動的に入力されます

これ以降に作成されたものなので、この設定前に作成されたものは入力されないので、必要であればコピペして入力を行います

変数の宣言の強制の必要性について

上記の内容で簡単に入力を行うことが出来るようになった変数の宣言の強制ですが、これの必要性について話しておきます

これを使用する理由は、変数名の入力時にタイプミスにより別の変数を意図せず作ってしまい、バグを誘引させる要素を排除するために行います
変数名のタイプミスとは、そのほとんどがスペルミスです

例えば、変数を英単語にすると「variable」です
これを変数名にしたと仮定しますと「Dim variable As String」とまずは変数の宣言を行います

その後コーディング時に変数名を入力しますが、その時にスペルを間違い「valiable」と入力してしまった
そうした場合、変数の宣言の強制を行っていない場合はこのプロシージャでは2つの変数が作成されることになります

1つ目は当然「 variable 」の String 型です、2つ目が「 valiable 」です

そして、この2つ目の変数は宣言が省略されているため変数の型はVariant型になります

これに気付かず1つ目の変数の文字列をいくらコード中に更新しても出力すると更新されない、という結果に陥ります
これを変数の宣言の強制を行うとコンパイル時にエラー表示で教えてくれるので事前に発覚するわけです、なので有用な設定なのです

変数の宣言の強制の本質としての必要性

ここで1つ本質的な話としてですが、これはあくまでもコーディングを行う者にミスを知らせるものであってコーディングの効率を上げるものでも無いし、そもそもミス入力が無ければ必要性は無いように思います

とはいえ、ミスは必ずでます。これはどうしようもありません
ですが、別の方法でもこのミスを無くすことができます

スペルミスによる大きな要因は、英語表記やローマ字表記によるものです

これは日本人である以上、慣れていないんだからミスをするのも当然です

なので日本語を使いましょう、ただそれだけでこのスペルミスは無くなります
さらに言うなら、変数名に日本語を使用すればその単語がすぐに理解できるため、変数の用途説明のコメントを最小限に減らすこともできます

しかし、日本語使用でよく挙がる問題があります
それは、半角全角の切り替えを行わないといけない点です、これはどうしようもないです

ですがここで1つ考えてみてください。
コードの解説であるコメントを入力する際や、メッセージボックスの文章を入力する際に必ず行いますよね?
確かに、この切替操作を全く行わないならそっちが優位です

操作回数が5回より0回は圧倒的に優位ですが、10回と5回では圧倒的に優位とまでは言えません、それほどに0回というのは強みです
これは業務改善を行ううえでも重要な考えです

でも、上記にもあるようにそれは日本語を使う事がある以上不可能でしょう
なので、この半角全角を切り替えるのがわずらわしいという理由は少し乱暴です

変数の宣言時に1度日本語を入力するだけでよければ、あとは半角で問題ない訳です
そのために使用するのがインテリセンス入力です
これはいわゆる予測変換で、メソッド等以外にも変数も使用可能です
そしてこれを有効に利用するために、日本語変数名の前になるべく意味のないアルファベットを入力します。
こんな感じです「Dim gh日本語変数 As String」
頭文字のghにはなんの意味もありません、キーボードで入力しやすい文字でいいと思います

これをしておくとインテリセンス入力が圧倒的に楽になります
というのも、インテリセンスのリストの並びはアルファベット順、次に日本語順となっているので日本語のみだとリストから探すのが大変になりますし、上記の通り半角全角の切り替えを少なくしたいからです

変数のインテリセンス入力画面

画像の様に、「gh」と入力してインテリセンス表示の「Ctrl+Space」でリストが表示されます
あとは選択した項目で「Tab」を押せば入力されます
この方法は、日本語未使用でも利用できるので活用してください

頭文字に意味を持たせないようにと言いましたが、それは変数名にその役割を持たせるべきであってそこに意味を持たせると読み解くのに余計な手間が発生する可能性があるのと、付けるときにいちいち考えるのも面倒です
VBAの定数でも「vb~~」となっているように、全く無意味ではないけどその変数名に対して意味があるわけでは無いようにしたほうが、変数名に集中できます

変数名やプロシージャ名など、日本語が使えるところは積極的に使っていってください。

それがExcelVBAの言語仕様です、開発者は言語仕様を使い切ってください
それがこの言語を作ってくれた人への最大限のリスペクトです

なお、自分は変数の宣言の強制は使用していません
宣言箇所にあれがずっと居座っているのが気持ち悪いし、変数名の入力ミスも上記のようにそもそもタイピング入力しませんのでありません
開発者の意図は分かりませんが、それが標準設定ですしね

ただし、強制しないからと宣言自体を行わないことは絶対にしないでください
これをする人がいるから、この設定が必須と言われてしまいます
変数の宣言の強制設定は強制しませんが、変数の宣言は強制します!