【関数・プロパティ設定をつかう】
9 文字が入っているセルの最大列を取得
10 行のループで複数の文字列を連続分解
11 列のループで複数の文字列を連続分解
12 指定した行番号と列番号のセル番地を取得
13 特定の文字列を指定文字列に置き換える
14 セル列番号を英字の列名に変換
15 文字列の中で特定の文字の位置を取得
指定した行番号と列番号のセル番地を取得
パイさん
「Excel VBA/マクロのセルの指定方法にはRange(セル番地)方式とCell(行番号, 列番号)方式がありますが、
Addressプロパティをつかえば、Cell(行番号, 列番号)オブジェクトから
Range(セル番地)オブジェクトのセル番地を取得することができます。
Addressプロパティの構文は、次のようになります。」
パイさん
「Addressプロパティでは、行番号と列番号を指定することで
セル番地(英字の列アドレスと数字の行アドレス)を取得します。
予め、次のようなExcelシートを用意します。」
パイさん
「Excelの1行目の右端セルの最大列番号を取得した後、Addressプロパティの引数
行参照にTrue:絶対参照、列参照にTrue:絶対参照を、
行参照にTrue:絶対参照、列参照にFalse:相対参照を、
行参照にFalse:相対参照、列参照にTrue:絶対参照を、
行参照にFalse:相対参照、列参照にFalse:相対参照を、入れて、
Cells(1, 列番号)オブジェクトのセル番地を取得し、それぞれ
Cells(2, 最大列番号)、Cells(3, 最大列番号)、Cells(4, 最大列番号)、Cells(5, 最大列番号)
に格納してみましょう。
最大列を変数『最大列』としてから、プログラムコードを考えてみましょう。」
ソンくん
「『最大列』を整数型として変数宣言。
Dim 最大列 As Integerと記述します。
先ず、Excelの1行目の文字が入っているセルの最大列を取得します。
最大列 = Range("IV1").End(xlToLeft).Column
Addressプロパティの引数、行参照に『True』、列参照に『True』を入れてから、
Cells(1, 最大列)オブジェクトのセル番地を取得し、Cells(2, 最大列) に格納します。
Cells(2, 最大列).Value = Cells(1, 最大列).Address(True, True)
Addressプロパティの引数、行参照に『True』、列参照に『False』を入れてから、
Cells(1, 最大列)オブジェクトのセル番地を取得し、Cells(3, 最大列) に格納します。
Cells(3, 最大列).Value = Cells(1, 最大列).Address(True, False)
Addressプロパティの引数、行参照に『False』、列参照に『True』を入れてから、
Cells(1, 最大列)オブジェクトのセル番地を取得し、Cells(4, 最大列) に格納します。
Cells(4, 最大列).Value = Cells(1, 最大列).Address(False, True)
Addressプロパティの引数、行参照に『False』、列参照に『False』を入れてから、
Cells(1, 最大列)オブジェクトのセル番地を取得し、Cells(5, 最大列) に格納します。
Cells(5, 最大列).Value = Cells(1, 最大列).Address(False, False)と記述します。」
Sub セル番地を取得_Addressプロパティ()
Dim 最大列 As Integer '最大列
' 最大列の取得
最大列 = Range("IV1").End(xlToLeft).Column
' Addressプロパティ 行:絶対参照 列:絶対参照
Cells(2, 最大列).Value = Cells(1, 最大列).Address(True, True)
' Addressプロパティ 行:絶対参照 列:相対参照
Cells(3, 最大列).Value = Cells(1, 最大列).Address(True, False)
' Addressプロパティ 行:相対参照 列:絶対参照
Cells(4, 最大列).Value = Cells(1, 最大列).Address(False, True)
' Addressプロパティ 行:相対参照 列:相対参照
Cells(5, 最大列).Value = Cells(1, 最大列).Address(False, False)
End Sub
パイさん
「その通りです。それでは、そのマクロを実行してみましょう。」
ソンくん
「ExcelシートのセルK2に『$K$1』、セルK3に『K$1』、セルK4に『$K1』、セルK5に『K1』が書きこまれました。
ところで、絶対参照と相対参照とは何ですか。」
パイさん
「『$』マークを固定ピンと考えるとわかりやすくなります。
英字か数字の前に『$』マークがあれば列か行の絶対参照、
英字か数字の前に『$』マークがなければ列か行の相対参照となります。
『$』マークが付いた列や行は、セル番地が固定され動かなくなります。
相対参照の計算式をコピーすると計算式が入力されているセルを基準とした位置関係で計算式がコピーされて、
計算式の中のセル番地もその位置関係に応じて変動しますが、絶対参照の計算式をコピーしても
計算式の中のセル番地は固定されたままで元のセル番地は変わりません。
Excelのマクロでセル番地を取得するときは、英字と数字の前に『$』マークを付けない
列と行の相対参照としてセル番地を取得した方がその後の処理がしやすくなります。」
パイさん
「次に、Excelの1行目の文字が入っているセルの最大列を取得した後、最小列から最大列にかけて、
Addressプロパティの引数、行参照に『False:相対参照』、列参照に『False:相対参照』
を、入れて、1行目のセル:Cells(1, 列番号)オブジェクトのセル番地を取得し、
2行目のセル:Cells(2, 列番号)に格納してみましょう。
最小列:『最小列』を『2』列、列を変数『Cm』、最大列を変数『最大列』としてから、
プログラムコードを考えてみましょう。」
ソンくん
「『最小列』を『2』として定数宣言、
『Cm』・『最大列』を整数型として変数宣言。
Const 最小列 = 2
Dim Cm As Integer
Dim 最大列 As Integerと記述します。
先ず、Excelの1行目の文字が入っているセルの最大列を取得します。
最大列 = Range("IV1").End(xlToLeft).Column
それから、Addressプロパティの引数、行参照に『False』、列参照に『False』
を入れてから、Cells(1, Cm)オブジェクトのセル番地を取得し、Cells(2, Cm) に格納します。
Cells(2, Cm).Value = Cells(1, Cm).Address(False, False)
このプログラムコードの集まりを【ブロックD】とします。
それから、Excelの最小列:『最小列』(2列目)から最大列:『最大列』(11列目)にかけて、
各列の処理【ブロックD】をループ処理で実行します。
For Cm = 最小列 To 最大列
【ブロックD】
Next Cm
と記述します。」
Sub 各セル番地を取得_Addressプロパティ()
Const 最小列 = 2
Dim Cm As Integer
Dim 最大列 As Integer
最大列 = Range("IV1").End(xlToLeft).Column
For Cm = 最小列 To 最大列
Cells(2, Cm).Value = Cells(1, Cm).Address(False, False)
Next Cm
End Sub
パイさん
「その通りです。それでは、そのマクロを実行してみましょう。」
ソンくん
「ExcelのB列からK列にかけて、1行目のセルから取得したセル番地が、2行目のセルに順に
書きこまれました。」
パイさん
「このように、Addressプロパティをつかえば、Cell(行番号, 列番号)オブジェクトから
Range(セル番地)オブジェクトのセル番地を取得することができます。」