Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

【UiPath】Excel - 列番号と列名称を変換する

はじめに

この投稿は、RPAツールのUiPathで、Excelの列番号と列名を変換する方法についての投稿です。

「Excel操作を.NETのコードでやってみよう」シリーズです。他の投稿はこちら。

列番号と列名の相互変換

エクセルでは列位置の表現方法として「列番号」と「列名」があります。

image.png

列番号は例えば「1」、列名称は例えば「A」という感じですが、
UiPathではこの「列番号」を「列名」に変換したり、逆に戻したりと、相互の変換が必要になることがあります。
なぜなら「範囲選択」をする時に「列名」で範囲指定するからです。
image.png
例えば、以下のように相互変換したい時があります

 例)1行目の10列目のセルの値を取得したい
    ⇒ 列番号「10」を列名「J」に変換し「J1」を範囲指定

 例)AG1から横に3セル取得したい
    ⇒「AG」を列番号「33」に変換し、3足して「36」を「AJ」に変換し「AG1:AJ1」を範囲指定

なので、

・列番号「10」 ⇒ 列名称「J」
・列名称「AG」 ⇒ 列番号「33」

のような変換が、サッと出来ると便利です。

変換方法

2021年3月現在、標準アクティビティではこの「列名・列番号」の変換は提供されてません。
なので、自作するか、UiPathマーケットで探して使用する必要があります。
UiPathマーケットで探しても良いですが、個人的に「これだ」というのがありません。(相互変換したい)
難しくないので自作します。

原始的なやり方として「列名と列番号のセットをどこかに持たせておいて、そこから導き出す」方法もありますが、列は最大で「16,384」まであり全部用意するのが大変です。「1000列位までで良いよ」っていうならアリですが。出来るならロジックで計算して導き出すのがベターです。

列番号を列名称に変換

.NETのコードをInvokeCodeで実行させます。以下はVB.NETのコードです
 ※ 移植しやすいように、匿名関数(Func)にしています

Dim ConvertColumNumberToName As Func(Of Integer, String) = 
    Function(columnIndex As Integer) As String
        Dim colLetter As String = String.Empty
        Dim modNum As Integer = 0
        Dim divEnd As Integer = columnIndex
        While divEnd > 0
            modNum = (divEnd - 1) Mod 26 '// 26 = A-Z
            colLetter = Chr(65 + modNum) & colLetter '//char(65) = A
            divEnd = CInt((divEnd - modNum) \ 26)
        End While
        Return colLetter
    End Function

'// 列番号10は列名Jなので「J」と表示される
Console.WriteLine(ConvertColumNumberToName(10))

ロジックの説明はこちら(記述は少し違いますが、ロジックは一緒です)
 https://docs.microsoft.com/ja-jp/office/troubleshoot/excel/convert-excel-column-numbers

呼び出し可能なxamlファイルにしたものを用意しました。以下からダウンロードできます。
 [github]ConvertColumNumberToName.xaml

列名を列番号に変換

こちらも.NETのコードをInvokeCodeで実行させます。以下はVB.NETのコードです
 ※ 移植しやすいように、匿名関数にしています

Dim ConvertColumNameToNumber As Func(Of String, Integer) = 
    Function(columnLetter As String) As Integer
        Dim sum As Integer = 0
        columnLetter = columnLetter.ToUpper()
        For idx As Integer = 0 To columnLetter.Length - 1
            sum *= 26
            Dim charA As Integer = CInt(Char.GetNumericValue("A"c))
            Dim charColLetter As Integer = CInt(Char.GetNumericValue(columnLetter(idx)))
            sum += (charColLetter - charA) + 1
        Next
        Return sum
    End Function

'// 列名AAは列番号27なので「27」と表示される
Console.WriteLine(ConvertColumNameToNumber("AA"))

呼び出し可能なxamlファイルにしたものを用意しました。以下からダウンロードできます。
 [github] ConvertColumNameToNumber.xaml

終わりに

UiPath標準で「列名<->列番号」の変換アクティビティが登場してほしいですが、それまでは頑張って計算するしか有りません。難しくはないしコピペで済むので、参考になれば幸いです。

最後までお読みいただき、ありがとうございました。

追記

痛恨のスペルミス
 誤)colum
 正)column

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?