VBAを使用して .NETで作られた「.vb」ファイルを読み取るには?

解決


愛与  2009-10-20 05:05:51  No: 142676

初めて質問する愛与と申します。
貴重なこの場をお借りできることを、管理人様に感謝させて頂きます。
初めて故、不手際があるかもしれませんが、何卒よろしくお願い致します。

Access2003のVBAを使用してVB6.0ならびに、VB.NET(VS2008)のソースから
イベント名及びメソッド名を読み取ろうと考えています。

下記のソースを使用してVB6.0(.frmファイル)からイベント名等は取れたのですが、
VB.NET(.vbファイル)を読み取ると文字化けしてしまいます。

原因が文字コードの違いというところまではわかったのですが
ADODB.Streamによる変換もうまくいかず、悩んでいます。

文字コードを指定してファイルを開く方法、もしくは
読み取った文字列を別の文字コードに変換等は難しいのでしょうか?

'--------------------------------------------------------------------
'[名称] EventNameOutPut
'
'[概要] 指定されたファイルから、イベント、メソッド名を抜き取る。
'
'[処理] 1、テキストストリームでファイルを開く。
'       2、イベント名等を抜き出す。
'--------------------------------------------------------------------
Private Sub EventNameOutput(ByRef rstrList() As String, ByVal vstrFolderPath As String)
On Error GoTo Err_
    
    Dim objFso As FileSystemObject      'vbファイル読取用
    Dim objTso As TextStream
    Dim strLine As String               
    Dim i As Integer                    'ファイルカウント
    Dim Sli As Integer                  '文字カウント
    Dim Pi As Integer                   '貼り付け行
    Dim intStart As Integer             '読取開始位置
    
    '各カウントの初期値を設定
    i = 0

    '選択されたファイル数分処理を行います。
    For i = 0 To UBound(rstrList)
                
        Set objFso = New FileSystemObject
        Set objTso = objFso.OpenTextFile(vstrFolderPath & rstrList(i), ForReading)
                
        'イベント、文字数カウントをリセット
        Sli = 0
        Pi = 2
        
        'ファイル名を一行目に。
        Debug.Print rstrList(i)
        
        '読取終了位置まで一行づつ読み込みます。
        Do Until objTso.AtEndOfStream
            
            strLine = objTso.ReadLine
            
            '1文字目から読み取り、イベントもしくはメソッドであるかを確認します。
            Select Case True
                Case Left(strLine, 16) = "Private Function"
                    intStart = 16
                Case Left(strLine, 11) = "Private Sub"
                    intStart = 11
                Case Left(strLine, 20) = "    Private Function"
                    intStart = 20
                Case Left(strLine, 15) = "    Private Sub"
                    intStart = 15
                Case Else
                    intStart = 0
            End Select
            
            'どちらでもなければ次の周回へ。
            If intStart = 0 Then
            Else
                'イベントもしくはメソッド名が見つかった場合は、名を抜き取ります。
                '"("が見つかるまで回します。
                For Sli = intStart To Len(strLine)
                    
                    'イベント名の後の1文字目は必ず「 ( 」のはず!
                    If Mid(strLine, Sli, 1) = "(" Then
                    
                        'イベント名を抜き取り一時保存 「( 」を読み取りたくないので、読取文字数を - 1 します。
                        Debug.Print LTrim(Mid(strLine, intStart + 1, Sli - intStart - 1))
                        Pi = Pi + 1
                        Exit For
                    End If
                Next
            End If
        Loop

        'ここまで使用したオブジェクトを一旦開放。
        objTso.Close
        Set objTso = Nothing
        Set objFso = Nothing
    Next
Exit_:
    Exit Sub
Err_:
      MsgBox "Number : " & Err.Number & vbCr & _
             "Source : " & Err.Source & vbCr & _
             "Description : " & Err.Description, _
             vbCritical, _
             "システムエラー"
    Resume Exit_
End Sub


Koz  2009-10-20 11:06:05  No: 142677

VB.NET のソースは 2003 以前だと Shift-JIS、2005 以降では、
UTF-8 でエンコードされているようです。

http://www.atmarkit.co.jp/fdotnet/dotnettips/609vsfileencode/vsfileencode.html

2003 から 2005 にアップグレードしたソースの場合は Shift_Jis のまま
だったりするので、どちらのコードで保存されているか判断が必要です。

先頭3バイトをバイナリで読み込んで、EF,BB,BF だったら UTF-8、
それ以外なら Shift_Jis と判断し

    With New ADODB.Stream
        .charset = charset   ' "utf-8" or "Shift_Jis" をセット
        .Open
        .LoadFromFile FileName
        Text1.Text = .ReadText
    End With

こんなコードで読めるはずです。


愛与  2009-10-20 19:45:35  No: 142678

Koz様

ご返信ありがとうございます。
UTF-8だったのですね。
Koz様のサンプルを参考に、書き直したところうまく動きました。

私がADO Streamで出来なかったのは、文字コードの指定と
ReadTextの引数がうまく設定できていなかったみたいで。。。

書き直したところ、TextStreamと全く同じ結果を
得ることができるようになりました。

Koz様、ありがとうございました。
解決とさせて頂きます。

貴重な場をお借りいただけたことを管理人様に感謝いたします。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加