ループを飛び出す

解決


Pitto  2005-03-22 15:37:25  No: 88981  IP: [192.*.*.*]

お世話になります。
バイナリーで呼んでS-JISに変換しようとしています。
下記のようにコーディングしています。 
一番最後のバイトを読んだらBINARY_ERRORに飛んで、処理されません。
コーディングの仕方の問題があるのでしょうか。急いでます。どなたかアドバイスをお願いします。


  lngFL_SIZE = FileLen(strFL_NAME)                  
   ReDim bytREC(lngFL_SIZE - 1)                    
   Open strFL_NAME For Binary Access Read As #1     
      Get #1, , bytREC                             

   On Error GoTo BINARY_ERROR 
   strEMS = strFL_NAME & "のバイナリモードでの処理中に失敗しました"

   lngI = 0
   Do While lngI <= UBound(bytREC)                  

   bytU = bytREC(lngI)                           
   bytL = bytREC(lngI + 1)                    

  If bytU <= &H20   Then
     strTARGET = strTARGET & "."                 
     lngI = lngI + 1
      
   ElseIf ((bytU >= &H81 And bytU <= &H9F) And bytL >= &H40 Then
   strTARGET = strTARGET & Chr((Val("&H" & Hex(bytU)) * 256) + Val("&H" & Hex(bytL)))    
    lngI = lngI + 2
      
  Else
   strTARGET = strTARGET & Chr(Val("&H" & Hex(bytU)))    
   lngI = lngI + 1
  End If
       
   Loop
    
   strEMS = ""                                      
   Exit Function
  
BINARY_ERROR:
   Debug.Print lngI, Hex(bytU)
   
   Close #1

編集 削除
ささ  2005-03-22 15:47:02  No: 88982  IP: [192.*.*.*]

>BINARY_ERRORに飛んで、処理されません

処理されないのは、質問内容にかかれていない重要な情報である
Debug.Print lngI, Hex(bytU)
でしょうか?

急いでいるのは分かりますが、その辺の情報がないとなんとも

編集 削除
Pitto  2005-03-22 15:50:46  No: 88983  IP: [192.*.*.*]

すみません。
一番最後のバイトがエラーで Debug.Print lngI, Hex(bytU)に表示されます。
総バイト数-1まで処理されて一番最後が処理されません。
宜しくお願いします。

編集 削除
魔界の仮面弁士  2005-03-22 16:20:44  No: 88984  IP: [192.*.*.*]

まずはエラートラップを解除して、どの行で、
なんと言うエラーが発生しているのかを確認してください。

編集 削除
Pitto  2005-03-22 16:26:20  No: 88985  IP: [192.*.*.*]

お世話になります。下記が表示されます。

 strEMS = strFL_NAME & "のバイナリモードでの処理中に失敗しました"

Do ループを変更しましたが、やはり同じエラーメッセージ表示され、
Debug.Print lngI, Hex(bytU)には総バイト+1のlngIが表示されました。

バイナリーファイルを読んで1バイト文字化2バイト文字化のチェックをして
1バイトならそのまま、2バイト文字なら2バイトをセットして総バイト数まで処理したら終了としたいのです。

宜しくお願いします。

編集 削除
LESIA  2005-03-22 16:46:11  No: 88986  IP: [192.*.*.*]

エラーメッセージの内容ってstrEMSの内容ってことですか?

それなら、
strEMS = strFL_NAME & "のバイナリモードでの処理中に失敗しました"
と書いている以上、どんな場合でもこのメッセージになりますが・・・。

そうではなくて、Err.Descriptionの内容を示してください。

編集 削除
Pitto  2005-03-22 16:50:50  No: 88987  IP: [192.*.*.*]

お世話になります。
下記が表示されました。

    インデックスが有効範囲にありません。

宜しくお願いします。

編集 削除
。。。  2005-03-22 16:59:00  No: 88988  IP: [192.*.*.*]

小学生以下のコミュニケーション能力ですね。
ここはサポートセンターじゃないですよ。

編集 削除
Pitto  2005-03-22 17:06:22  No: 88989  IP: [192.*.*.*]

すみません。
分かっているのですが、はまてしまってうまく行かないのであせっています。
Do while lngI <= UBound(bytREC) でループさせているのですが、
最後の1バイトがうまくいかなくて、インデックスのエラーになってしまいます。
オーバーしていると思い色々してみましたが、同じ結果でした。
根本的な問題でしょうか。

編集 削除
LESIA  2005-03-22 17:20:14  No: 88990  IP: [192.*.*.*]

Do while lngI <= UBound(bytREC) ということは、
lngIは最大でUBound(bytREC)と同じになるということですよね。
そのとき、bytL = bytREC(lngI + 1)とその最大値に1を足しているので
インデックスエラーになります。
lngI = UBound(bytREC)場合は、 bytLを使わないようにすればいいのでは?
コードを解読したわけじゃないから、bytLが本当に不要かどうかはわからない
けど(^^;

ところで、何をS-JISに変換したいのでしょうか?
もしかするとADODB.Streamを使えば、簡単に出来るかもしれません。

編集 削除
Pitto  2005-03-22 18:28:33  No: 88991  IP: [192.*.*.*]

お世話になります。
LESIAさんの指摘通りロジックを修整して、何とか行くようになりました。
異動がかかっているのであせっています。
これからも初歩的な質問もあると思いますが、宜しくお願いします。

編集 削除
Pitto  2005-03-22 18:29:24  No: 88992  IP: [192.*.*.*]

すみません。解決のチェックを忘れていました。

編集 削除