セル選択を上下に移動する

Offsetを使用して、対象セルを上下に指定数値分移動させるコード

'アクティブセルを1つ下のセルに移動します
ActiveCell.Offset(1, 0).Select
'アクティブセルを100下のセルに移動します
ActiveCell.Offset(100, 0).Select
'アクティブセルを1つ上のセルに移動します
ActiveCell.Offset(-1, 0).Select
アクティブセルの下移動の動き
ActiveCell.Offset(1, 0).Select実行時

ワークシートに常に1つあるアクティブセルを1つ下に移動します
A1がアクティブであった場合は、A2がアクティブセルになります
どれだけ下方向に移動するかは、数値を変更すれば可能です

アクティブセルの下移動の大きな動き
ActiveCell.Offset(100, 0).Select実行時

数値を100とすれば、一気に100行分下に移動することが可能です

アクティブセルの上移動の動き
ActiveCell.Offset(-1, 0).Select実行時

また、数値をマイナスにすると上方向に進みます
A101がアクティブだった場合は、A100がアクティブセルになります
もちろんこちらも数値を大きくすればそれだけ移動行数も大きくなります

アクティブセルの上移動時のエラー発生

ただ、数値を大きくしすぎたりしてセルの存在しない方向への移動を行おうとするとエラーが発生します
A1から「ActiveCell.Offset(-1, 0).Select」を実行すると画像のエラーメッセージが表示されます
これは移動だけでなく、参照だけでエラーになるので入力やプロパティの取得などでも同様のエラーが発生しますのでOffset使用時はその数値が範囲を超えないかを注意して使用します

おすすめ書籍

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

実際に購入して愛読している書籍を紹介していきます
順番に意図はありませんので、気になった書籍はリンクから確認してみてください
アフィリエイトではありませんし、今後するつもりも無いので本当に実際に読み続けていかに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データベースを操作するなら、この本にある内容を理解できれば十分です
まずはここから勉強してみてください

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

全てのセルを選択する

Selectメソッドを使用してワークシートの全体を範囲選択するコード

'ワークシートのセル全体を選択
Cells.Select
全てのセルを選択した状態

アクティブシート(表示されているシート)のセル全体を選択状態にします
このセル全体選択は、RangeではなくCellsというオブジェクトに対して行います
Rangeで全体選択は不可ではありませんが、無駄な使い方でややこしいので、ここではCellsを使ったほうが楽です

固定番地と相対番地

RangeとCellsはどちらも同じセルを扱うオブジェクトです
ですが、使い分けとしての考え方はRangeは固定番地を扱う場合
Cellsは相対番地を扱う場合に分けてもらうといいです

固定番地は、定まって動かない番地指定です
A1やB5などがそうです、これは動くことはありません
対して相対番地は、前に来るオブジェクトからの参照になります
例えば、「Range(”A1″)」と「Cells(1,1)」は同じ場所を指定しています
固定番地はいいとして、相対番地の場合の考え方はCellsがワークシート全てのセルと解説しました。
アクティブシートの全セル範囲の中で1行目1列目のセルという考え方です
アクティブシートは省略されているので、もともとは「ActiveSheet.Cells(1, 1)」が 「Cells(1,1)」 が同じ意味になります

全てのセルに対してのCells範囲

画像のような位置関係になります
A1が1,1でB2は2,2になっています
これはCellsの対象がこの範囲なので固定番地との差が分かりにくいかもしれません

選択範囲に対してのCells範囲

そこで対象範囲を変更してみます
この画像での対象範囲は「Selection.Cells(1, 1)」とします
上の範囲のCellsの位置数値と全く同じ個所が、別の固定番地に変わっています
Cells(1, 1) がA1だったのに対し、 Cells(1, 1) がC6に変わります
これが相対番地の考え方になります

この指定範囲でのセル番地指定はRangeでは当然行えないので、この場合にCellsを使用する必要があります
このRangeとCellsの使い分けがしっかり頭の中で行えるようになったら、セル指定に迷うことは無くなると思います

初心者のうちは、なんとなく小難しいので使い分けは基本はRangeで、全セル選択はCellsを使うって感じでええかな

離れた行・列を選択する

Selectメソッドを使用してワークシートの離れた行列を選択するコード

'ワークシートの1行目と3行目から5行目を選択
Range("1:1, 3:5").Select
'ワークシートのA列とC列からE列を選択
Range("A:A, C:E").Select
離れた行の範囲選択状態
Range(“1:1, 3:5”).Select実行時

アクティブシート(表示されているシート)の1行目と3行目から5行目を選択状態にします
「,」で区切れば、範囲選択を増やせます

離れた列の範囲選択状態
Range(“A:A, C:E”).Select実行時

列の範囲選択も同じように「,」で区切ることで指定範囲を増やしていくことができます
「,」で範囲の数を増やして、「:」で連続した範囲を指定することで自由に範囲選択を行えます

行を(範囲)選択する

Selectメソッドを使用してワークシートの行を選択するコード

'ワークシートの1行目を選択
Range("1:1").Select
'ワークシートの1~5行目を選択
Range("1:5").Select
1行目の選択状態
Range(“1:1”).Select実行時

アクティブシート(表示されているシート)の1行目を選択状態にします
引数は数字で指定を行います
数字(文字列)なので注意してください
「Range(1)」と数値として指定するとエラーになります
また結果としてセルの範囲選択となるので、1行であっても「1:1」と入力します

1行目から5行目までの選択状態
Range(“1:5”).Select実行時

複数範囲の行を選択する場合は「:」で開始と終了の行数を指定することで可能です
コードでは5行目までの範囲選択を行っています

列を(範囲)選択する

Selectメソッドを使用してワークシートの列を選択するコード

'ワークシートのA列を選択
Range("A:A").Select
'ワークシートのAからC列を選択
Range("A:C").Select
A列のみの選択状態
Range(“A:A”).Select実行時

アクティブシート(表示されているシート)のA列を選択状態にします
列の指定には、引数内のアルファベットを変更すれば指定列の選択ができます
また結果としてはセルの範囲選択が行われている状態なので、「A:A」と単独列であっても範囲選択のように「:」で接続して指定する必要があります
「Range(“A”)」とするとエラーになります

AからC列までの選択状態
Range(“A:C”).Select実行時

引数内のアルファベットを別の列で指定すると、範囲指定になります
コードではA列からC列の3列の範囲選択が行われています

Excel2007以降のワークシートなら指定アルファベットが3文字もあるので大変ですね

離れたセルを選択する

Selectメソッドを使用して連続していないセル選択をするコード

'ワークシートの連続していないセル範囲を選択
Range("A1,B3,C5").Select
離れたセルの選択状態

アクティブシート(表示されているシート)の連続していないセル範囲を選択状態にします
A1とB3とC5の3つのセルだけが選択範囲になります
引数のセルアドレスを「,」で区切ることで別の範囲として離れたセルの選択が可能になります

'ワークシートの連続していないセル範囲を選択
Range("A1,B3:C5").Select
離れたセルの範囲選択も可能になった状態

「,」で区切ることによって別の範囲となると解説したように、2つ目の「,」を「:」に変更することによって、B3からC5という範囲選択に変更することも可能です
ここでも左上の白いセルが存在し、これがアクティブセルになります

セルを範囲選択する

Selectメソッドを使用してセル範囲選択をするコード

'ワークシートの指定のセル範囲を選択
Range("A1:C5").Select
Range範囲選択時の実行結果

アクティブシート(表示されているシート)の指定のA1からC5までを選択状態にします
引数内のセル範囲は「”開始セル:終了セル”」の書式で指定します
開始から終了までの全てのセルが選択状態になります

また、このコードを実行すると左上のセルが白くなります
これはアクティブセルという常に単一のセルです
このアクティブセルと選択範囲はそれぞれ別に取得可能です

1つのセルを選択する

Selectメソッドを使用して、単一のセルを選択状態にするコード

'アクティブシートのA1セルを選択
Range("A1").Select
'アクティブシートのA1セルを選択
Range("A1").Activate
RangeSelectの動作説明
RangeSelect使用時の動き
Range("A1").Select

アクティブシート(表示されているシート)のA1セルを選択します
コード中のA1を任意のセルアドレスに変更すれば、そのセルだけが選択状態になります
このコードの前に、別のセルが選択されていたり、範囲選択がされていた場合はその範囲選択は解除されて、このA1セルだけが選択状態になります

RangeActivateの動作説明
RangeActivate使用時の動き
Range("A1").Activate

こちらは、マクロの記録の自動作成時にセルの選択時にでてくるメソッドです
Activateはアクティブセルのみを選択するコードのため、画像のように選択先が選択範囲内の場合は範囲選択が解除されずコードが実行されます
この点がSelectと大きく違う点になりますので、基本的にはセル選択はSelectを使用してください
Activateを使用する際は、この動きをしっかり頭に入れておきましょう

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

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

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

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

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

コンパイルエラーなので、プロシージャの実行前に発生します
ここで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の言語仕様です、開発者は言語仕様を使い切ってください
それがこの言語を作ってくれた人への最大限のリスペクトです

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

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