【踊ってみた同好会(仮)】Excelセル参照A1形式とR1C1形式の正確な変換byスクリプト
皆様こんにちは。
次第に涼しくなる日々に、私は秋を期待しております。
今回のコラムは、WinActorそのものというより、どちらかというとスクリプト(VBScript)寄りのお話になります。
上級者の方には物足りない内容かもしれませんが、どうぞお手柔らかにお願いします。
さて、Excelのセルを表す参照にはA1形式とR1C1形式があることはご存知の方も多いと思います。
あまりないかもしれませんが、列に対して繰り返し処理をするときなどは、A1形式よりR1C1形式の方が便利に思う方が多いのではないでしょうか?
ただ、Excelのセル参照を扱うオブジェクトはA1形式が基準になっています。
ex)
Set rng_foo = ws_bar.Range("C13") ' OK
Set rng_foo = ws_bar.Range("R13C3") ' NG
これをどうにかするには指定されたR1C1形式の参照を分解して Worksheet.Cells(row, column) 形式に直すなどをすると思います。
実際にWinActorのライブラリサンプルではそういう方法を取っていますね。
そもそもそれが手間ですし、Excelセル参照は範囲指定が、しかも複数の指定ができます。
ex) "R13C3:R17C7,R23C11,R32C64:R128C256"
これを分解するなんて、やっていられないですよね?
そして、こういう指定ができたらうれしいですよね?
(ニッチな需要でしょうか?)
そこで私が目を付けたのが Excel.Application.convertformula() です。
これは単にExcel計算式の文字列をA1形式⇔R1C1形式で変換するものです。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.convertformula
引数の詳細や凡例などはMicrosoft Docsに任せることにいたします。
これを使うと何がうれしいかというと、セルの参照だけの計算式さえ作ってしまえば、A1形式、R1C1形式の変換が自由自在だということです。
単独セルの参照でも、複数のセル範囲の参照でもお手の物です。
具体的には、次のような感じで実装できます。
---- ここから ----
' Enumがないので XlReferenceStyle の値を定数にしてしまいます。
Const xlA1 = 1
Const xlR1C1 = -4150
' ~ 中略 ~
' Excel.Application のオブジェクトは xls_app とします。
' 先頭に"="をくっつけて無理やり計算式にしてしまって変換します。
str_cellref_A1 = xls_app.convertformula("=" & !R1C1形式セル参照!, xlR1C1, xlA1)
' 先頭に"="がくっついているのは明らかなので、先頭1文字だけ消してしまいます。
str_cellref_A1 = Right(str_cellref_A1, Len(str_cellref_A1) - 1)
' 変換したセル参照を出力します。
SetUMSVariable $A1形式セル参照$, str_cellref_A1
---- ここまで ----
A1形式からR1C1形式への変換は、 convertFormulaの第2、第3引数を入れ替えればいいだけです。
実際には関数などで実装して、呼び出して使うようにするのをお勧めします。
R1C1形式のセル参照をA1形式に変換してしまえば、そのまま Worksheet.Range() に放り込めるようになります。
さて、ばりばりとスクリプトを書いている方には物足りないかも、スクリプトを書くどころか読むことすらできないなんて方には難解な内容となっていると思います。
需要はどこにあるかわかりませんが、どこかのだれかの心の隙間に入り込めたらうれしいなと思います。
よろしくお願いします。