シートの使用済みセルを範囲選択

UsedRangeプロパティは、シート内で使用済みのセル範囲を取得します

'使用済みのセルを範囲選択する
ActiveSheet.UsedRange.Select

シート内の使用済みセル範囲を選択するには「UsedRange」プロパティを使用します
これは、セル範囲のプロパティですがオブジェクトはシートになっていますので注意してください

コードの動きの解説

シート内の使用済みセル範囲を選択状態にする
使用済み範囲の選択
ActiveSheet.UsedRange.Select

例のコードを実行したときの動きです

コードを実行すると、B3からF8までが範囲選択されます

このプロパティは左上端と右下端の2点セルから範囲を取得します
その際、値が入力されているセルだけではなく、書式が設定されているだけでも対象となります

A列と1・2行目にデータは存在しないため、始点セルがB3になります
F8は黄色に背景色が設定されているだけですが、しっかり取得されています

イメージ的には、SpecialCells(xlCellTypeLastCell)メソッドに似ています
このメソッドはシート内の使用済みの最後のセル(右下端)を指定できるものです
このセルから始点は任意の箇所になりますが、同じように使用範囲を指定することができます

しかし、記事のプロパティでは保存の影響を受けません
保存を実行せずに最終セルを判定するには、こちらを使用することになります

ただ、範囲選択されてしまうので最終セルを保存しない状態で取得する場合は
この範囲の中から最後のセルを取得するような処理を作成する必要があります
その内容については以下の記事で解説を行っています

特定のセルを選択する

RowDifferences・ColumnDifferencesメソッドは、指定範囲の中で条件に指定したセル以外を選択するメソッドです

'アクティブセル以外のセルを選択状態にする(行方向)
Selection.RowDifferences(ActiveCell).Select
'アクティブセル以外のセルを選択状態にする(列方向)
Selection.ColumnDifferences(ActiveCell).Select

「RowDifferences」「ColumnDifferences」メソッドは、指定したセルと同一のセル以外を選択します

このメソッドは、指定範囲内に引数に指定するセルが存在していないとエラーになります

なので、基本的にはこのメソッドの引数にはActiveCellやCellsなどの相対的な指定方法で行う必要があります
また、引数に指定できるセルは単一のセルになるので、複数のセルを指定した場合もエラーになります

メソッドの動き

特定のセルを選択状態にする(列方向)
行方向への指定選択
Selection.RowDifferences(ActiveCell).Select

画像ではこのコードが実行されています
RowDifferencesメソッドは、行方向への操作時に使用します

画像の動きではActiveCellはA2になりますので、条件は「ステータスA」が指定される形になります

このメソッドは、指定したもの以外を選択状態にするので
元々の選択範囲から「ステータスA」を除いたセルが選択状態になります

空白も対象になるので、列全体を指定するワークシートの列全体を選択してしまいます

特定のセルを選択状態にする(行方向)
列方向への指定選択
Selection.ColumnDifferences(ActiveCell).Select

ColumnDifferencesメソッドは、列方向への操作時に使用します

画像の動きでは、ActiveCellはB2になっていますので、空白のセルが指定される形になります

なので、選択範囲の中で空白ではないセルが指定される形になっています

この画像の動きのように、行のなかで特定の列だけにデータが入力されている表でどの列にデータが入力されているかを調べるのに適しているメソッドです

ただ、指定範囲の中に条件のセルを含める必要があるのがすこし難点です
なので、この画像の例の表ではその為にあえて何も入力しない空白列(B列)が作成されています
こうすることで、常に空白を指定することが出来るようにはなります

しかし、この動きであればFindメソッドの方が柔軟に条件も指定出来て便利ではあります
ですが、Findメソッドは一度に条件にあてはまるセルを選択するような動きはできません
あくまでも1セルずつ処理を行っていきます

でもこのメソッドなら、条件さえ整えてあげれば一括で条件に当てはまるセルを一括選択できます
逆説なので、条件を整えるのがたいへんですが・・・

使いどころが難しいメソッドですが、機能としては便利な機能だと思います

特定セルのみ再計算を実行する

RangeにCalculateメソッドを使用することでセル限定で再計算します

'A1セルのみ再計算する
Range("A1").Calculate
'指定シートのA1セルのみ再計算する
Worksheets("指定シート").Range("A1").Calculate

再計算の手動実行には「Calculate」メソッドを使用します
このメソッドは指定するオブジェクトによって再計算の範囲が変わります

コードのようにセル範囲を指定することで、指定のセルのみ再計算を実行できます

手動計算にしている状態で、さらにシート全体の再計算では時間がかかり無駄が生じてしまう場合に、限定的に再計算する箇所をセル単位で指定できます

特に、このサイトの基本理念として既存のデータは改変しないという点を考慮するとこうした重たい関数に多々ぶち当たります
こうした再計算の抑止をうまく使って乗り切っていきましょう

Worksheets("指定シート").Range("A1").Calculate

このコードのようにシートから指定をすれば、アクティブシート以外のシートの再計算を行うことも出来ます

セルの行数・列数を取得する

セルの行数と列数の取得には、Row・Columnプロパティを使用します。アクティブセルの行列数の取得コード

'アクティブセルの行数を取得
Debug.Print ActiveCell.Row
'アクティブセルの列数を取得
Debug.Print ActiveCell.Column

セルの行数の取得には「Row」プロパティを使用します
列数の取得には「Column」プロパティを使用します

これは行数と列数の取得を行いますが、単体のセルの値が取得されます

行数と列数の取得時のセル選択範囲
範囲選択した状態

画像の様な範囲選択をしている状態で解説します

ActiveCell.Row
→→→ 4

アクティブセルの行数の取得です。4行目なので「4」が取得されます

ActiveCell.Column
→→→ 3

アクティブセルの列数の取得です。C列は3列目なので「3」が取得されます
列はアルファベットではなく、数値で取得されます

範囲選択をしていても、アクティブセルが範囲選択の中にあっても取得される数値が変わることはありません

Selection.Row
Selection.Column

このコードの様に、Selectionで指定すると選択範囲が指定されます
しかし、このプロパティは単一のセルに対してのプロパティのため、複数セルを指定した場合は、1番左上が指定されます

範囲選択した状態
範囲選択した状態
Selection.Row
→→→ 2
Selection.Column
→→→ 2

つまり、画像の選択範囲状態であった場合に取得されるのは
行数が「2」、列数が「2」となります
範囲選択の1番左上のB2セルの数値が取得されます

1つのセルに対してのプロパティであること、絶対数値であることの2点からもループ処理に向いているプロパティです
特にForループの数値指定を行えば、指定範囲を明確に行いやすくなります

セルのアドレスを取得(R1C1形式)

Addressプロパティでセル範囲のアドレス文字列を取得できます。R1C1形式での取得コード

'絶対参照アドレスを取得
Debug.Print Selection.Address(, , xlR1C1)
'A1からの相対参照アドレスを取得
Debug.Print Selection.Address(False, False, xlR1C1)
'B1からの相対参照アドレスを取得
Debug.Print Selection.Address(False, False, xlR1C1, , Range("B1"))
'ブック名とシートまで含めて取得
Debug.Print Selection.Address(False, False, xlR1C1, True)

指定のセル範囲アドレスを取得するには「Address」プロパティを使用します

アドレスは文字列で返され、引数の設定により取得内容が変化します

単一セルのAddressの取得(R1C1形式)
単一セルの取得

A1セルでアドレスを取得する動きです

Debug.Print Selection.Address(, , xlR1C1)

通常のR1C1形式の取得方法です
ここでは「R1C1」が返されます

Debug.Print Selection.Address(False, False, xlR1C1)

1つ目の引数が行の設定で、2つ目の引数が列の設定になります
Falseを指定することで、相対参照になります
相対参照で取得しますが、A1からの相対参照になるので「RC」が返されます
これは「R0C0」の事になりますが、0は表示しないのでアルファベットだけになっています

Debug.Print Selection.Address(False, False, xlR1C1, , Range("B1"))

相対参照で起点のセルをB1セルに指定して取得しますので「RC[-1]」が返されます
5つ目の引数をRangeで指定したセルを起点にします
ここではB1になるので、B1からA1へは列がマイナス1になるのでCが-1になっています
この5つ目の引数はR1C1形式でのみ使用可能です

Debug.Print Selection.Address(False, False, xlR1C1, True)

4つ目の引数をTrueに指定すると、ブック名とシート名を含めて取得しますので、「[Wordpress.xlsm]Sheet1!RC」が返されます
ブック名やシート名をそれぞれ省くことはできません
必要な場合は別の処理を組む必要があります

セル範囲のAddressの取得(R1C1形式)
B1からの範囲選択での取得

この画像ではSelectionの起点セルがB1になっています

3つ目以外のコードではアドレス取得の起点セルがA1からになっています
3つ目のコードでは起点セルがB1になっているので、返されている「RC:R[4]C」の「RC」は上の処理と同じアドレスですが、実際にはB1になっています
参照設定ならではの動きです

R1C1形式は、パッと見ただけでどのセルを指しているか分かりにくいのですが、相対参照で起点セルまで変更するともはや意味不明なほど分かりにくいですね

でもそれは、人間の脳での話でパソコン的には分かり易い表現なのでアドレスをユーザーに提示する訳ではない場合は有効な取得法ではあります

セルのアドレスを取得(A1形式)

Addressプロパティは、選択範囲のセルアドレスを取得します。A1形式でのアドレスの取得コード

'絶対参照アドレスを取得
Debug.Print Selection.Address
'相対参照アドレスを取得
Debug.Print Selection.Address(False, False)
'ブック名とシートまで含めて取得
Debug.Print Selection.Address(False, False, , True)

指定のセル範囲アドレスを取得するには「Address」プロパティを使用します

アドレスは文字列で返され、引数の設定により取得内容が変化します

単一セルのAddressの取得(A1形式)
単一セルの取得

単一のセルアドレスの取得の動きです

Selection.Address

このコードでは絶対参照のアドレスが返されます
「$A$1」というように「$」の付いた形式になります

Selection.Address(False, False)

このコードでは絶対参照の「$」が外れた相対参照のアドレスが返されます
引数の1つ目と2つ目を共にFalseに指定します
1つ目の引数が行の設定で、2つ目の引数が列の設定になります
1つ目の引数のみTrueにすると「A$1」というようなアドレスが返されます

Selection.Address(False, False, , True)

このコードではブック名とシート名までを含めたアドレスが返されます
4つ目の引数をTrueに指定します
別ブックのアドレスをリンクさせる際に簡単にアドレスが取得できます

ブック名を省くことは出来ないので、ブック名が必要ない場合は文字列を加工するか、シート名を取得して結合させます

セル範囲のAddressの取得(A1形式)
セル範囲の取得の動き

範囲選択した状態でも取得は可能で、「:」により結合されたセル範囲アドレスが取得されます

基本的にSelectionなどを使用してアドレスを取得しますので、アドレスからセル選択をするという動きの処理を作ることはほとんどありません
選択セルが指定セルアドレスと一致するかの条件分岐やワークシート関数をセルに入力するに使用します

行・列の表示・非表示設定

Hiddenプロパティを使用して、行・列の非表示設定を行うコード。再表示についても解説します

'選択列の非表示
Selection.EntireColumn.Hidden = True
'選択列の表示
Selection.EntireColumn.Hidden = False

↑列の設定

'選択行の非表示
Selection.EntireRow.Hidden = True
'選択行の表示
Selection.EntireRow.Hidden = False

↑行の設定

'シート全体の行列を表示
Cells.EntireColumn.Hidden = False
Cells.EntireRow.Hidden = False

↑シート全体の一括設定

行・列の表示・非表示の設定には「Hidden」プロパティを使用します
Trueに指定すると非表示、Falseを指定すると表示されます

プロパティの注意点

このプロパティはRangeオブジェクトのプロパティになりますが、指定するにはRangeオブジェクトではエラーが発生します

「Range(“A:A”).Hidden = True」
この様にRangeオブジェクトでA列を指定するとエラーが発生します
必ず行や列を対象にする必要があります

以下の記事に指定セルの行や列をオブジェクトとして扱う方法があります

または、RowsプロパティかColumnsプロパティでも指定することが可能です

いずれにせよ、対象とするのがセル範囲ではなく行列にする必要があるという事なので、Entire~~プロパティを使用するのが便利です

再表示について

再表示については、ワークシートでの操作と少し違います

ワークシートの操作では、C列を非表示にした場合、B~D列を範囲選択して右クリックメニューから再表示を選択します
この様にC列を包括する形で指定することで再表示できます

これに対して、VBAでは非表示の行列のセルが選択可能です
非表示とは、実際には幅が「0」に指定されているだけでそこに存在はしています

なので、C列を非表示にしていても「Range(“C1”).Select」でC1を選択状態にできますので、この状態で例コードの選択セル列を表示すれば再表示が可能です

また、特定の行列を指定する必要がなければシート全体を一括で表示させる5つ目のコードを使用してもいいです

あと、上記にもあるように幅が「0」に設定されているだけなので、その数値を変更する事でも再表示が可能です
以下の記事にあるメソッドを実行しても再表示されます

ちなみに、この記事のメソッドはセルに対しても行えるのでRangeオブジェクトでも実行可能です
Hiddenプロパティとコードの作りは似ていますが、全く別の形になっています

名前定義の削除

Names.Deleteメソッドで名前定義を削除できます。ブックとシート両方の削除コード

'ブック範囲の名前定義を削除する
ActiveWorkbook.Names("作成名前定義1").Delete

↑ブック適用範囲

'シート範囲の名前定義を削除する
ActiveWorkbook.Worksheets("Sheet1").Names("作成名前定義1").Delete

↑シート適用範囲

名前定義の削除には「Names(“定義名”).Delete」メソッドを使用します
ブック適用とシート適用ではメソッドの対象が変わります

コード解説

「ActiveWorkbook.Names(“作成名前定義1”).Delete」
ブック適用範囲の名前定義を削除する場合に使用します
ブックに対してメソッドを使用します

「Worksheets(“Sheet1”).Names(“作成名前定義1”).Delete」
シート範囲の場合はシートの指定から削除を行います
名前が一意であれば指定無しでも削除は実行できますが、複数の同じ名前を使用していた場合エラーが発生しますので、シート範囲の名前定義はシート指定で削除を行います

また、NamesオブジェクトなのでItemプロパティがありますので、名前を指定しなくてもIndex番号でも指定は可能です
ただ、名前を指定せずに扱うことは処理上あまり使用することは少ないと思います

名前定義したセルに入力・移動

名前定義したセルの使用方法について。入力とGotoメソッドによる移動コード

'ブック範囲の名前定義セルに入力
Range("作成名前定義1") = 123
'ブック範囲の名前定義セルに移動
Application.Goto "作成名前定義1"

↑ブック適用範囲

'シート範囲の名前定義セルに入力
Worksheets("Sheet1").Range("作成名前定義1") = 123
'シート範囲の名前定義セルに移動
Application.Goto Worksheets("Sheet1").Range("作成名前定義1")

↑シート適用範囲

名前定義したセルはその名前文字列で以降は指定が可能になります
その際には、Rangeの引数には「”」で名前文字列を囲んで指定します

それぞれの名前定義については以下の記事を確認してください

コード解説

「Range(“作成名前定義1”) = 123」
ブック適用範囲ではシートの指定が必要なく、アクティブブックに対しての処理になるので、シンプルにRangeオブジェクトの引数に名前文字列を指定して入力を行います

「Application.Goto “作成名前定義1”」
移動には、シートの移動をおこなえるGotoメソッドを使用します

「Worksheets(“Sheet1”).Range(“作成名前定義1”) = 123」
シート適用範囲の場合には、シートの指定から行う必要があります
通常のセル範囲と同じ使用方法になります

「Application.Goto Worksheets(“Sheet1”).Range(“作成名前定義1”)」
移動に関しては、同じくシート移動の出来るGotoメソッドを使用します
指定には、入力と同じようにシートから指定を行う必要があります

Gotoメソッドはシート間の移動までを行うためのコードであるため、シート移動の必要ないアクティブシートでの名前定義セルへの移動に関しては通常のセル選択に使用するSelectメソッドで可能です

Range("作成名前定義1").Select

上記のコードでは、名前定義されたセルを選択状態にします
しかし、別のシートであった場合エラーが発生します

入力に関しては、アクティブシートの相違には問題ありませんが選択状態にする場合は注意する必要があります

名前定義の作成・変更(シート範囲)

Names.Addメソッドはシート範囲の名前定義を作成変更するメソッドです。

'アクティブシートの選択範囲で名前定義
ActiveSheet.Names.Add Name:="作成名前定義1", RefersTo:="=" & Selection.Address

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

'指定シートの指定範囲で名前定義
Worksheets("Sheet1").Names.Add Name:="作成名前定義1", RefersTo:="=$A$1:$A$10"

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

シート範囲での名前定義をするには「Names.Add」メソッドをシート指定して使用します
指定した名前の名前定義が存在しない場合は新規作成され、存在する場合はセル範囲が更新されます

シート範囲で名前定義を行うと、その名前定義をシート内でしか使用できません
別のシートから参照するには、シートの指定から行う必要があります

コードの解説

「ActiveSheet.Names.Add Name:=”作成名前定義1”, RefersTo:=”=” & Selection.Address」
アクティブシートの選択範囲を名前定義します
引数「Name」は名前定義の名前文字列
引数「RefersTo」にはセルのアドレス文字列を指定します、セル範囲そのものではないのでRangeのAddressプロパティを使用します

アクティブシートの選択範囲なので、動的に名前定義する際に使用します

「Worksheets(“Sheet1″).Names.Add Name:=”作成名前定義1”, RefersTo:=”=$A$1:$A$10″」
引数の解説は上記と同じです
今回違う点が、シートを指定しているのと「RefersTo」にアドレス文字列が指定されているところです

この様に指定することで、アクティブシート以外のシートを指定することが可能です
また、シートを適用範囲とするメソッドなのでアドレス指定にはシートの指定は必要ありません、省略すると対象シートが指定されます

使用場面

シート範囲の名前定義とは、別のシートからは参照できないようにシート内でのみ有効な名前定義になります

これを使用する場面は、同じ目的の名前定義を複数作成することで管理がめんどうになるのを防ぐ意味で使用します

シートごとに違う名前を指定する必要があるブック範囲ではコードの作成にも利便性が無いので、同じ名前の指定をしておけばシートを切り替えるだけで同じ名前定義を使用することができます

名前定義したセル範囲を指定する際には、別シートであればシートからの指定が必要になる点は注意が必要です