Excelファイルをテキスト化するツールをVBAで作成したのですが、添付画像の様に最終行に不要な空白行が作成されてしまいます。
最終行の一つ上の行の末尾に改行コードが有りそれを削除出来れば改善できると思います。
下記コードの最後のプロシージャがその為のコードなのですが上手く機能しません。
下記コードでおかしな所は有りますでしょうか?
もしくは他にテキストファイルの最終コードのみ削除する方法は有りますでしょうか?
お分かりになる方いらっしゃいましたらご教授をお願い致します。
Option
1Public WbName As String, WbPath As String, Alltxt As String 2Public SfilePath As String 3Public Wb As Workbook 4 5Sub All() 6 7 Call WbSet 8 Call WriteTxt 9 Call Sjis_To_Utf8 10 11End Sub 12Sub WbSet() 13'********************************************************* 14'* 対象ワークブックを開く 15'********************************************************* 16 17 Dim Openfilename As String 18 Dim i As Integer 19 Dim fso As Object 20 21 Set fso = CreateObject("Scripting.FileSystemobject") 22 23 Application.ScreenUpdating = False 24 Application.DisplayAlerts = False 25 26 27 Openfilename = Application.GetOpenFilename("Microsoft Excelブック,*.xls?", , _ 28 "対象InputFileを選択して下さい") 29 i = 0 30 If Openfilename <> "False" Then 31 Workbooks.Open Openfilename 32 i = 1 33 ElseIf i = 0 Then 34 MsgBox "キャンセルされました" 35 End 36 End If 37 38 ' ネットワークフォルダで実行するか、ローカルフォルダで実行するかの分岐 39 If Left(ThisWorkbook.Path, 2) = "\" Then 40 ' ネットワークフォルダで実行時 41 With CreateObject("Wscript.Shell") 42 .CurrentDirectory = ActiveWorkbook.Path 43 End With 44 Else 45 ' ローカルフォルダで実行時 46 ChDir ActiveWorkbook.Path 47 End If 48 49 If fso.FolderExists(ActiveWorkbook.Path & "\" & "txt") = False Then 50 fso.CreateFolder (ActiveWorkbook.Path & "\" & "txt") 51 End If 52 53 Set Wb = ActiveWorkbook 54 55 WbPath = ActiveWorkbook.Path & "\" & "txt" 56 WbName = ActiveWorkbook.Name 57 58 Application.ScreenUpdating = True 59 Application.DisplayAlerts = True 60 61End Sub 62 63Sub WriteTxt() 64 65 Dim rUsed As Range 66 Dim r As Range 67 Dim S As String, result As String 68 Dim fs As New filesystemobject 69 Dim ts As TextStream 70 Dim IRow As Long 71 Dim re As Object 72 73 SfilePath = WbPath & "\" & Left(WbName, Len(WbName) - 5) & ".txt" 74 75 Set ts = fs.CreateTextFile(SfilePath, True, False) 76 77 Set rUsed = ActiveSheet.UsedRange 78 79 IRow = 0 80 81 For Each r In rUsed 82 If IRow <> r.Row Then 83 If r.Row <> rUsed.Row Or r.Column <> rUsed.Column Then 84 S = S & vbCrLf 85 End If 86 S = S & r.Text 87 Else 88 S = S & vbTab & r.Text 89 End If 90 91 IRow = r.Row 92 Next 93 94' S = Replace(S, vbCrLf, "") 95 96' Set re = CreateObject("VBScript.RegExp") 97' 98' re.Pattern = vbCrLf & "+$" 99' result = re.Replace(S, "") 100' Set re = Nothing 101' S = result 102 103' Call DeleteCRLF(S) 104 Call ts.WriteLine(S) 105 Wb.Close 106 107End Sub 108 109Sub Sjis_To_Utf8() 110 111 Dim streamRead As New ADODB.Stream 112 Dim streamWrite As New ADODB.Stream 113 Dim sText As Variant 114 115' ファイル読込 116 streamRead.Type = adTypeText 117 streamRead.Charset = "Shift-JIS" 118 streamRead.Open 119 Call streamRead.LoadFromFile(SfilePath) 120 121' 改行コードの変換 122 sText = streamRead.ReadText 123 sText = Replace(sText, vbCrLf, vbLf) 124 125' ファイル書き込み 126 streamWrite.Type = adTypeText 127 streamWrite.Charset = "UTF-8" 128 streamWrite.Open 129 130' Shift-JISデータをUTF-8にコピー 131 Call streamWrite.WriteText(sText) 132 133' バイナリモードで書き込み済みデータ開始位置をBOM分の3バイトをずらす 134 streamWrite.Position = 0 135 streamWrite.Type = adTypeBinary 136 streamWrite.Position = 3 137 138' 3バイトずらした状態のデータを取得 139 sText = streamWrite.Read 140 141' ずらした開始位置を元に戻す 142 streamWrite.Position = 0 143 144' BOMが除去されたデータを先頭から書き込みなおす 145 Call streamWrite.Write(sText) 146 147' 現時点の末尾を終端とし、直前に書き込まれていた3バイトをデータ対象外とする 148 streamWrite.SetEOS 149 150 Call streamWrite.SaveToFile(SfilePath, adSaveCreateOverWrite) 151 152 streamRead.Close 153 streamWrite.Close 154 155 MsgBox SfilePath & " 出力いたしました" 156 157End Sub 158 159 Public Function DeleteCRLF(ByVal strNewFileLine As String) 160 161 Dim re As Object 162 Dim result As String 163 164 Set re = CreateObject("VBScript.RegExp") 165 166 re.Pattern = "\n+$" 167' re.Pattern = vbCrLf & "+$" 168 result = re.Replace(strNewFileLine, "") 169 Set re = Nothing 170 DeleteCRLF = result 171 172' Call ts.WriteLine(DeleteCRLF) 173 174End Function 175コード
ちゃんと考えていないのでコメントに。 WriteTxt()で ts.WriteLine(S) を止めて S を戻り値にして Sjis_To_Utf8 に渡せば読み込みいらないような。あとはこれでも改行がでるなら S の末尾が改行改行なのかな?
下記ご回答いただいた方のご指摘箇所修正で解決出来ました。
コメントありがとうございました。
回答1件
あなたの回答
tips
プレビュー