300ステップに近い大物マクロだぞ。
セル範囲をパラメタにして、変換結果を返す関数だ。
「なんちゃって変換」なので、変換できない文もあるぞ。
変換作業の一次変換だと割り切って使ってくれ。
以下のOracle関数、Oracle文に対応している。
SUBSTR ⇒ mid
LENGTH ⇒ len
SYSDATE ⇒ now
TO_NUMBER ⇒ CInt
単純置換。
TO_CHAR ⇒ str
数値から文字への変換のみ対応。日付のTO_CHARはNG
NVL ⇒ iif
iif関数にパラメタ追加し変換
DECODE ⇒ iif
iif関数の入れ子に変換
CASE ⇒ iif
iif関数の入れ子に変換
"CASE WHEN xxx=yyy" , "CASE xxx WHEN yyy" 両方に対応。
CASE文の入れ子も変換できるが、そもそもそんな汚いSQL書くなし。
いずれかの変換で誤変換される場合、内部関数、Ora2MsSqlText中にフラグがあるので、false立てて機能を切ってくれ。
Macroのつぼ
「VBAのバグじゃね?」と、思わずヒイたぞ。
例えば、For i = 10 to 0 Step -1 のループ中で、添え字"i"を11に変えてループ継続させてみた。
※ループ中特定条件で、ループを最初からやり直す処理だな。
ループのNext前処理として、Step -1 が実行され、i=10で実行されるところ、i=11のままだった。
※2020/11/20 最適化したので、ループ添え字書き換えロジックは排除された
Forループの中で、脱出条件やループ添え字を変えるような、汚いことはするなというMSのお達しだ。
当該処理にはdo,while,until,loopを使えし。CASE文の変換はOSのメモリ状態次第で、数秒~数十秒掛かる場合があるぞ。
1ブックにこの関数を多用すると再描画でもどってこないから気を付けろし。
ソースコードに "OR2MSSQL.bas" とか名前を付け保存し、XLMS(マクロ対応ワークブック)のVBAエディタからインポートしてくれ。
※2020/11/19 最適化の為一部修正
0 件のコメント:
コメントを投稿