top of page

Excel

​マクロメモ

Option Explicit

Const TextFolder As String = "F:\server\apple"    'テキスト格納フォルダ
Const BookFolder As String = "F:\server\apple2"    'excel Book格納フォルダ
Dim array_file() As String      'テキストファイル名の配列
Dim owb As Workbook             '出力ブック
Public Sub 全テキスト読込()
    Dim FSO As Object               'FileSystemObject
    Dim srcfolder As Object         'テキストファイルフォルダ
    Dim wfiles As Object            'テキストファイル一覧
    Dim wfile As Object             'テキストファイル
    Dim file_count As Long          'テキストファイルの件数
    Dim book_count As Long          'Bookの件数
    Dim book_no As Long             'ブック番号
    Dim sheet_no As Long            'シート番号
    Dim save_count As Variant       '退避領域
    Dim book_name As String         '出力ブック名
    Dim ret As Boolean              '戻り値
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set srcfolder = FSO.GetFolder(TextFolder)   'テキストファイル格納フォルダ情報取得
    Set wfiles = srcfolder.Files    'ファイル一覧取得
    file_count = 0
    '拡張子が.txtのファイルのみ取得し、array_fileに格納する
    For Each wfile In wfiles
        If LCase(Right(wfile.Name, 4)) = ".txt" Then
            ReDim Preserve array_file(file_count)
            array_file(file_count) = wfile.Name
            file_count = file_count + 1
        End If
    Next
    '出力するBookの件数を求める
    book_count = file_count \ 8
    'テキストファイル件数が8で割り切れないならBook件数に1加算
    If file_count Mod 8 > 0 Then
        book_count = book_count + 1
    End If
    'Book作成時のワークシートの数を退避
    save_count = Application.SheetsInNewWorkbook
    'Book作成時のワークシートの数を8に設定
    Application.SheetsInNewWorkbook = 8
    '1~Book件数まで繰り返す
    For book_no = 1 To book_count
        Set owb = Workbooks.Add
        'シート番号を1~8迄繰り返す
        For sheet_no = 1 To 8
            '1シート分を作成する
            ret = set_sheet(book_no, sheet_no)
            'テキストファイル数の上限を超えているなら打ち切る
            If ret = False Then Exit For
        Next
        'ブック名をBook+連番で出力する
        book_name = BookFolder & "\Book" & book_no & ".xlsx"
        owb.SaveAs Filename:=book_name
        owb.Close
    Next
    '退避したBook作成時のワークシートの数を戻す
    Application.SheetsInNewWorkbook = save_count
    MsgBox ("完了")
End Sub

'ブック番号(1~N)とシート番号(1~8)を元に、該当シートへテキストファイルを読み込む
Private Function set_sheet(ByVal book_no As Long, ByVal sheet_no As Long) As Boolean
    Dim i As Long
    Dim fname As String     'テキストファイル名(フルパス)
    Dim fileNo As Long      'ファイル番号
    Dim lno As Long         '行番号
    Dim text As String      '読み込んだテキスト
    Dim RE As Object        '正規表現オブジェクト
    Dim sname As String     'シート名
    Set RE = CreateObject("VBScript.RegExp")
    '1行が空白行か否かの判定用
    RE.Pattern = "^\s*$"
    RE.Global = True
    set_sheet = False
    'array_fileの何番目かを求める
    i = (book_no - 1) * 8 + sheet_no - 1
    '上限を超えているならFlaseで終了
    If i > UBound(array_file) Then Exit Function
    'テキストファイル名及びその拡張子を除いたものを取得
    fname = TextFolder & "\" & array_file(i)
    sname = array_file(i)
    sname = Left(sname, Len(sname) - 4)
    Dim ADOST As Object
    Set ADOST = CreateObject("ADODB.Stream")
    With ADOST
        .Charset = "UTF-16"
        .Open
        .LoadFromFile fname
        lno = 0
        Do Until (.EOS)
            '1行読み込み
            text = .ReadText(-2)
            lno = lno + 1
            'A列の該当行へ設定
            owb.Worksheets(sheet_no).Cells(lno, "A").Value = text
        Loop
        .Close
    End With
    'シート名を設定
    owb.Worksheets(sheet_no).Name = sname
    '正常終了
    set_sheet = True
End Function

bottom of page