解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

VBA によるテキスト処理




こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。




この記事の目次




目的


VBAを始めようとして、とりあえず『VBA』でインターネット検索をすると、『集計作業』、『報告書の作成作業』から始めると良いですよ!と書いてあるWebサイトが多々ありました。(筆者調べ)

そこで、報告書を作成するVBAは既にあるのですが、ソースコードもエクセルも整理されていないので、ここでちょっと整理して1つにまとめてみようと思います。

まとめ方としては、こんな感じでしょうかね。
①ファイル入力
②テキスト処理
③ファイル出力

この記事は、テキスト処理!!




関数

テキスト読み込み

どんな集計作業も報告書作成も元になるファイルがあるわけで、そのファイルを読み込まないと始まりません。

ソースコード
〜テキスト読み込み〜

先ずはファイルパスからテキストを読み込みます。

ファイル入力のインターフェースは下の図1の様なインターフェースを想定しています。

図1 ファイル入力インターフェース


'Public Const ShName = "ファイル入力"
'Public Const fld行 = 8
'Public Const fil行 = 11
'Public Const Name列 = 3
'Public Const Path列 = 9

Public Const ShName1 = "メモリ"
Public Const txt行 = 1
Public Const txt列 = 1

Sub ファイルパスリボルブ()
    
    i = fil行
    With ThisWorkbook.Worksheets(ShName)
        
        fPath = .Calls(i, Path列).Value
        While fPath <> ""
            
            Call テキスト読込(fPath)
            
            ' ここに『テキスト処理関数』を追加する
            '************************
            
            
            
            '************************
            
            i = i + 1
            fPath = .Calls(i, Path列).Value
            
        Wend
        
    End With
    
End Sub

Sub テキスト読込(ByVal fPath)
    
    Dim n As Integer
    Dim i As Integer
    Dim txtLine As String
    Dim FSO As Object
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    If Not FSO.FileExists(fPath) Then
    
        MsgBox "ファイルが存在しません"
        Exit Sub
        
    End If
    
    i = txt行
    
    n = FreeFile
    Open fPath For Input As #n
    
    Do While Not EOF(n)
        Line Input #n, txtLine
        ThisWorkbook.Worksheets(ShName1).Cells(i, txt列).Value = txtLine
        i = i + 1
    Loop
    
    Close #n
    
    Set FSO = Nothing
    
End Sub

テキスト処理

上のソースコード①で Excel にテキストを読み込みました。
ですが、読み込んだだけでまだ何もしてません。
今、テキストを自然言語だとします。つまり、日本語の文章が書かれているという事です。
かなり Microsoft Word の機能が使えるので、ちょっと処理してみます。

ソースコード
〜Word出力〜

Microsoft Word の機能を使うために Word をExcel VBA から起動して、テキストを Word に出力してみます。

Function Excel2Word()
    
    Set WdApp = CreateObject("Word.Application")
    WdApp.Visible = True
    WdApp.documents.Add
    
    i = txt行
    
    txtLine = ThisWorkbook.Worksheets(ShName1).Cells(i, txt列).Value
    While txtLine <> ""
        WdApp.Selection.typetext Text:=txtLine
        i = i + 1
        txtLine = ThisWorkbook.Worksheets(ShName1).Cells(i, txt列).Value
    Wend
    
    Set Excel2Word = WdApp
    
    Set WdApp = Nothing
    
End Function

ソースコード
〜文カウント〜

Microsoft Word に出力した文章がどれだけの文で構成されているかをカウントしてみます。

Function 文カウント(ByVal WdApp)
    
    Set Doc = WdApp.ActiveDocument
    Set Rng = Doc.Paragraphs(1).Range
    
    i = 0
    
    For Each stc In Rng.Sentences
        
        i = i + 1
        
    Next
    
    文カウント = i
    
End Function

ソースコード
〜単語カウント〜

今度は Microsoft Word に出力した文章がどれだけの単語で構成されているかをカウントしてみます。
ただし、このコードだと文章を構成する単語数をカウントするので、単語の重複は無視した単語数になります。

Function 単語カウント(ByVal WdApp)
    
    Set Doc = WdApp.ActiveDocument
    Set Rng = Doc.Paragraphs(1).Range
    
    i = 0
    
    For Each wrd In Rng.Words
        
        i = i + 1
        
    Next
    
    単語カウント = i
    
End Function

使い方

ソースコード①で書いた『ファイルパスリボルブ』に記載しておいた "ここに『テキスト処理関数』を追加する" という箇所にテキスト処理関数を記載します。

Sub ファイルパスリボルブ()
    
    i = fil行
    With ThisWorkbook.Worksheets(ShName)
        
        fPath = .Calls(i, Path列).Value
        While fPath <> ""
            
            Call テキスト読込(fPath)
            
            ' ここに『テキスト処理関数』を追加する
            '************************
            Set WdApp = Excel2Word()
            文数 = 文カウント(WdApp)
            単語数 = 単語カウント(WdApp)
            '************************
            
            i = i + 1
            fPath = .Calls(i, Path列).Value
            
        Wend
        
    End With
    
End Sub




コメント

テキスト出力処理が未実装なので、このままではテキスト処理の結果が確認出来ない状態です。
早くファイル出力の内容をまとめます。




以上