前回から引き続き、Excel VBA の”モジュール”を LotusScript に移植するときに発生する文法エラーの撲滅作業です。
無用な部分を削除
LotusScript では、Object というクラスは使用できません。しかも、Object として宣言している oo 変数は、宣言後はどこにも使用されていません。無用なので削除ます。
次に Debug です。これは、その名の通り、VBA のデバッグ用のオブジェクトとなります。LotusScript では存在しませんし、機能には関係がないので削除します。
Debug オブジェクトは、上記以外にも何カ所かありますので、すべて削除します。
IsMissing 関数の対応
VBA の IsMissing は、Optional キーワードを使用した引数で、呼び出されたときに省略されたか判定します。LotusScript では、前回記載した通り、Optional キーワードは対応しておらず、キーワードを削除しました。
よって、引数の指定は必須となり、引数を利用するよう調整しなければなりません。
この IsMissing 部分をズバっと削除して、次のように代入だけを記述してもよいのですが、将来、初期値を後で参照したくなるかもしれません。
zones = pzones params = pparams graficky = pgraficky bctype = pbctype |
そこで、次のような関数を定義して、関数の引数をかならず後続の処理で使用するように細工します。
Function IsMissing(vvDummy As Variant) As Boolean IsMissing = False End Function |
この対応で、このライブラリ全体の IsMissing のエラーを回避できます。
IIf 関数の対応
IIf は、引数が3つあり、1つ目が評価式で、その結果が True の場合は2つ目の値、False の場合は3つ目の値を返します。@関数の @If に類似していますね。
この関数も LotusScript には存在しませんので、自作して対応します。
Function IIf(expr As Boolean, truepart As Variant, falsepart As Variant) As Variant If expr = True Then IIf = truepart Else IIf = falsepart End If End Function |
truepart と falsepart の型は様々なので、引数は Variant で受けています。また、同じ理由で戻り値の定義も Variant としています。
Array 関数の対応
Array は、引数で指定した複数の値を Variant 型の配列で返す関数です。次のように使用されています。
Array 関数で返される配列の要素(値)には型がありますので、どのような用途で使用されているか、いったん確認します。
一つ目が上記 dmx_can_put 関数内の wr と wc の代入です。
wr = Array(psiz - 1, psiz - 1, psiz - 1, 0, 0, 1, 2, 3) wc = Array(0, 1, 2, psiz - 2, psiz - 1, psiz - 1, psiz - 1, psiz - 1) |
この値は、この関数の最後で、別の関数に渡されています。
dmx_can_put = dmx_placebyte(parr, psiz, pbl, wr, wc, pbyte) |
次の関数では、要素ごとに、次の関数 dmx_place 渡されています。
Function dmx_placebyte(parr As Variant, psiz As Integer, pbl As Integer, _ prow As Variant, pcol As Variant, pbyte As Integer) As Boolean Dim bity(7) As Integer Dim xv As Boolean Dim i, x% x = pbyte For i = 7 To 0 Step -1 bity(i) = x Mod 2 x = Int(x / 2) If Not (dmx_place(parr, psiz, pbl, (prow(i)), (pcol(i)), -1)) Then dmx_placebyte = False Exit Function End If Next For i = 0 To 7 xv = dmx_place(parr, psiz, pbl, (prow(i)), (pcol(i)), bity(i)) Next dmx_placebyte = True End Function |
dmx_place 関数では、その値を Integer 型変数で受け取っています。
Function dmx_place(parr As Variant, psiz As Integer, _ pbl As Integer, prow As Integer, pcol As Integer, _ pbit As Integer) As Boolean |
この確認で、最初の wr と wc は Integer 型の配列であれば問題ないことがわかります。
同様に、他の Array 関数利用を調べた結果、すべて Integer 型の配列でよさそうでした。また、生成される配列の要素数は 8 と 5 の2パターンが存在しました。
この結果をもとに次の関数 Array5 を定義します。
Function Array5(vi0 As Integer, vi1 As Integer,_ vi2 As Integer, vi3 As Integer, vi4 As Integer) As Variant Dim aiReturn(4) As Integer aiReturn(0) = vi0 aiReturn(1) = vi1 aiReturn(2) = vi2 aiReturn(3) = vi3 aiReturn(4) = vi4 Array5 = aiReturn End Function |
また、同様の方法で引数の個数を 8 個にした Array8 関数も定義します。エレガントな方法ではありませんがご容赦ください...
関数を作成したら、Array 関数の呼び出し元の関数名に 8 または 5 を付加し、文法エラーを回避します。
wr = Array8(psiz - 1, psiz - 1, psiz - 1, 0, 0, 1, 2, 3) |
また続きます...
ここまでの作業が完了すると、エラーの発生している関数は残り3つとなります。あともう少しと信じて作業を継続します...
ただ、長くなったので、続きはまた次回とします。
前回 | ノーツで QR コード | 次回 |
0 件のコメント:
コメントを投稿