2023/08/15

ノーツで QR コード:#7)Excel VBA から LotusScript に変換 その②

前回から引き続き、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 件のコメント:

コメントを投稿