切り取りしたセルの挿入

Cutを実行したセルを指定のセルに上書きではなく挿入を行うコード

'選択中セルに挿入する(選択中セルを下に移動)
Range("A1").Cut
Selection.Insert Shift:=xlDown
'選択中セルに挿入する(選択中セルを右に移動)
Range("A1").Cut
Selection.Insert Shift:=xlToRight

セルを切り取り後、上書き貼り付けではなく挿入貼り付けをするには「Insert」を使用します
セルの切り取りのコード解説はこちら

セルのカットペースト挿入の下方向への動き
下方向に移動させて挿入
セルのカットペースト挿入の右方向への動き
右方向に移動させて挿入

引数の「Shift」で元のセルの移動先を指定できます

省略した場合は自動的に判断されるので、省略可能ですが基本は指定してあげたほうが分かりやすいと思います
挿入はワークシートの特性上、移動先は下か右しかありません

上や左は1行目1列目の移動が0方向には指定できないためです

またこのコードはCutを使用せずに使用した場合、空白セルが挿入されます
同じコードですが使う場面がまったく違うので注意が必要です

セルを切り取りして貼り付け

Cutステートメントを使用して貼り付けまで行うコードを2種類解説

'指定セルのコピーを直接貼り付けする
Range("A1").Cut Range("A3")
'切り取り先の選択
Range("A2").Select
'選択セルをクリップボードにコピー
Selection.Cut
'貼り付け先の選択
Range("A5:A6").Select
'コピーデータを貼り付ける
ActiveSheet.Paste
セルの切り取り貼り付けのコードの動き
切り取り貼り付け操作の動き

セルの切り取りは「Cut」を使用します

「Copy」と同様に引数に移動先のセルアドレスを指定すると、その位置に切り取ったセルデータを移動します
(Copyメソッドはこちらから)
引数を省略すると、クリップボードにデータは貼り付けられます

基本的には1つ目の1行コードで実行してもらえばいいです

なお、切り取りを実行するセル範囲は連続している必要があり、複数の選択範囲になっているとエラーが発生します

2つ目の例コードはマクロの記録に出てくるコードで、実際のExcelでの操作の動きになるのでイメージがしやすく作りやすいかもしれません
可読性を上げるために、こちらをあえて使用するのもいいと思います

切り取るセルを切り取ってから、貼り付けしたいセルを選択してその範囲に貼り付けを実行します
切り取りは、元のセルが移動する形になるので全ての情報が貼り付けされます
なお、コピーと違って元のセルがクリアされる形になるので「Copy」で使用した最後のコピーモードを終了する構文は必要ありません(貼り付け実行時に点線が消える)

2つ目の例コードで貼り付け先が範囲選択になっていますが、実際に貼り付けられるデータは1セル分です

これは切り取ったセル自体が貼り付けられるので、1セルの切り取りをしている状態であれば貼り付けられるのも1セル分になるためです

もし、切り取るセルを複数の範囲に貼り付けたい場合はCopyを使用してデータを範囲に貼り付けてから、元のセルをClearで消去するような処理を組んでください

セルをコピーして貼り付け

Copyメソッドを使用して貼り付けまで実行するコードは2通りあります

'指定セルのコピーを直接貼り付けする
Range("A1").Copy Range("A2")
'選択セルをクリップボードにコピー
Selection.Copy
'B1を選択する(貼り付け先)
Range("A3:A6").Select
'コピーデータを貼り付ける
ActiveSheet.Paste
'コピーモードを終了する(点線が消える)
Application.CutCopyMode = False
セルのコピー貼り付けのコードの動き
セルのコピー貼り付けのコードの動き

セルのコピーと貼り付けには「Copy」を使用します

引数に貼り付け先のアドレスを指定することが出来ますので、ここを指定するとコピーと同時に貼り付けを行うことが出来ます
この引数は省略可能で、省略した場合はクリップボードにデータが貼り付けられます

なお、画像の動きではスクショを撮るためにクリップボードを使用しているせいで、コピー対象先の点線の枠線が表示されていませんが実際にコードを実行すると表示され最後に消えます

通常のコピペ操作は1つ目の1行で実行すればいいです、クリップボードも経由しないのでこちらのほうが処理が速くてコピーモードの操作も必要ないからです

2つ目のコードはマクロの記録の際に出てくるコードです
実際こちらのほうが、Excelの操作と同じ手順にコードを実行していくのでイメージがしやすく作りやすい可能性もありますので、あえてこちらを使うのもいいと思います、可読性は処理速度並みに重要です

省略した「Copy」メソッドを実行するとコピーモードに入ります、コピー部分が点線に囲まれる状態です

次にデータを貼り付ける先を選択状態にします、1つ目でも同じですがここで範囲選択をしておくと、その範囲すべてに貼り付けが実行されます

選択したセルからコピーしたデータを貼り付けます
コピーが終わったら、コピーモードを終了します(コピー状態の点枠線が消える)

このコピーはセルのコピーなので値だけでなく書式も含めてコピーされます
また数式の場合は、通常のコピー同様に引数がセルなら更新されます

なお、この「ActiveSheet.Paste」は、対象オブジェクトがRangeではなくSheetに対して行っています
これはセルのみではなく図形や画像などのオブジェクトに対しても行う貼り付けとなっているためです
なので、Rangeオブジェクトに対して貼り付けの操作は実行できません

最後の「Application.CutCopyMode = False」は無くても問題ありませんが、そのままだとセルをEnterキーで貼り付けされてしまうし、点線が残ったままなのも少し気持ち悪いです
なので、セルのコピーはここまでをセットに行います

セルにデータを入力

セルにデータを入力する基本的な処理のコード

'A1セルに100を入力
Range("A1").Value = 100
'アクティブセルに100を入力
ActiveCell = 100
'選択中のセル全てに100を入力
Selection = 100
セルにデータの入力の動き
入力コードの動き

セルにデータを入力するには、セル範囲のオブジェクトに対して代入します
基本的には「.Value」プロパティに値を代入します

ただ、「.Value」は省略可能なので2つ目以降は省略していますが値の代入は通常通り行えます。また入力データは文字列や日付データでも同じ方法で問題ありません

2つ目では、アクティブセルへの入力となります
このコードを使えばアクティブセルを移動させながら、データの入力を行っていくことができます

「Selection」は選択範囲のセル全てを対象にしますので、このコードで一括で選択範囲全てに同じ値を入力できます

一括入力のすすめ

今後VBAを使っていく上でも重要な話として、この一括入力があります

一括入力は例コードの3つ目のように1つのコードで複数の要素にデータを入力することです

この様に一括入力を行わなくてもループ処理ですべてのセルに入力させることはできます
ただ、その場合1つのセルに入力する処理をセルの個数分行う必要があります

そして処理速度に大きな影響を与えるのもこの入力処理になります

そこで重要なのがこの一括入力処理になります
これを行うと入力処理が単純にセルの入力個数倍数速くなるわけです
しかもいちいち入力内容の描画を行わないため、描画速度の面でも圧倒的に優位になるのでこの一括入力を意識的に行うようにしていってください

最終的な形は配列で一括入力です

重複する範囲を選択

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」を条件に判定することで任意のセル範囲が指定セル範囲内に含まれているかを調べることができます
その方法は以下の記事で解説しています

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

指定セルの存在する行列を動的に選択するコード(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ずつ検証していくより速くなるのでセルの選択は工夫してみてください