見出し画像

【VBA関数】テキストファイル保存(UTF8)

長年お世話になってきたVB6やVB.NETの膨大なコードをVBA用に移植してく記事ですよ。今回は、VBAでテキストファイルを保存する際に使える、UTF-8(BOMなし)形式でのテキストファイル保存関数を紹介します。

なお、変数はほとんど"v"で始めるなど、常識的ではない部分も多いのでご利用の際はご注意ください。

マクロで直接Wordの文書やExcelのシートを書き換えるのではなく、見つけた問題点を書き出す際などに利用します。

関数:TextSaveUTF8N

Function TextSaveUTF8N(ByRef aPath As String, ByRef aFullText As String) As Boolean
'UTF-8(BOMなし)形式でテキストファイルを保存'
On Error GoTo errored

Dim oStream As Object
Dim vTemp

   'オブジェクトを作成'
   Set oStream = CreateObject("ADODB.Stream")

   With oStream
   
       '設定'
       .Type = 2 '(=テキスト)'
       .Charset = "UTF-8"
   
       'オブジェクトを開く'
       Call .Open
       'テキストを書き込む'
       Call .WriteText(aFullText)
   
       'バイナリデータを取得'
       .Position = 0 '先頭へ移動して..'
       .Type = 1 '..バイナリデータに変更'
       .Position = 3 '3バイト飛ばして...'
       vTemp = .Read '..読み取る'
   
       '閉じる'
       Call .Close
   End With

   'オブジェクトを再作成'
   Set oStream = CreateObject("ADODB.Stream")

   With oStream
       '設定'
       .Charset = "UTF-8"
       .LineSeparator = 10 '=adLF(行送り)'
       .Type = 1 '(=バイナリデータ)'
   
       'オブジェクトを開く'
       Call .Open
   
       'バイナリデータを書き込む'
       Call .write(vTemp)
       Call .SetEOS '(末尾指定)'
   
       'ファイルへ保存'
       Call .SaveToFile(aPath, 2) '2=上書き保存'
   
       '閉じる'
       Call .Close
   End With

   'オブジェクトを解放'
   Set oStream = Nothing

   '戻り値: 成功'
   TextSaveUTF8N = True
   Exit Function

errored:
'(エラー処理)'
   'オブジェクトを解放'
   Set oStream = Nothing
   '戻り値: 失敗'
   TextSaveUTF8N = False

End Function

Excelでの使用例

以下はExcelでの使用例。A1から始めて、A2、A3……と空白になるまでセルの内容を読み取り、test.txtに保存します。

Sub ExcelTest_TextSaveUTF8()

   '保存先を決定'
   Dim vPath As String
       vPath = ".\test.txt"

   'テキスト生成(テスト用サンプル)'
   Dim vFullText As String, vCurText As String, y As Long
   Do
       'セル取得'
       y = y + 1
       vCurText = Range("A" & y)
       If vCurText <> "" Then
       '(値があれば)'
           'テキスト追加'
           vFullText = vFullText & vCurText & vbCrLf
       Else
       '(空白なら)'
           vFullText = vFullText & y & "行目はありませんでした。" & vbCrLf
           'ループを抜ける'
           Exit Do
       End If
   Loop

   'セーブ実行'
   If TextSaveUTF8N(vPath, vFullText) = True Then
       Call MsgBox("セーブ成功!", vbOKOnly)
   Else
       Call MsgBox("セーブ失敗...", vbOKOnly)
   End If

End Sub

Wordでの使用例

次はWordでの使用例。現在の文字数と、文書全体をtest.txtに保存します。

Sub WordTest_TextSaveUTF8N()

   '保存先を決定'
   Dim vPath As String
   vPath = ".\test.txt"

   'テキスト生成(テスト用サンプル)'
   Dim vFullText As String
   vFullText = "総文字数=" & ThisDocument.Characters.Count & vbCrLf
   vFullText = vFullText & "--------" & vbCrLf
   vFullText = vFullText & ThisDocument.Range(0).Text

   'セーブ実行'
   If TextSaveUTF8N(vPath, vFullText) = True Then
       Call MsgBox("セーブ成功!", vbOKOnly)
   Else
       Call MsgBox("セーブ失敗...", vbOKOnly)
   End If

End Sub

もっとも、VB6では文字形式なんて気にするまでもなくANSI一択だったので、今回のコードはほぼ書き直したんですけどね。

次回は、保存したテキストファイルを開く方法を紹介します。


この記事が気に入ったらサポートをしてみませんか?