2011年12月25日日曜日

[ExcelVBA] 条件を満たす行を取り除く


■お題
条件を満たす行を取り除く(問題出典:どう書く?org)
- 問題詳細 -
ファイルから1行ずつ読み込み、"#"で始まる行だけを取り除いてファイルに出力するコードを書いてください。
サンプル入力

hello!
# remove this
# don't remove this
bye!
サンプル出力
hello!
# don't remove this
bye!

■解答例
ファイルのオープンの仕方、1文字目の判定ができればよいですね。
読込むファイルデータは、Sample.txtとして上記サンプルを同一フォルダ内に保存しています。

では、コードです。
Option Explicit

Sub main()
    Dim FH As Integer
    FH = FreeFile
    
    Dim OneLine As String
    Open "Sample.txt" For Input As #FH
        Do Until EOF(FH)
            Line Input #FH, OneLine
            If Left(OneLine, "1") <> "#" Then Debug.Print OneLine
        Loop
    Close #FH
End Sub
4行目:変数 FH は、ファイル識別番号を格納する用
5行目:Freefileを使うことでダブりなくファイル識別番号を割り当てる

7行目:変数 Oneline は、ファイルを開き1行のデータを受取る用
8行目:ファイルを開く
9行目:ファイルの最終行でなければループを続ける
10行目:ファイルの1行データをOneLineに格納する
11行目:Left関数で1行の最初の文字が#でなければ出力する
12行目:繰り返し
13行目:ファイル閉じる


実行結果
-----------------------------
hello!
# don't remove this
bye!

-----------------------------

【別の方法】
最初の1文字目を判定する別の方法としてASC関数を使う方法がありますね。
ASC関数は、与えられた文字列の最初の文字のコードを返す関数です。
いちいち、1文字目とか指定する必要がありません。
具体的には・・・
If Asc(OneLine) <> 35 Then Debug.Print OneLine
でOKです。
ASC関数で1行目のデータを受取り1文字目が#の時は35を返すので
35じゃない時は、出力する。という風です。

0 件のコメント: