2択のメッセージを表示

MsgBox関数を使用して2択の条件分岐を行うコード。3種類あります

'「OK・キャンセル」ボタンで分岐
If MsgBox(Title:="実行確認", Prompt:="処理を実行します", Buttons:=vbOKCancel) = vbOK Then
'OKをクリックしたときの処理
Else
'×ボタンかキャンセルをクリックしたときの処理
End If
'「はい・いいえ」ボタンで分岐
If MsgBox(Title:="実行確認", Prompt:="処理を実行します", Buttons:=vbYesNo) = vbYes Then
'はいをクリックしたときの処理
Else
'いいえをクリックしたときの処理
End If
'「再試行・キャンセル」ボタンで分岐
If MsgBox(Title:="エラー発生", Prompt:="対象のフォルダが見つかりません", Buttons:=vbRetryCancel) = vbRetry Then
'再試行をクリックしたときの処理
Else
'×ボタンかキャンセルをクリックしたときの処理
End If

ユーザーに処理の選択をさせる場合に使用するのがメッセージのボタン分岐です
「MsgBox」関数引数「Buttons」の設定を行うことで表示されるボタンが指定できます

引数「Title」と「Prompt」はこちらの記事から

MsgBoxは関数なので戻り値を取得できます

選択肢の無いメッセージでは、引数を()でくくりませんでした
これは戻り値を取得するかどうかで変わるものです
()を使用すると戻り値を取得できるようになります

戻り値は、ユーザーのクリックしたボタンが何かを返す数値です
分岐なので、その戻り値をIfを使って条件分岐を行います
(Ifの分岐処理についてはこちら)

2択の中では3種類あります

OKキャンセルの2択のメッセージ
1つ目のコード実行時

1つ目は、OKボタンとキャンセルボタンの2つが表示されます
最もスタンダードなものとなりますので、ユーザーもクリックを迷いづらいです
×ボタンをクリックした場合は、キャンセルボタンをクリックしたものとみなされます
×ボタンも入れれば3択ですが実際はちゃんと2択になります

はいいいえの2択のメッセージ
2つ目のコード実行時

2つ目の、はいといいえに関しては、キャンセルボタンが無いためキャンセルの戻り値を返せません
そのため×ボタンが使用できない状態になっています(グレー表示となり無効状態)
どうしても×を押されるのが嫌な場合は、このボタン指定を行ってください

再試行キャンセルの2択のメッセージ
3つ目のコード実行時

3つ目は、1つ目と同じですが、ボタンの文字が再試行になっています
再試行なので、1度処理を実行した後に完了できない場合に使用するボタンですね
このメッセージで処理が停止している間にフォルダを作成するなどして、処理を再試行することが可能になります

条件分岐のための、Ifの条件式の右辺に戻り値の定数を指定します
定数は指定したボタン名を入れればいいだけですね
なので、1つ目のコードでOKではなくキャンセルを条件としたい場合は「MsgBox( ~~ ) = vbCancel」という定数を指定すれば可能です

処理時間の長い処理などの実行前には必ずこのコードで実行確認を行いましょう
間違って処理開始ボタンを押してしまう可能性も考慮してあげましょう

アイコン付きのメッセージを表示

MsgBox関数で本文範囲にアイコン表示を行う方法

警告アイコンのメッセージ
警告表示
'警告メッセージを表示する
MsgBox Prompt:="警告です", Buttons:=vbCritical
注意アイコンのメッセージ
注意表示
'注意メッセージを表示する
MsgBox Prompt:="注意です", Buttons:=vbExclamation
確認アイコンのメッセージ
確認表示
'確認メッセージを表示する
MsgBox Prompt:="確認です", Buttons:=vbQuestion
情報アイコンのメッセージ
情報表示
'情報メッセージを表示する
MsgBox Prompt:="情報です", Buttons:=vbInformation

「MsgBox」関数でメッセージボックスを表示する際に文字列のみの情報だと、ユーザーがかるく流してしまうことがあります
(MsgBoxの基本利用はこちら)

処理の重要な点での分岐や処理前後の作業などでちゃんと読んでほしい
そんな時に使用するのが、アイコン表示です

引数「Buttons」の指定を行うことで任意のアイコンを表示できます

本文の左側に各アイコンが表示されます
アイコンの画像に関しては、例コードの左側にある画像を確認してください

また、警告と注意に関しては警報音もなりますのでよりユーザーに注意を促すことができますので耳障りで無い程度に使用してください

確認と情報のメッセージはあると丁寧にみえますが、重要度はあまり無いと思います

メッセージを表示する

本文とタイトルのあるメッセージを表示するコード。本文だけの簡易法もあります

'メッセージを表示する
MsgBox Title:="タイトル", Prompt:="本文内容"
'本文だけのメッセージを表示する
MsgBox "本文内容"
タイトルと本文のみのMsgBox
1つ目のコード実行時

メッセージを表示するには「MsgBox」関数を使用します

引数「Title」はメッセージボックスのタイトル部分に表示される文字列です
×ボタンの隣の範囲に表示されます
省略可能で、省略した場合は「Microsoft Excel」と表示されます
空白の指定は可能です

引数「Prompt」が、メッセージボックスの本文内容です
省略不可の引数となっていますが、空白は指定可能です
その場合は「Prompt:=””」と指定します

2つ目の例コードでは引数の指定を省略した書式になります
こちらでは引数を既定の順番に入力する必要がありますので、1番目の引数が本文内容になるので本文だけの最も簡易的なメッセージを表示する場合はこちらを使用してください

またこのメッセージが表示されている間はプログラムの実行は一時停止します

OKボタンか×ボタンによりメッセージが閉じられた時点でプログラムが再開しますので、処理時間の計測や他のアプリケーションを使用している場合は他の操作が行われないように注意してください

セルを削除する

Deleteメソッドを使用して削除を実行し、その後の動きも解説

'アクティブセルを削除して上詰め
ActiveCell.Delete xlShiftUp
'アクティブセルを削除して左詰め
ActiveCell.Delete xlShiftToLeft

セルを削除するには「Delete」を使用します

セルの削除の動き
Deleteを実行した、それぞれの動き

セルを削除した場合に、そのアドレス範囲は既存のセルが詰められてきます
その詰める動きを引数で指定します

このコードは引数は1つしかありません
また選択肢も2つのみで上詰めか左詰めです

これはワークシートの特性上、0行目が下に移動して1行目になる
というような動きは存在しないため、大きいほうから小さいほうへ移動します

削除のセル範囲を広げれば、それだけ一括で削除可能です
ただ、VBAの操作は元に戻せませんので削除は確認してから実行してください

空白行・列の挿入

値も書式設定も全くない、まっさらな行と列をそれぞれ挿入するコード

'アクティブセル行に空白行を挿入
ActiveCell.EntireRow.Insert
ActiveCell.EntireRow.Clear
'アクティブセル列に空白列を挿入
ActiveCell.EntireColumn.Insert
ActiveCell.EntireColumn.Clear
空白の行と列を挿入する動き
空白の行と列を挿入する動き

空白の行と列を挿入をするには「Insert」を使用します

空白セルの挿入と同じコードを使用します
(空白セルの挿入に関する記事はこちら)

ですがこちらでは引数の指定は必要ないと思います
この引数は指定された範囲で自動的に移動の方向が決定しますが、行を指定したら行になりますし、列なら列が指定されます
なのであえて指定する必要も無い訳です

また、上や左に移動という概念自体ワークシートには存在しません
1行目が上に移動して0行目になることが無いからです

ですが逆は存在しますので、データの存在する行や列があふれてしまう場合もありえます
最終列にデータが入っている場合に列の挿入を行うタイミングです

これはこの際にちゃんと実行の確認メッセージがでるのでデータの消失は防ぐことは出来ると思いますが、処理作成上でそんなことが起きないように注意しましょう

例のコードではアクティブセルのある行と列が指定されて挿入されています
(「EntireRow」と「EntireColumn」についてはこちら)

「Clear」を使用するのは書式をクリアするためです、詳しくは上記の空白セルの挿入記事から確認してください

空白セルの挿入

値も書式設定も全くない、まっさらなセルを挿入するコード

'アクティブセルに空白セルを挿入(既存は下へ)
ActiveCell.Insert Shift:=xlDown
ActiveCell.Clear
'範囲選択したセルに空白セルを挿入(既存は左へ)
Selection.Insert Shift:=xlToRight
Selection.Clear

空白のセルを挿入するには「Insert」を使用します

空白セルの挿入の動き
挿入したときの動き

このコードは実行される前にコピーデータがあるとそのデータが貼り付けれらま
Copyメソッドによる場合は、値も貼り付けられます

「Shift」の設定により既存のセルの移動方向が決定します
こちらに関してはこちらの記事へ

コピーデータが無ければ引数の設定によって上下左右のいずれかのセルの書式が挿入されるセルに反映されます

今回のコードでは、挿入後にセルはクリアされるためコピー元の設定は全く関係ありません

1つ目はアクティブセルにセルを挿入しますが、既存のセルは下方向に移動します

2つ目では選択範囲に対して空白のセルを挿入しますが、選択している範囲と同じセル範囲が挿入されるので、複数のセルを挿入したい場合は範囲選択をしてから挿入を実行してください

また2つとも同じですが、挿入後に「Clear」メソッドを実行しています

これは「Insert」自体がコピーするのが前提のコードのため、空白のセルが必要な場合は空白にする処理が必要になります、それがこのコードです

リファレンスでは、書式のみをクリアするメソッドを使用していますが上記にもあるようにコピーされている状態だと値も入ってしまうので、このコードでいいと思います

表示形式など残しておきたい場合はこのClearメソッドは必要ありません

切り取りしたセルの挿入

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つのセルに入力する処理をセルの個数分行う必要があります

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

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

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