● ファイル読み込み・書き込み各種 ●

とりあえず必要そうなパターンを列挙!!

'-----------------------------------------------------------------------
' 関数名 : SequentialOutput
' 機能   : 1行ずつ健気に書き込む
' 引数   : なし
' 戻り値 : True…正常終了   False…異常終了
' 備考   : 上書きモードと追加書き込みモードを併記しておく
'-----------------------------------------------------------------------
Public Function SequentialOutput() As Boolean

    On Error GoTo ErrHandler

    Dim FileNum As Integer

    'ファイル番号取得
    FileNum = FreeFile

    '↓上書きモードでファイルを開いて出力する場合
    Open "Sample01.txt" For Output As #FileNum
    '↓追加書き込みモードでファイルを開いて出力する場合
    'Open "Sample01.txt" For Append As #FileNum
        Print #FileNum, "あいうえお"
        ',(カンマ)で区切ると何故かスペースが出力されてしまう
        Print #FileNum, "かきくけこ", "さしすせそ"; ","; "ざじずぜぞ"
        Print #FileNum, "たちつ";
        Print #FileNum, "てと"
        Print #FileNum, "なにぬねの"
        'Writeとするとカンマ区切りで出力される
        '出力される文字は ""(ダブル・クォーテーション)で囲まれる
        Write #FileNum, "はひふへほ", "まみむめも", "やゐゆゑよ"
    Close #FileNum

NormalExit:
    SequentialOutput = True
    Exit Function

ErrHandler:
    Call MsgBox("エラーNo." & Err.Number & vbCrLf & vbCrLf & _
                Err.Description, vbExclamation, "XXXXXXX - エラー")

End Function

[出力結果]
あいうえお
かきくけこ         さしすせそ,ざじずぜぞ
たちつてと
なにぬねの
"はひふへほ","まみむめも","やゐゆゑよ"


'-----------------------------------------------------------------------
' 関数名 : SequentialInput
' 機能   : 1行ずつ健気に読み込む
' 引数   : なし
' 戻り値 : True…正常終了   False…異常終了
' 備考   : 読み込み方法をそれぞれ書いておく
'-----------------------------------------------------------------------
Public Function SequentialInput() As Boolean

    On Error GoTo ErrHandler

    Dim FileNum As Integer
    Dim ReadLine1 As String
    Dim ReadLine2 As String
    Dim ReadLine3 As String
    Dim ReadLine4 As String
    Dim ReadLine5 As String

    'ファイル番号取得
    FileNum = FreeFile

    'ファイルを開いて入力
    Open "Sample01.txt" For Input As #FileNum
        If Not EOF(FileNum) Then
            'Input は「改行」または「カンマ」単位で読み込む
            'CSVファイルを読むときは Input を使う
            Input #FileNum, ReadLine1, ReadLine2, ReadLine3
            Input #FileNum, ReadLine4
            Input #FileNum, ReadLine5
        End If

        Debug.Print "=-=-=-=-=-=- Inputでの読み込み -=-=-=-=-=-="
        Debug.Print "? 1:" & ReadLine1
        Debug.Print "? 2:" & ReadLine2
        Debug.Print "? 3:" & ReadLine3
        Debug.Print "? 4:" & ReadLine4
        Debug.Print "? 5:" & ReadLine5

        '先頭にシーク
        Seek #FileNum, 1

        If Not EOF(FileNum) Then
            'Line Input は「改行」単位で読み込む
            Line Input #FileNum, ReadLine1
            Line Input #FileNum, ReadLine2
            Line Input #FileNum, ReadLine3
            Line Input #FileNum, ReadLine4
            Line Input #FileNum, ReadLine5
        End If
        
        Debug.Print "=-=-=-=-=-=- Line Inputでの読み込み -=-=-=-=-=-="
        Debug.Print "? 1:" & ReadLine1
        Debug.Print "? 2:" & ReadLine2
        Debug.Print "? 3:" & ReadLine3
        Debug.Print "? 4:" & ReadLine4
        Debug.Print "? 5:" & ReadLine5

        '先頭にシーク
        Seek #FileNum, 1

        Debug.Print "=-=-=-=-=-=- ループで1行ずつの読み込み -=-=-=-=-=-="
        Do Until EOF(FileNum)
            Line Input #FileNum, ReadLine1
            Debug.Print "? 0:" & ReadLine1
        Loop

    Close #FileNum

NormalExit:
    SequentialInput = True
    Exit Function

ErrHandler:
    Call MsgBox("エラーNo." & Err.Number & vbCrLf & vbCrLf & _
                Err.Description, vbExclamation, "XXXXXXX - エラー")

End Function

[イミディエイトウィンドウの表示結果]
=-=-=-=-=-=- Inputでの読み込み -=-=-=-=-=-=
? 1:あいうえお
? 2:かきくけこ         さしすせそ
? 3:ざじずぜぞ
? 4:たちつてと
? 5:なにぬねの
=-=-=-=-=-=- Line Inputでの読み込み -=-=-=-=-=-=
? 1:あいうえお
? 2:かきくけこ         さしすせそ,ざじずぜぞ
? 3:たちつてと
? 4:なにぬねの
? 5:"はひふへほ","まみむめも","やゐゆゑよ"
=-=-=-=-=-=- ループで1行ずつの読み込み -=-=-=-=-=-=
? 0:あいうえお
? 0:かきくけこ         さしすせそ,ざじずぜぞ
? 0:たちつてと
? 0:なにぬねの
? 0:"はひふへほ","まみむめも","やゐゆゑよ"


'-------------------------------------------------------------------
' 関数名:BinaryInput
' 機能  :ファイル全体を一気に読み込む
' 引数  :なし
' 返り値:なし
' 備考  :エラー処理は面倒なので省略
'-------------------------------------------------------------------
Public Sub BinaryInput()

    Dim TextDataBuff As String  '文字列格納用バッファ
    Dim FileNum As Integer      'ファイルナンバー

    '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    'バイナリモードで開いてString変数に一気に読み込む方法(3番目に速い)
    '=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    'ファイル番号取得
    FileNum = FreeFile

    'Access Read を宣言すると読み込み専用となる
    Open "Sample01.txt" For Binary Access Read As #FileNum
        TextDataBuff = Input$(LOF(FileNum), #FileNum)
    Close #FileNum
    Debug.Print "[" & TextDataBuff & "]"

    '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    'バイナリモードで開いてByte配列変数に一気に読み込む方法(2番目に速い)
    '=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Dim TextByteData() As Byte  '文字列格納用バッファ(バイト配列)
    Dim FileSize As Long

    'ファイル番号取得
    FileNum = FreeFile

    Open "Sample01.txt" For Binary Access Read As #FileNum
        FileSize = LOF(FileNum)
        'ファイルサイズ分メモリー再確保
        ReDim TextByteData(FileSize - 1) As Byte
        TextByteData() = InputB(FileSize, #FileNum)
    Close #FileNum

    'ANSI → Unicode 変換
    Debug.Print "[" & StrConv(TextByteData(), vbUnicode) & "]"

    '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    'バイナリモードで開いてGetメソッドで読み込む方法(1番速い)
    'String変数でも出来るが、Byte配列変数を使用する。Byteの方が速いし!!
    '=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    'ファイル番号取得
    FileNum = FreeFile

    Open "Sample01.txt" For Binary Access Read As #FileNum
        'ファイルサイズ分メモリー再確保
        ReDim TextByteData(FileSize - 1) As Byte
        Get #FileNum, , TextByteData()
    Close #FileNum

    'ANSI → Unicode 変換
    Debug.Print "[" & StrConv(TextByteData(), vbUnicode) & "]"

End Sub

[イミディエイトウィンドウの表示結果]
[あいうえお
かきくけこ         さしすせそ,ざじずぜぞ
たちつてと
なにぬねの
"はひふへほ","まみむめも","やゐゆゑよ"
]
[あいうえお
かきくけこ         さしすせそ,ざじずぜぞ
たちつてと
なにぬねの
"はひふへほ","まみむめも","やゐゆゑよ"
]
[あいうえお
かきくけこ         さしすせそ,ざじずぜぞ
たちつてと
なにぬねの
"はひふへほ","まみむめも","やゐゆゑよ"
]


↓Putメソッドで可変データを出力するサンプル。
↓ここでは以下のビットマップを出力する。コーディングは極めてベタ書き。
Private Type BITMAPFILEHEADER
    bfType As Integer       'この構造体のタイプ
    bfSize As Long          'ビットマップのファイルサイズ
    bfReserved1 As Integer  '予約、常に0
    bfReserved2 As Integer  '予約、常に0
    bfOffBits As Long       'この構造体からビットマップデータまでのオフセット
End Type

Private Type BITMAPINFOHEADER
    biSize As Long          'この構造体のサイズ
    biWidth As Long         'ピクセルデータの幅
    biHeight As Long        'ピクセルデータの高さ
    biPlanes As Integer     'カラープレーンの高さ
    biBitCount As Integer   'ピクセルあたりのビット数(1,4,8,24のどれか)
    biCompression As Long   'ピクセルデータの圧縮形式
    biSizeImage As Long     'ピクセルデータのサイズ
    biXPelsPerMeter As Long '1mあたりの水平解像度
    biYPelsPerMeter As Long '1mあたりの垂直解像度
    biClrUsed As Long       '使用するカラーインデックスの数
    biClrImportant As Long  '表示に使用するカラーインデックスの数(通常は0)
End Type

'16色用パレット
Private Type RGBQUAD
    b As Byte
    g As Byte
    r As Byte
    p As Byte    '予約(0でよい)
End Type

'-------------------------------------------------------------------
' 関数名:OutputBitmap
' 機能  :16色ビットマップを適当に出力
' 引数  :なし
' 返り値:なし
' 備考  :黒から白まで16色を出力する適当なサンプル
'-------------------------------------------------------------------
Public Sub OutputBitmap()

    Dim udtBitmapFileHeader As BITMAPFILEHEADER
    Dim udtBitmapInfoHeader As BITMAPINFOHEADER
    Dim udtRGBQUAD(15) As RGBQUAD
    Dim Colors(7) As Byte
    Dim FileNum As Integer
    Dim i As Long

    With udtBitmapFileHeader
        .bfType = &H4D42 '保存時に「BM」となる
        '↓BITMAPFILEHEADER(40) + BITMAPINFOHEADER(14) + RGBQUAD(4*16)
        .bfOffBits = 118
        '↓udtBitmapFileHeader.bfOffBits + 8(要するにファイルサイズ)
        .bfSize = udtBitmapFileHeader.bfOffBits + 8
    End With

    With udtBitmapInfoHeader
        .biSize = Len(udtBitmapInfoHeader) '40バイト
        .biWidth = 16                      '幅
        .biHeight = 1                      '高さ
        .biPlanes = 1                      '常に1
        .biBitCount = 4                    '16色なので4ビット
        .biSizeImage = 8                   '16色なので8バイト
                                           '↑1バイトで2ピクセル保持するので
    End With

    '16色パレット作成
    With udtRGBQUAD(0)   '黒
        .r = 0: .g = 0: .b = 0
    End With
    With udtRGBQUAD(1)   '茶色
        .r = 128: .g = 0: .b = 0
    End With
    With udtRGBQUAD(2)   '緑
        .r = 0: .g = 128: .b = 0
    End With
    With udtRGBQUAD(3)   'オリーヴ
        .r = 128: .g = 128: .b = 0
    End With
    With udtRGBQUAD(4)   '紺
        .r = 0: .g = 0: .b = 128
    End With
    With udtRGBQUAD(5)   '紫
        .r = 128: .g = 0: .b = 128
    End With
    With udtRGBQUAD(6)   '深緑
        .r = 0: .g = 128: .b = 128
    End With
    With udtRGBQUAD(7)   '銀色
        .r = 192: .g = 192: .b = 192
    End With
    With udtRGBQUAD(8)   '灰色
        .r = 128: .g = 128: .b = 128
    End With
    With udtRGBQUAD(9)   '赤
        .r = 255: .g = 0: .b = 0
    End With
    With udtRGBQUAD(10)  '黄緑
        .r = 0: .g = 255: .b = 0
    End With
    With udtRGBQUAD(11)  '黄色
        .r = 255: .g = 255: .b = 0
    End With
    With udtRGBQUAD(12)  '青
        .r = 0: .g = 0: .b = 255
    End With
    With udtRGBQUAD(13)  '桃色
        .r = 255: .g = 0: .b = 255
    End With
    With udtRGBQUAD(14)  '水色
        .r = 0: .g = 255: .b = 255
    End With
    With udtRGBQUAD(15)  '白
        .r = 255: .g = 255: .b = 255
    End With

    '16色ビットマップは2ピクセルを1バイトで保持する
    Colors(0) = &H0 * &H10 + &H1
    Colors(1) = &H2 * &H10 + &H3
    Colors(2) = &H4 * &H10 + &H5
    Colors(3) = &H6 * &H10 + &H7
    Colors(4) = &H8 * &H10 + &H9
    Colors(5) = &HA * &H10 + &HB
    Colors(6) = &HC * &H10 + &HD
    Colors(7) = &HE * &H10 + &HF

    FileNum = FreeFile

    Open "Color16.bmp" For Binary As #FileNum
        Put #FileNum, , udtBitmapFileHeader
        Put #FileNum, , udtBitmapInfoHeader
        Put #FileNum, , udtRGBQUAD()
        For i = 0 To UBound(Colors)
            Put #FileNum, , Colors(i)
        Next i
    Close #FileNum

End Sub


'-------------------------------------------------------------------
' 関数名:InputBitmap
' 機能  :16色ビットマップを適当に入力
' 引数  :なし
' 返り値:なし
' 備考  :白から黒まで16色を入力する適当なサンプル
'-------------------------------------------------------------------
Public Sub InputBitmap()

    Dim udtBitmapFileHeader As BITMAPFILEHEADER
    Dim udtBitmapInfoHeader As BITMAPINFOHEADER
    Dim udtRGBQUAD(15) As RGBQUAD
    Dim Colors(7) As Byte
    Dim FileNum As Integer
    Dim i As Long

    FileNum = FreeFile

    Open "Color16.bmp" For Binary As FileNum
        Get #FileNum, , udtBitmapFileHeader
        Get #FileNum, , udtBitmapInfoHeader
        Get #FileNum, , udtRGBQUAD()
        For i = 0 To UBound(Colors)
             Get #FileNum, , Colors(i)
        Next i
    Close FileNum

End Sub

戻る