個人用マクロブックを読み込まない

個人用マクロブックが読み込みされなくなった時の対処について

ファイルタブを選択

まずは落ち着いてExcelを起動してください
そしてファイルタブを選択します

オプションを選択

次に左側メニューの一番下のオプションをワンクリックします
焦ってダブルクリックしてしまっても問題無いので落ち着いてクリックしましょう

アドインを選択

開いたウィンドウのExcelのオプションのメニューからアドインを選択します
手の震えを無理に抑えなくても…(しつこい)

オプションを選択

表示された画面の下部にある、管理項目を確認します
ここの選択肢から画像の「使用できないアイテム」を選択して、設定ボタンをクリックします

設定の確認画面

ここに「PERSONAL.XLSB」があれば、選択して下にある有効にするボタンをクリックしてください

これで再起動すると読み込みが正常に行われるようになります
ここにない場合は、マクロブックが存在していないかもしれません
こうなったらお手上げですね…この操作で復活出来ることを祈っております

先日発生した話

個人用マクロブックとは、そのPCにおいてExcelを起動すると自動的に読み込みされる
マクロ保存用のブックの事です。
個人用と名前の通りで、個人で利用するには非常に便利な機能です。

個人用のファイルは特定の個所に保存され、初期設定の状態でマクロセキュリティでは安全な場所として登録されているため起動時のマクロセキュリティ確認も必要ありません。
特に作成用のコードを保存しておくなど、作成に役立てる目的でも自分はよく使います。

そんな便利なファイルですが、いきなり使用が不能となりました。

これはかなり愕然としました
上記にあるように自分の仕事PCの個人用マクロブックはまさにこのサイトにあるような自分の知識の蓄え場でもあるため、結構な量のコードやフォームが存在しています。
日々仕事の中で作成した処理などで閃いたことや後に残しておきたいものがそこには貯め込まれています。

これを一気に失ったのです。

何か月もかけて作ったExcelVBA処理の比では無く
マジでくじけそうになるほどの衝撃でした。
「からっぽやないかい…」
「ゴミ箱も何も入ってへんやないかい…」

正直なところ、作成したExcelVBA処理ならあきらめもつきます
所詮はこのマクロブックからコピペなどして作成したモノですから

それほどの重要なファイルが消失したと思っていました

と、いうのも
このExcelの起動時読み込みには実際にはユーザー・Excel・Officeという3つの種類があります
これのうち、利用されるのが最初のユーザーになります

それも認識が無かったため、Excelの起動フォルダを確認しに行って
ファイルが存在していないと勘違いをしていました

実際にはユーザーの読み込みフォルダ内にファイルが存在することは確認できました

ところが、ところがです
この記事のタイトルの現象に気づいたのです
そこにファイルが間違いなく存在しているのに、なぜかExcel起動で読み込みが行われない

個人用マクロブックをダブルクリックで開いてあげると、VBAが実行できます

なので、もう一生こうして自動的に読み込まれていたファイルを手動で毎回起動しないといけないんだな、と半ば諦めかけていました
なぜならファイルが無くなっていなかったのでVBAコードが残っていた事に安堵していたからです
もうとにかく生きていてさえくれれば、それでええ…
そんな気持ちでした

ですが、ふと思い出しました
Google先生に聞いたら分かるんちゃうか、と

実際すぐに解決しました
とはいっても、画像のあるサイトが無かったので焦っていた時にはそのページを見ても
ちゃう、これが原因ちゃう
と、すぐに別のことを確認してしまっていました

結果無駄な時間を過ごすことになってしまいました

とにかく、ファイルが消失してなくて良かった~
VBA処理を作ったファイルはバックアップ取っていたけど、個人用マクロブックのバックアップは取っていませんでした
これを機に個人用マクロブックもバックアップを取るようにします
みなさんも個人用マクロブックを大切にして下さい

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

デバッグモードについて

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

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

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

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

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

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

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

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

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

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

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

「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システムの操作性向上でしたが、おかげ様で貢献できたのは本当に良かったです

ひと目でわかるPower Apps ローコードで作成するビジネスアプリ入門

書籍へのリンク
https://www.amazon.co.jp/dp/482225397X/

著者 奥田 理恵氏

VBAに関係ない本の紹介になってしまいますが、業務効率化を行っている上で非常に有用な書籍になりますので紹介しておきます
この書籍は、PowerAppsというアプリの解説書になります
これはOffice365等で利用可能なWebアプリになり、Web上でアプリ開発を行うことが出来るアプリです
Web上で開発出来ることから開発環境をPCに依存せず行うことが出来ます
作成したアプリはスマートフォンでも利用可能です
また、作成する方法もある程度Officeソフトを操作したことがある人なら多少は直感的に作成することが出来ます
関数とプロパティ・イベントを使用することでボタンをクリックすることで処理を実行することが出来ます
また同じくOfficeアプリのPowerAutomateとも連携させることが出来るので、そちらも利用することでより広い範囲の処理を行うことが出来ます
PowerAutomateに関しては、この書籍では多く解説を割いていないので別途勉強する必要はありますが、連携に関しては十分な解説があります
そして、何よりこの書籍の最大のおすすめ点が、2020年7月時点では唯一の解説書である点です
上記にあるように、Webアプリのため更新が行われていることもあり、以前の解説書などではすでに情報が古くなっており操作画面に相違があったり、また使用できる関数に関してもアップグレードが随時行われており、古い関数がサポート終了していっているものもあります
2020年7月より大幅な変更点がない限りは購入して問題ありません
関数の一覧が地味に役に立ちます

SQLの絵本 第2版 データベースが好きになる新しい9つの扉

書籍へのリンク
https://www.seshop.com/product/detail/21922

Accessデータベースを使いだした頃はWeb情報を参考にして、コピペなどで対応してきましたが、やはり基礎内容がはっきり理解していないため応用力に乏しく
なかなか思い通りにSQLを扱いきれていませんでした

そんな時にSQLの勉強をする必要性を感じて、最初は図書館でSQLの本を適当に数冊読んでみました
その中でも特に分かりやすく、また自分の求めているレベルの内容にベストマッチしたのがこの本でした

そして実際に購入して、この本を元に検証を行いながら処理を作成し始めました
SQLを極めたいわけではない自分にとって、それほど複雑なSQL文を作成する必要はありませんし、理解する必要もほぼありません
最低限の基礎内容を理解できれば手数は増えても思い通りの処理を作成できれば良いからです

そんな自分の欲求を見事に満たしてくれる、絵本という名の通りイラストによって分かりやすく解説が行われています
Accessが無い環境で実際のデータベースでテストが出来ない環境において、このイラストでイメージを分かりやすく伝えてもらえるのは、自分と同じ環境にある場合は重宝します

SQLの複雑な部分については特にそれほど記載は無いので、見本文を見ながらすぐに実践出来ます
この本を片手に構文作成しながら、着実に理解を進められます

ExcelVBAでAccessデータベースを操作するなら、この本にある内容を理解できれば十分です
まずはここから勉強してみてください

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