これを作った理由
F列は6列目、くらいならすぐわかりますが、GF列って何列目かくらいになると、とっさにはわからず……
平安絵巻みたいなクソ長い台帳なんか運用しy
冷静に考えてみる
これExcelの列だと思うから、Excelをどうしようとか、セルを左から順に数えてとか、ややこしく考えてしまうんで
この列名ってつまり26進数ですよね?
「〇進数を△進数に変換する」っていうのは算数ドリルの問題とか、プログラミングの練習問題で絶対出てくるやつで
たとえば、8進数を10進数に変換する場合: 264 だったら $28^2 + 68^1 + 4*8^0$
っていうやつ。つまり「各桁の数字 × 〇進数の〇を(桁数-1)乗したもの」を全部足してます。
「26進数を10進数に変換する」と思えば、これってただの初級練習問題レベルのお話でした。
だからGF列なら、$7 * 26^1 + 6 * 26^0 = 188$ 列目、ということになるわけです。
必要なもの
まず、計算するためにA~Zを1~26の数字に変換しないといけないんですが
半角大文字をAscで変換した文字コードから64引いたら、ちょうどいい数字になります。なのでこれを使います。
下表は、文字に対応する文字コードと、そこから64引いた数字です。
英文字を文字コードに変換するのはAscで、MicrosoftDocの説明はこちら
階乗はこれを使います。MicrosoftDocの説明はこちら
列名の英文字を1文字ずつにバラして計算するので、バラして配列に入れるのがこれ。MicrosoftDocの説明がこちら
これを踏まえて作ったオブジェクト
入力引数はColAlpha、出力引数はColNum。
InitializeのNamespace Importsに、System.IOとMicrosoft.VisualBasicを足しておいてください。(上で挙げたメソッドを使うために必要)
フロー。コードステージに入る前に、列名が半角大文字英字のみになるように予めチェックとか変換とかをしておきます。
「文字種確認」ステージで、3桁までの半角英字でないものはNGとしています。
正規表現でチェックするのに使っているVBOはAVO.RegEx。DXのここに置いてあるやつをインポートするだけ。
大文字にするのは関数で
コードステージの中身。事前に入力引数をクリーンにしているのであり得ないはずですが、もし半角英数大文字以外が入ってきたら0を返します。
' 列名をバラす
Dim aryColAlpha As Char() = ColAlpha.ToCharArray()
' 桁数-1
Dim cntMul As Integer = ColAlpha.Length - 1
For Each c As Char In aryColAlpha
' 英字(A~Z)を数字(1~26)に変換
Dim Currentc As Integer = Asc(c) - 64
' 半角英大文字でなかった場合は0を返して終了する
If Currentc < 1 Or Currentc > 26 Then
ColNum = 0
Exit For
End IF
ColNum += Currentc * CType(Math.Pow(26, cntMul), Integer)
cntMul -= 1
Next
終わりです
これはただ「〇進数を△進数に変換」してるだけなので、Blue Prismに限らず、UiPathとか他のツールなりなんなりでも普通に使えるお話です。