LoginSignup
10
4

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-03-18

はじめに

この投稿は、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」

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

変換方法

2022年6月現在、標準アクティビティ ではこの「列名・列番号」の変換は提供されてませんが、以下の方法で変換できます。

1)UiPathが提供している ExcelUtilities を使う
2).Netのコードで変換する

1)UiPathが提供している ExcelUtilities を使う

UiPath内部で使用する「ExcelUtilities」を使って、変換できます。

変換の例 構文
列番号(1)->列名称(A) UiPath.Excel.Helpers.ExcelUtilities.ConvertColumnIndexToColumnLetter(2)
列名称(C)->列番号(2) UiPath.Excel.Helpers.ExcelUtilities.ConvertColumnLetterToColumnIndex("C")

以下のように使用できます。

image.png

ExcelUtilities が使えるバージョンなら、これが一番簡単です。(古いStudioバージョンの場合、使用できないかもしれません(未確認))

2).Netのコードで変換する

原始的なやり方として「列名と列番号のセットをどこかに持たせておいて、そこから導き出す」方法もありますが、列は最大で「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標準で「列名<->列番号」の変換アクティビティが登場してほしいですが、それまでは頑張って計算するしか有りません。難しくはないしコピペで済むので、参考になれば幸いです。

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

10
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4