日付型の変数宣言

日付・時刻データを扱う際にはDate型を使用します

'日付型変数の宣言
Dim 日付変数 As Date

日付型の変数は「Date型」を使用します
日付型なので、時刻までのデータが収まるようになっています

日付データは、Excelでは内部数値で処理されています
整数部分が年月日で、小数点以下が時刻データです

独特のデータ形式なので数値型の変数での使用はしませんが、日数の計算などではLong型を使用したりもするので、最終的な出力形式が日付であればこの型を宣言してください
また、この型指定を行って代入すれば日付データと数値データの変換がいらないのも利点とおもいます

少数点数値の変数宣言

小数点を含む実数値にはDouble型を使用します

'小数点値を含む変数の宣言
Dim 小数点変数 As Double

小数点以下の数値も扱う場合は、「Double型(倍精度浮動小数点数型変数)」を使用します

漢字にするとよく分かりにくいですが、小数点以下の数値を扱うものと思ってください

同じように小数点値を扱える「Single型」もありますが、なんとなく英単語的に分かると思いますが、Single型はDouble型よりも扱える数値の幅が小さくなっていますので、使用メモリもその分小さくなります

ですが、小数点以下を扱う際は割り切れない数値であったりすることや
精度の観点でも、Double型使用の一択で問題ありません
また関数の戻り値がSingle型の物もありますが計算結果がその範囲外も出てくるのでその関数の代入変数もDouble型を使用してください

長整数型の変数宣言

整数値変数はLong型を使用します

'長整数型の変数の宣言
Dim zz整数変数 As Long

処理中でも使用頻度の高い変数が整数型です
整数型の変数は「Long」型を使用します
整数なので小数点以下は切り捨てられます

整数値を扱う際は基本的のこの型を使用します
「オーバーフローしました」とメッセージが出た場合は範囲外となります
正と負の数値21億程ですね
21億まで対応できますが、逆に1桁の数値でも使用します

整数型にはこの範囲の下のInteger型があります
当然範囲がLong型より狭い分メモリの使用量も少なくなっています
しかし、現在のExcelVBAでは内部的にはLong型で計算が行われておりInteger型を宣言して計算しても同様です

つまり、上記の変換が内部的に行われている状態になりますのでInteger型を使用する意味が無くなってしまいます
この変換が無駄な動きになってしまう可能性があるので整数値を使用する場合はLong型を使用してもらえれば問題ありません

また、Long型でオーバーフローした場合はそれ以上の整数型は「LongLong型」になりますが、これはExcel(Windowsではない)が64Bit環境のみ使用可能な型です
なので基本的にはCurrency型を使用してください
以下の記事で解説を行っています

重複する範囲を選択

Intersectプロパティで指定範囲の交差する範囲だけを選択する

'重複する範囲を選択する
Intersect(Range("A1:C3"), Range("B2:D5")).Select

複数のセル範囲が重複する部分を取り出すには「Intersect」メソッドを使用します

重複する範囲を選択する動き
Intersect(Range(“A1:C3”), Range(“B2:D5”)).Selectの動き

Intersectメソッドは引数内のセル範囲で重なった部分のみを指定します

ようは、どちらの引数にも含まれている範囲となります
引数の範囲指定は30個指定でき、2つまでは必須です
重複する部分を取り出すメソッドなので、最低2つのセル範囲が必要です

引数のセル範囲に重複する範囲が無い場合は「Nothing」を返します

Selectionメソッドを使用して、複数回に範囲選択を分けるのもいいと思います
ただ、重複しない場合の「Nothing」でSelectメソッドを実行すると実行時エラーが発生するので注意が必要です

指定行のリストデータの入力時に便利なプロパティです
その使用方法の解説は以下の記事で行っています

また、重複しない場合の「Nothing」を条件に判定することで任意のセル範囲が指定セル範囲内に含まれているかを調べることができます
その方法は以下の記事で解説しています

アクティブ行の指定列に入力

ActiveCellのある行の指定列のセルを指定するコード。IntersectメソッドとRangeオブジェクトによる指定方法

'アクティブセルのある行のB~D列を選択
Intersect(ActiveCell.EntireRow, Range("B:D")).Select
'アクティブセルのある行のA列を選択
Range("A" & ActiveCell.Row).Select

ActiveCellや指定のセルの行にある列を指定するには、2通りの方法があります

1つ目はIntersectメソッドを使用して、行全体と指定列を重複させて取得する方法です
2つ目はRangeオブジェクトの引数に列文字列を指定して、指定セルの行数数値を取得して指定する方法です

使い分けとしては、複数列を指定する場合はIntersectメソッド
単一セルを指定する場合はRangeオブジェクトを使用する方法を使います

とはいえ、どちらでもどちらの指定方法は可能です
ただ、Rangeオブジェクトの方で複数列を指定する場合は少しコードが煩雑になるので、Intersectメソッドの方が簡潔に記載できます

コード解説

ActiveCellのある行の指定列セルの選択
ActiveCellの行の列セル選択

画像の様に、ActiveCellがどの列にあってもその行の指定列を指定することが出来ます

Intersect(ActiveCell.EntireRow, Range("B:D")).Select

こちらでは複数列の範囲指定を行う際に便利な方法です

この例ではB~D列のセルを範囲選択しています
Intersectメソッドを使用しているので、行全体と列全体を引数に指定することで重複する範囲を取得しています

表にデータを追加したときなどに、罫線などの書式設定を一括で行う際によく使用します

Range("A" & ActiveCell.Row).Select

こちらは単体のセルを指定するのに便利な方法です

アクティブ行の指定列の単体セルを簡単に指定できるので、値の入力を行う際に使用します

Range("B" & ActiveCell.Row & ":D" & ActiveCell.Row).Select

なお、Rangeオブジェクトで複数列範囲のセルを指定するには以上のようなコードになります
やはり、煩雑なコードになるのでIntersectメソッドの方が見やすいですね

この2つを駆使すれば、表にデータを追加して書式設定も整えていく処理が相対的に行えるので、使用頻度が結構高いコードです

指定セルを含む行・列の選択

指定セルの存在する行列を動的に選択するコード(Entireプロパティ)

'アクティブセルのある行を選択
ActiveCell.EntireRow.Select
'アクティブセルのある列を選択
ActiveCell.EntireColumn.Select
アクティブセルのある行を選択する動き
ActiveCell.EntireRow.Select実行時の動き

任意のセルのある行を指定するには 「EntireRow」 を使用します
このコードの前にあるセル範囲を含んでいる行が指定されます

アクティブセルのある列を選択する動き
ActiveCell.EntireColumn.Select実行時の動き

同じように列を指定する場合は「 EntireColumn 」を使用します
これも指定のセル範囲を含む列が指定されます

また範囲選択の動きの特徴である、実行後はアクティブセルが範囲の左上に移動します
この特徴を利用すれば、アクティブセルがどの位置にあってもこのコードで1行目もしくは1列目に移動させることが出来ます
「Intersect」 を使用したほうが分かり易く柔軟ですが、ただ単に1行・1列目にアクティブセルを持って来るだけならこれでもいいと思います
なお、これと上記の「Intersect」を併用するとすさまじく便利なセルの指定範囲が行えます

選択範囲を追加する

すでにある範囲選択を解除せずに範囲選択を追加する(Unionプロパティ)

'選択範囲にA1セルを追加する
Application.Union(Selection, Range("A1")).Select
Unionで範囲追加した動き
C1からB2の範囲選択後にコードを実行したときの動き

セルの選択範囲を後から追加するには「Union」を使用します
ようは、Ctrlキーを押しながらセル選択をする操作の事です

最初から分かっていればRangeで指定すればいいだけですが、処理中に更新されたセル範囲をそれまでの範囲を解除せずに追加する際に使用します
計算式が大量に入っていたりして、入力処理に時間がかかるのでまとめて一括入力するのにも使えます
例ではC1からB2への範囲選択をしてから実行しています
これはアクティブセルの動きに注意してほしいからです
通常範囲選択を行うと、アクティブセルは範囲の左上に移動すると解説しましたが、画像では左上のA1ではなくB2にアクティブセルが移動しています
これはUnionの1番目の引数の範囲の左上が指定されるためです

Unionで範囲追加した動きの注意するセルの動き
「Application.Union(Range(“A1”), Selection).Select」を実行したときの動き

同じセル範囲選択をしてから、今度は引数の順番を入れ替えて実行してみます
すると今度はアクティブセルがA1に移動しています
1番目の引数の範囲の左上はA1になっているからです

この様に範囲選択はアクティブセルのがどう動くのかをしっかり監視しながら処理を作ります
アクティブセルというのはそのシートで唯一で固有のものなので、それをいかにうまく制御するかがセル範囲選択における重要点です

アクティブセルから指定セルまで範囲選択

アクティブセルから指定セルまでの動的な範囲選択をするコード

'アクティブセルからA1セルまで範囲選択
Range(ActiveCell, "A1").Select
アクティブセルからA1セルまでの範囲選択の動き
C3からRange(ActiveCell, “A1”).Select実行時の動き

指定のセルをアクティブセルにしてから、そこから指定のセルアドレスまでを範囲選択するにはRangeの引数を「ActiveCell, “指定のセルアドレス”」とします

1つ目の引数はアクティブセルなのでc3の白くなっているセルです
ここから2つ目の引数を指定します、指定のアドレスに変更して使用します
また引数の順番は入れ替えても使用できます
引数は2つまでしか指定できませんが、Rangeをネストさせることは可能なので比較的自由に範囲指定できます

例えばデータベースの表を作成していく処理でデータの入力を行った後に、表に罫線を引く際に指定する範囲選択として使用できます
データの入力を行っていく以上、最終セルは可変なのでアクティブセルとします
表の見出しは固定なのでそこを2つ目の引数に設定すれば、データが追加入力されても常に見出しまで全体選択できるので、そこで設定するといった使い方をします

また画像の動きでも分かるようにアクティブセルは範囲選択されると左上に来るので、コード実行後ではアクティブセルが移動している点にも注意が必要です

選択セルを瞬時に移動する

Endプロパティを使用して指定方向にセル指定を一気に移動するコード

'下方向に瞬時に移動
Selection.End(xlDown).Select
'右方向に瞬時に移動
Selection.End(xlToRight).Select
'上方向に瞬時に移動
Selection.End(xlUp).Select
'左方向に瞬時に移動
Selection.End(xlToLeft).Select
Endコードの上下左右の動き
例コードを順番に実行した動き

セルをオフセットではなく、瞬時に移動するには「End」を使用します
この構文は自動的に範囲の端を判定するので動きをしっかり理解して使用してください
画像では下右上左の順に移動を行っています
赤枠内のセルのアドレスの動きを確認してください

この動きは、「Ctrl+矢印キー」で移動したときと同じ動きをします
データと空白セルの境をいっきに移動する形になります
データ入力の際に最終行を選択する際によく使われます
一気に移動するので、Offsetで1セルずつ移動するよりはるかに高速です

セル選択を左右に移動する

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

'アクティブセルを1つ右のセルに移動します
ActiveCell.Offset(0, 1).Select
'アクティブセルを3つ右のセルに移動します
ActiveCell.Offset(0, 3).Select
'アクティブセルを1つ左のセルに移動します
ActiveCell.Offset(0, -1).Select
アクティブセルの右方向への動き
ActiveCell.Offset(0, 1).Selectの動き

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

アクティブセルの右方向への大きな動き
ActiveCell.Offset(0, 3).Selectの動き

引数の数値を変更すれば大きく一気にセルを移動させることが出来ます

アクティブセルの左方向への動き
ActiveCell.Offset(0, -1).Selectの動き

また、数値をマイナスにすると左方向に進みます。D1がアクティブだった場合は、C1がアクティブセルになります
こちらも数値をマイナス方向に大きくすれば大きく移動できます

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

セルのA1から「ActiveCell.Offset(0, -1).Select」を実行すると画像のような実行時エラーが発生します
実行時エラーなので実行されないとエラーが発生しないので、Offsetをコードで使用する際はしっかりと処理終了までの動作テストは行いましょう
これは存在しないセルへの参照が行われた時点で発生します、当然最大列数を超える数値の参照も同じエラーが発生します

なおこの移動処理は、1ずつ移動させるより大きな数値で一気に移動させたほうが処理速度が圧倒的に向上します
ループ処理などで変数に移動する数値を計算してから、移動させるほうが1ずつ検証していくより速くなるのでセルの選択は工夫してみてください