質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

10540閲覧

VBAでExcelファイルからテキストファイルを作成時に最終行に空白行が出ない様にしたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2021/04/22 00:37

編集2021/04/22 01:34

イメージ説明

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コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mdj

2021/04/22 06:06

ちゃんと考えていないのでコメントに。 WriteTxt()で ts.WriteLine(S) を止めて S を戻り値にして Sjis_To_Utf8 に渡せば読み込みいらないような。あとはこれでも改行がでるなら S の末尾が改行改行なのかな?
退会済みユーザー

退会済みユーザー

2021/04/22 10:02

下記ご回答いただいた方のご指摘箇所修正で解決出来ました。 コメントありがとうございました。
guest

回答1

0

ベストアンサー

WriteLine()だとメソッド名通り出力の最後に改行が出力されるので、Write()でいいのではないでしょうか。

VBScript

1 ' Call ts.WriteLine(S) 2 Call ts.Write(S)

投稿2021/04/22 07:26

Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/22 10:00

ご指摘の通りで解決出来ました。 有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問