Invoke code の利用:Use of Invoke code

studio

#1

invoke codeを用いて処理を考えています。
inの変数とoutの変数に関しては、edit argumentで定義しています。
処理の内容は、excelの列の値からアルファベットを返すものです。
例として4であればDを返す。
27であればAAを返すといったexcel列との関係を算出するものです。

We are considering processing using invoke code.
For in variables and out variables, they are defined with edit argument.
The content of the processing returns the alphabet from the excel column value.
For example, if it is 4, D is returned.
If it is 27, it returns AA, and calculates the relationship with the excel column.

edit code

Public Shared Function ConvertToLetter(ByVal ColIndex As Integer) As String
Dim val As String = String.Empty
Dim Alpha As Integer
Dim Beta As Integer
Dim Remainder As Integer
Try
If ColIndex > 26 + (26 * 26) Then
Alpha = Int((ColIndex - 26 - 1) / (26 * 26))
End If
Beta = Int((ColIndex - (Alpha * 26 * 26) - 1) / 26)
Remainder = ColIndex - (Alpha * 26 * 26) - (Beta * 26)
If Alpha > 0 Then
val = Chr(Alpha + 64)
End If
If Beta > 0 Then
val = val & Chr(Beta + 64)
End If
If Remainder > 0 Then
val = val & Chr(Remainder + 64)
End If
Catch ex As Exception
Throw ex
End Try
Return val
End Function

エラー内容:
error contents:
Invoke code : Error compiling code
error BC30289: Statement cannot appear within a method body. End of method assumed. At line 1
error BC30433: Methods in a Module cannot be declared ‘Shared’. At line 1
error BC30512: Option Strict On disallows implicit conversions from ‘Double’ to ‘Integer’. At line 8
error BC30512: Option Strict On disallows implicit conversions from ‘Double’ to ‘Integer’. At line 10
error BC30429: ‘End Sub’ must be preceded by a matching ‘Sub’. At line 26

edit argument

初めてinvoke codeを利用します。
ご教示いただければと思います。
I will use invoke code for the first time.
I hope to teach you.


#2

幾つかエラーになる要因があるので、まずざっくりと。
Invoke Codeはどうしても、VB.NETとUiPathの両方を理解していないとわからない部分なので、ややこしい感じになってしまうのですが。

Public Shared Function ConvertToLetter(ByVal ColIndex As Integer) As String

End Function

最初と最初の2行は不要です。というのも、VB.NETでは関数(ざっくりとしたイメージだと、UiPathの個々のActivityに相当するようなもの)の宣言が必要なのですが、UiPathの場合、Invoke CodeのActivityがその処理を担ってくれるので、重複してしまうからです。
ここはもう「そういうモノ」と思うしかない部分です。

次に、似たような理由で、

Dim val As String = String.Empty

Return val

ここもInvoke Codeの引数設定で宣言しているので、宣言や戻り値(Outの変数)の設定は不要になります。
ただ初期化はしておくに越したことはないので、最初のDim・・・の行は、

val = String.Empty

だけになる感じでしょうか。

で、それでもまだエラーが残念ながら残るのですが、これまたVB.NETの「そういうモノ」な世界なので。
「内部で使われているInt関数は入力・戻り値ともにDecimal型で、Int32に変換するには命令が必要」というのがエラーの原因です。
なので、その辺も直すと

val = String.Empty
Dim Alpha As Int32
Dim Beta As Int32
Dim Remainder As Int32
Try
    If ColIndex > 26 + (26 * 26) Then
        Alpha = Decimal.ToInt32(Int(CType((ColIndex - 26 - 1) / (26 * 26),Decimal)))
    End If
    Beta = Decimal.ToInt32(Int(CType((ColIndex - (Alpha * 26 * 26) - 1) / 26, Decimal)))
    Remainder = ColIndex - (Alpha * 26 * 26) - (Beta * 26)
    If Alpha > 0 Then
        val = Chr(Alpha + 64)
    End If
    If Beta > 0 Then
        val = val & Chr(Beta + 64)
    End If
    If Remainder > 0 Then
        val = val & Chr(Remainder + 64)
    End If
Catch ex As Exception
    Throw ex
End Try

こんな感じになります。
(厳密に言えば Try ~ Catch ~ End Tryも、そのままThrowするのであれば、単独のActivityで使う範囲ではあまり意味をなさないのですが、消すのも何なので残しておきます)

上記で使用した軸になる命令は、

CType(変数や値, 型)

という関数(命令)です。これを使用することで、データ型を無理がない範囲で変更できる、という構文になります。
型変換関連のエラーが出た場合は、これで囲むことを試すと、何とかなることもあります。
(DataTableをInt32に直接変換する、みたいな根本的に互換性がない場合は、それでも実行時にエラーになりますが)

あとDecimalからInt32に戻すのは、

Decimal.ToInt32(Decimal型の値)

を使用しています。上記のCTypeを使って

CType(Decimal型の値, Int32)

と書いても、得られる効果は同じと思って大丈夫です。
(プログラミング的な意味では記法の意味に若干違いがあるのですが、UiPathを使う上ではそこまで難しく考える必要はないです。どっちを選ぶかも趣味の問題、ぐらいな扱いで)


#3

HONOKA様
本当にありがとうございます。
なぜUIPATHで動かないのか半日悩んでいました。
UIPATHの奥深さ感じました。
excelでよく使う処理をUIPATHで部品化していきたいと考えていますが
敷居が高そうです。


#4

少し別の形ですが、割と使いそうなコードでもあるので(そしてUiPath標準機能ではサポートされていないので)、作成中のWebサイトで記事として形にしてみました。

如何せんプログラムなので書き方は色々あるのですが、参考にしていただければと思います。

http://rpa.ciao.jp/uipath_snippet/excel/cellname


#5

ありがとうございます。

本当に参考になります。