Jwwファイルのメモ取得で学ぶVBA

Excel VBA(Visual Basic For Application)の薦め

【初めてExcel VBA に挑戦される方へ】
  • WindwsのスタートボタンからExcelを立ち上げる。
  • Alt + F11キーを叩くとExcelのワークシートとは別に、こんな画面が現れます。
    (ボクの設定ですから、まったく同じとは限りませんよ。)

[メニュー] → [挿入] → [標準モジュール] と進み、下のコードをコピーして [標準モジュール] へ貼付ると上の画面。

Option Explicit

Sub Jwwメモ取得()

Dim m As Boolean
Dim i As Byte
Dim バイト数 As Byte
Dim Fn As Integer
Dim Mystr As String
Dim メモ1 As String
Dim メモ2 As String

    m = False
    メモ1 = ""
    メモ2 = ""
    Fn = FreeFile

    Open [B1] For Binary As #Fn
        For i = 1 To 79
            Mystr = Input(1, #Fn)
            Cells(i, 1) = Mystr
            If i = 13 Then バイト数 = AscB(Mystr) - 2
            If i > 13 Then
                If m = True Then
                    If Asc(Mystr) = 1 Then GoTo メモ終
                    If Mystr <> vbCr And Mystr <> vbLf Then メモ2 = メモ2 & Mystr
                ElseIf Mystr = vbCr Or Mystr = vbLf Then m = True
                Else
                    メモ1 = メモ1 & Mystr
                End If
            End If
                           If LenB(StrConv(Mystr, vbFromUnicode)) = 2 Then i = i + 1
        Next i      
メモ終:
    Close #Fn

    MsgBox "メモ1:" & メモ1 & vbCrLf & "メモ2:" & メモ2, , "メモバイト数:" & Format(バイト数)

End Sub

  • ワークシートのB1セルへメモ取得したいJwwファイルのパスを書き込む。
  • カーソルが [標準モジュール] 内にあることを確認して[F5]キーを叩くとマクロが実行されます。
    (ファイルが実在しないと「パスが見つかりません」とエラーが出て、マクロは中断します。)
  • 結果、メモを取得してメッセージボックスを表示して、セルA列にバイト単位で文字が書き込まれます。
  • マクロコード自体は金公が勝手に作ったものだから正解かどうかは解りませんが、一応動作はしています。
  • VBAが初めての方にとっては少々高度な内容かもしれませんが、このわずかなソースから、いろいろな事を学ぶ事が出来ると思います。

【解説】
  • ソースコードは以下のように変数の宣言関連部分を削除しても動作します。
  • これは他の言語では考えられないVBAのいいところのようですが、実は欠点です。
  • 理由はさまざまありますが、ぼくにとっては「自分の間違いに気づかない」事が一番の理由に挙げられます。
  • ちゃんと宣言してあれば間違ったコードを書き込むとVBAの方から間違いの指摘とさまざまな情報を教えてくれるのです。
  • 宣言する事を習慣ずけましょう。
Sub Jwwメモ取得2()

    m = False
    メモ1 = ""
    メモ2 = ""
    Fn = FreeFile

    Open [B1] For Binary As #Fn
        For i = 1 To 79
            Mystr = Input(1, #Fn)
            Cells(i, 1) = Mystr
            If i = 13 Then バイト数 = AscB(Mystr) - 2
            If i > 13 Then
                If m = True Then
                    If Asc(Mystr) = 1 Then GoTo メモ終
                    If Mystr <> vbCr And Mystr <> vbLf Then メモ2 = メモ2 & Mystr
                ElseIf Mystr = vbCr Or Mystr = vbLf Then m = True
                Else
                    メモ1 = メモ1 & Mystr
                End If
            End If
                           If LenB(StrConv(Mystr, vbFromUnicode)) = 2 Then i = i + 1
        Next i        
メモ終:
    Close #Fn

    MsgBox "メモ1:" & メモ1 & vbCrLf & "メモ2:" & メモ2, , "メモバイト数:" & Format(バイト数)

End Sub
  • Jwwのメモはみなさんご存じの通り、メモ上段32バイト、メモ下段32バイトと制限が設けられています。
  • Jwwファイルの中でメモの部分が先頭から書かれているのではなく先頭から12バイトはJwwファイルであることの宣言用に使われています。

■ メモの書き込まれていないJwwファイルの場合

  • 13バイト目は数値の2が入っています。
  • 14、15バイト目は、vbCrvbLf つまり改行コードが入っています。
  • 16バイト目は数値の1が入っていて、その後決まった数のヌル値で埋められています。

■ メモが書き込まれたJwwファイルの場合
(便宜上、メモ上段「金公」、メモ下段は半角「3」と書き込まれているとします。)

  • 13バイト目にはメモ上段バイト数4 + メモ下段バイト数1 + 2 = 7で、数値7が書き込まれています。
  • 14、15、16,17バイトにメモ上段「金公」の文字が書き込まれています。
  • 元々14,15バイト目に書き込まれていた改行コードは18、19バイトにシフトします。
  • 19バイト目にメモ下段半角の「3」、20バイト目にメモ終了の印しだと思われる「1」、その後は規定数のヌル値があります。

■ メモ取得に関する定義

  • Jwwファイルの13バイト目の数値を知ると書き込まれているメモのバイト数が取得出来る。
  • その後、改行コードが来るまでの間を知るとメモ上段が取得出来る。
  • 改行コードより後、数値の「1」が来るまでの間を知ると、メモ下段が取得出来る。

以上、金公が勝手に調べたメモ取得に関する結論です。間違っているかもしれませんのでその事をふまえておいて下さい。
又、間違いに気づかれた方は教えて下さいね。

この解説とソースコードを見比べた後、マクロのステップ実行で動作を見て行くとVBAへの理解がより深まると思います。

【ステップ実行】
  • マクロコードの中で、「Stop」っと書くとその場所でマクロ実行が停止(ブレイク)します。
  • 出来れば、Open [B1] For Binary As #Fn より上の部分で書き込んで下さい。その方が見やすいし、Jwwを開く前だからより安全です。
  • ブレイク状態で、[F8]キーを叩くたびにマクロコードを1行ずつ実行することが出来ます。
  • 変数部分(バイト数とかメモ1)にマウスを持って行くと、その時点での中身を見ることが出来ます。

 

【最後に】

このマクロではJwwに対して書き込む要素はありませんので、 少々間違えても元のファイルに傷を付けることはないと思いますが、万一Jwwを開いた(Open)あと閉じる(Close)までの間でマクロを完全停止させてしまった場合、次のマクロを実行して開い ているファイルを閉じて下さい。

Sub 応急処置()

    Close #Fn

End Sub

このページを通して少しでもVBAに興味を持ち、身近な物として感じて頂けましたら本望です。

Home          BBS


Copyright (C) 2004/2 F.Tohyama, All rights reserved.

あなたは累計
人目の訪問者です。

(本日は   番目のアクセスです。 また昨日は 人のご来場者がありました)