名前定義の作成・変更(ブック範囲)

Nameプロパティは、セルの名前定義を作成・変更するプロパティです。アクティブシートとそれ以外の指定コード

'アクティブシートの範囲を名前定義
Selection.Name = "作成名前定義1"

↑アクティブシートの場合

'別シートの範囲を名前定義
Worksheets("Sheet1").Range("A1:C5").Name = "作成名前定義1"

↑アクティブ以外のシートの場合

ブック範囲で名前定義を作成変更するには「Name」プロパティを使用します
名前のものが無ければ新規作成され、あれば指定のアドレスが更新されます

コード解説

「Selection.Name = “作成名前定義1”」
SelectionのNameプロパティを設定します
このコードを使用すると、選択範囲をブック範囲指定で名前定義を行います
アクティブシートの選択範囲を指定しています

こちらでは、引数は無く選択範囲とブック指定が固定になるので選択範囲が決まっていれば使用可能なので名前定義で一番簡単に作成が出来るコードです

「Worksheets(“Sheet1”).Range(“A1:C5”).Name = “作成名前定義1”」
Selectionをシートとセル範囲を固定で指定することで、1つ目ではできないアクティブシート以外のシートを指定することが出来ます
アクティブシート以外の別シートを指定する場合にはこちらを使用します

どちらのコードも名前定義のセル範囲を変更できますが、適用範囲はブック以外の指定は行いません
ブック指定とすることで、コードが簡略にできるので適用範囲を気にしない場合の名前定義はこのブック範囲で構いません

行高・列幅の自動調整

AutoFitメソッドにより、行と列のサイズを自動調整するコード、特定のセルでの列幅自動調整コード

'選択された行高を自動調整する
Selection.EntireRow.AutoFit
'選択された列幅を自動調整する
Selection.EntireColumn.AutoFit
'全ての行列の幅を自動調整する
Cells.EntireRow.AutoFit
Cells.EntireColumn.AutoFit

行高列幅の自動調整には「AutoFit」メソッドを使用します

このメソッドは指定したセル範囲から行か列か自動的に判断して自動調整を行います
対象には行か列を指定する必要があるため、「Range(“A:A”)」と列の指定を行っても構いませんが、列や行でしか実行できないメソッドなので対象を確実に行列にするために「EntireColumn」か「EntireRow」を使用して対象を指定します
この2つのプロパティに関してはこちらで確認してください

また、行列の判定を自動的に行うという性質から両方を同時に指定することが出来ません
シート全体の行と列両方を自動調整する場合は、行と列をそれぞれ自動調整する必要があります
シート全体を指定するので、ここでは「Cells」に対する行列の指定を行っています

特定のセルだけを対象に列幅の自動調整

'A1だけのデータに合わせてA列の幅を自動調整
Range("A1").Columns.AutoFit

使用する頻度が低そうなので単独の記事ではなく、ここに追加しておきます
上記の自動調整では指定範囲内のセルの内で最大の文字数に合わせて調整が行われます
ただ、その場合だと一つだけ極端に長い文字列があり、それに調整された結果とんでもない列幅になってしまうことがあります
そんな場合に、このコードは利用できます

指定セルのみの内容に合わせて自動調整
A1だけで自動調整

画像の動きを確認してください
コード実行後に、列幅が調整されてA1のセル内容が全て表示されるように調整されていますが、A2はまだはみ出したままです
A1のデータのみで自動調整されていることが分かります

そして、列幅としか記載していない通りこの特定セルでの調整は行高のサイズ調整を行えません
コード自体の実行は可能ですが、結局最大文字サイズの高さに調整されます

利用場面が少ないことが予想されますがこんなことも出来ると思っていてください

セルの貼り付け(値、書式、数式)

PasteSpecialメソッドを使用して、特定のセルデータを貼り付けるコード、値・書式・数式の3種類

Selection.Copy
'値のみ貼り付け
Range("B1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Selection.Copy
'書式のみ貼り付け
Range("B1").PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
Selection.Copy
'数式の貼り付け
Range("B1").PasteSpecial Paste:=xlPasteFormulas
Application.CutCopyMode = False

セルの全てのデータではなく、特定のデータのみを貼り付けするには「PasteSpecial」メソッドを使用します。このメソッドの引数「Paste」の設定により貼り付けるデータを指定できます

コードの解説

特殊なセルの貼り付け操作の動き
それぞれの貼り付け下時の動き(数式表示モードにしています)

「Selection.Copy」
「Application.CutCopyMode = False」

の2行に関しては、セルのコピーに解説があります
(こちらの記事で確認してください)

「Range(“B1”).PasteSpecial Paste:=xlPasteValues」
セルの値のみ貼り付けには引数に「xlPasteValues」を指定します
画像ではB列が貼り付け結果です

A3はSUM関数が入力されたものを貼り付けしていますが、「333」という数値が入っていることを確認してください
なお、この画像ではわかりやすくするために「数式の表示」を有効にしていますので、見えている関数は文字列ではありません

「Range(“B1”).PasteSpecial Paste:=xlPasteFormats」
セルの書式のみ貼り付けには引数に「xlPasteFormats」を指定します
画像ではC列が貼り付け結果です

書式のみを貼り付けを行う際には、元データから表などの範囲全体に適用する事も多いと思います
なので、コピー元は1つのセルを指定して、貼り付け先を範囲指定にすればその範囲全てに同じ設定が貼り付けられます

「Range(“B1”).PasteSpecial Paste:=xlPasteFormulas」
セルの数式を貼り付けするには引数に「xlPasteFormulas」を指定します
画像ではD列が貼り付け結果です

画像ではA3のSUM関数が相対参照で同じセル参照の関数が貼り付けられています
上記にあるように関数の表示をしているので、確認してください

数式のコピーは小計を出したりするときに使う事も多いと思いますが
貼り付け先を範囲指定にすれば、同じ形式の数式が貼り付けられます
この構文では引数にあるセルアドレスは相対参照で更新されます

このメソッドについて

このメソッドでは貼り付け先が選択状態になりますので、アクティブセルの使用時には注意が必要です

また通常の貼り付けとは違い、このメソッドではセルを対象オブジェクトとして貼り付けを実行する事ができます
通常の貼り付け操作では、Applicationオブジェクトに対するメソッドでした

これは、形式を選択して貼り付けとはセルに対して行うものだからです
図形に値のみの貼り付けは存在しません
とはいえ、コピー先をコピーしてモードの終了という流れは全く同じです

あとこのメソッドは「Copy」メソッドと違い、クリップボードを介さない直接貼り付けはできません
なので、コピー元でCopyメソッドを使用してから、対象のセルに貼り付けを実行する必要があります

引数「Paste」には、他にも設定が可能です
Excelでのセルの貼り付け操作時の「形式を選択して貼り付け」が相当するので、そこで指定できる選択肢は全て引数から指定できます

セルを初期化する

Clearメソッドを使用してセルの情報すべてを削除して初期状態にするコード

'A1をクリア
Range("A1").Clear
'アクティブセルをクリア
ActiveCell.Clear
'選択範囲をクリア
Selection.Clear

指定セルの入力内容と書式設定をクリアするには「Clear」メソッドを使用します

セルをクリアする動き
セルをクリアする動き

このコードを使用すると、セルの入力内容と書式設定(条件付き書式含む)などの設定全てがクリアされます
ようはセルを初期化する状態になります

セルを削除すると、フォーマットが崩れたりする可能性がある場合にはこちらでセルを初期化してあげると良いです

このコードは上記の通り初期化レベルのコードなので、見た目だけでなくコメントやセルの詳細設定も初期化されます
セルのロック状態まで初期化される点には注意が必要かもしれません

セルの書式設定をクリア

ClearFormatsメソッドを使用して、セルの書式設定をクリアするコード

'A1の書式をクリア
Range("A1").ClearFormats
'アクティブセルの書式をクリア
ActiveCell.ClearFormats
'選択範囲の書式をクリア
Selection.ClearFormats

指定のセルの書式設定をクリアするには「ClearFormats」メソッドを使用します

セルの書式設定をクリアする
セルの書式をクリアする動き

セルの書式設定は、見た目の設定です
それのみをクリアするので、入力内容はクリアされません

ただ、表示形式で日付データの様に入力内容の見た目が変化している場合には元の入力値にも戻るため、セルの「Text」プロパティを取得している場合は注意が必要です

また、このコードでクリアされるのは条件付き書式もクリアされますので一見なにも起きていないようでもしっかりクリアされています

セルの入力内容をクリア

ClearContentsメソッドを使用して入力内容のみ消去するコード

'A1の入力内容をクリア
Range("A1").ClearContents
'アクティブセルの入力内容をクリア
ActiveCell.ClearContents
'選択範囲の入力内容をクリア
Selection.ClearContents

指定のセルの入力内容をクリアするには「ClearContents」メソッドを使用します

セルの入力値をクリアする動き
セルの入力内容をクリアする動き

このメソッドを実行すると、指定範囲のセルの入力内容が消去されます
対象となるのは、入力内容なので数式や値になります

画像の動きを確認してください
A1セルのクリア処理で、背景色は消えていません
書式設定は残したままで、入力内容のみをクリアする場合に使用するメソッドです

クリア処理の処理時間

'A1の入力内容をクリア
Range("A1") = ""

セルの入力内容をクリアするのにこのコードのように「””」(空白)を代入する事でも実行できます

3つ目のコードのように範囲選択を行っていれば、一括して消去することができますが、選択する動作は処理速度の低下を招きますので範囲が確定している場合は、1つ目のコードのようにアドレスで実行するほうが実行速度は速いです

そして、このクリアと空白の代入では空白の代入の方が処理速度は速かったです
何度か実行したところ空白代入の方が20%ほど速かったです

とはいえ、わかりやすいコーディングのためなら実行速度なんてどうでもいいです
数万回もループするような処理であれば、20%も大きな差がありますがそもそもクリア処理にそんな処理はありえないので、このメソッドを使ったほうが良いと思います

セルに数式を入力

Formulaプロパティを使用してセルに数式を入力するコード、A1・R1C1についても解説

'選択範囲にSUM関数を入力(A1形式)
Selection.Formula = "=SUM(A1:B1)"
'選択範囲にSUM関数を入力(R1C1形式)
Selection.FormulaR1C1 = "=SUM(RC[-3]:RC[-2])"

セルに数式を入力するには「Formula(A1形式)」または「FormulaR1C1(R1C1形式)」のどちらかを使用します

セルに数式を入力する動き
数式を入力する動き(セルの範囲選択は手動)

実際の動きを確認してください
例コードでは、単一のセルではなく選択範囲にまとめて入力しています
これはアクティブセルにコードの関数を入力した後に「Ctrl+Enter」で一括入力した時と同じ動きになります

この関数は同じ行のA列とB列の数値を加算してるだけなので、結果の数値を見てもらうとちゃんと引数のセルアドレスの行方向が更新されていることが分かります
これは1つ入力して、オートフィルをしても同じ結果になります

A1形式とR1C1形式について

例コード2つの使い分けに関しては、括弧書きにあるように引数のセル範囲をどちらの形式で表現するかの違いです
どちらを使用しても結果は同じなので慣れているほうを使ってください

A1形式とはExcelの標準のワークシートの表現方法で、1番左上のセルを「A1」として表現する形式で、絶対参照です

これは人間にやさしい設計で編み出されていますので、アドレスから位置関係がイメージしやすくなっています

また、セルアドレスに「$」を付与すればちゃんとワークシート上の絶対参照になるので必要であれば付与してください

対してR1C1形式は行と列の両方を数値で表現しますので、A1形式でいう「A1」は「1,1」(Rが行数値、Cが列数値)という表現になる形式です
「A2」なら「2,1」になります、行列の位置が逆転します

例コードの「RC[-3]:RC[-2]」は選択範囲の3列左~2列左という指定になるため、こちらは相対参照になります

これはコンピューターにやさしい設計です、数値で全てを処理するコンピューターはA列というものを1列目と認識するために、「A=1」と置き換えてから列数をはじき出すのでA1形式はすこしわずらわしいみたいですよ、きっと

実際処理速度に多少の差はある(R1C1形式が優位)ようですが、まあ気にする程ではないのでやはり慣れたほうを使うのがいいです

ただ、行も列も共に数値で扱うことの出来るR1C1形式はループ処理に非常に向いているので少しは使ってみて慣れておいて損は無いです
A1形式は人間にやさしいので言わずもがなですね

セルを削除する

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メソッドは必要ありません