(VBA) 不要な複数改行の削除

このQ&Aのポイント
  • VBAを使用してテキストファイル中の不要な複数改行を削除する方法について
  • 変換元のテキストと返還後のシートの内容を示し、不必要な改行を削除する方法について説明します
  • 理想とする返還後のシート内容を示し、上側の不必要な改行が削除されていない状態を改善する方法について説明します
回答を見る
  • ベストアンサー

(VBA) 不要な複数改行の削除

この質問は、  以下の質問の追加(不随)となります。 テキストファイル中のカタカナ文字をスペースに変換 https://okwave.jp/qa/q9912531.html >変換元のテキストと >期待する返還後のシートの内容を示してください。 以下の画像を参照ください。 https://imgur.com/e3M7FlU sheet1にターゲットのテキストファイルが読み込まれています sheet2に半角カタカナ文字をが削除された返還後のテキストファイル  上側が変換元のテキスト(カタカナ文字削除後) 緑色の枠の中  下側が理想とする返還後のシート内容です。   赤色の枠の中 (手動で不要な複数改行を削除して作成) 下側のように変換されてほしいのに  上側のように不必要な改行が削除されていません。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.6

画像の赤枠の所は記号だと思います。 EmEditorで文字コードを表示するには 表示したい文字のすぐ左側にカーソルを置いて、[表示] メニューの [文字コード値] を選択します。 のようです。 現状はファイル書き出しにしていますので、セルにだけ書き出したい場合は、コメント部分を有効にしてファイル書き出し部分をコメントにしてください。 元ファイル あアんンぱ  パんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ アアアアアア ____________________←もとから半角スぺース あアんンぱパんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ アアアアアア あアんンぱパんンまマんンがガあアるルくクよ を 新ファイル あ ん ぱ   ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ にします。 Sub Test() Dim j As Long, n As Long, cnt As Long Dim SelectFile As Variant Dim buf As String, buf2 As String, tmp As String Dim mCha As String, NewFileName As String Dim mPath As String Dim FileNum As Integer 'ChDir "C:\Users\NuNu\Desktop" SelectFile = Application.GetOpenFilename("txtファイル(*.txt),*.txt") If VarType(SelectFile) = vbBoolean Then MsgBox "キャンセルされました" Else 'MsgBox SelectFile & " が選択されました" Open SelectFile For Input As #1 End If n = 1 Do Until EOF(1) Line Input #1, buf If Len(buf) > 1 Then For j = 1 To Len(buf) mCha = Mid(buf, j, 1) If mCha Like "[ヲ-゚ ]" Then tmp = tmp & " " Else tmp = tmp & mCha End If Next If Len(Replace(StrConv(tmp, vbNarrow), " ", "")) > 1 Then cnt = 0 ' Cells(n, "A").Value = tmp ' n = n + 1 buf2 = buf2 & tmp & vbCrLf End If tmp = "" Else If cnt = 0 Then ' Cells(n, "A").Value = buf ' n = n + 1 buf2 = buf2 & vbCrLf End If cnt = cnt + 1 End If Loop Close #1 NewFileName = "New" & Dir(SelectFile) mPath = ThisWorkbook.Path & "\" & NewFileName FileNum = FreeFile Open mPath For Output As #FileNum Print #FileNum, buf2 Close #FileNum End Sub

NuboChan
質問者

お礼

kkkkkmさん、修正されたコードをありがとうございます。 普段、テキストファイルは「メモ帳」を利用する事が多く Em Editorは、テキストファイルの比較に利用する程度で  文字コードをチェックする機能がある事を知りませんでした。 (教えていただきありがとうございます。) 半角スペース : U+0020 / shiftJIS 0x20 改行     : U+000DU+000A / shiftJIS 0x0D 0x0A 修正コードで思いどうりに不要な連続する  改行もどき(連続する複数の半角スペース+改行)を  一つの改行だけにできました。

その他の回答 (8)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.9

> n=1の事でしょうか? > 1が何を示すかがよく分かりません。? またまた書き方が間違いでした。>は引用符と認識されることを考えていませんでした。 文字数を数えている所で Len(buf) > 1 Len(Replace(StrConv(tmp, vbNarrow), " ", "")) > 1 のところの > 1 が > 0 でした。 1文字以上と考えていて、つい「1」としてしまってました。

NuboChan
質問者

お礼

こちらこそ引用符と不等号の判断を間違っていました。 修正依頼の(>1の件)2か所を修正しました。 最後までお付き合い願いありがとうございました。 おかげさまで解決しました。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.8

> Em Editorは、テキストファイルの比較に利用する程度で 有料のやつですよね…なんかもったいない感じですね。 あと > 1 が2か所あるのは > 0 でした。

NuboChan
質問者

補足

>有料のやつですよね…なんかもったいない感じですね。    emeditorのテキストファイルの比較が優秀なので時々利用する程度で     確かにもったいないですね。 >あと > 1 >が2か所あるのは > 0 >でした。 n=1の事でしょうか? 1が何を示すかがよく分かりません。?

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.7

半角スペースと改行の行を改行だけに変更するコードを加えました。 Option Explicit Sub Sample1() Dim buf As String Dim Target Dim tmp1 Dim wkText As String Dim i As Long Target = _ Application.GetOpenFilename(Filefilter:="ansiのテキストファイル,*.txt") If Target = False Then Exit Sub With CreateObject("ADODB.Stream") .Charset = "Shift_jis" .Open .LoadFromFile Target buf = .ReadText buf = ChgKana(buf) '半角と改行だけの行を改行だけの行に変更 wkText = "" tmp1 = Split(buf, vbCrLf) For i = 0 To UBound(tmp1) If Trim(tmp1(i)) = "" Then wkText = wkText & vbCrLf Else wkText = wkText & tmp1(i) & vbCrLf End If Next i '改行が3つ連続していたら、改行を2つに変更 Do If InStr(wkText, vbCrLf & vbCrLf & vbCrLf) = 0 Then Exit Do wkText = Replace(wkText, vbCrLf & vbCrLf & vbCrLf, vbCrLf & vbCrLf) Loop .Close .Open .writetext wkText .savetofile Target, 2 .Close End With End Sub Function ChgKana(text As String) As String Dim MyLen As Long Dim wkStr As String Dim i As Long MyLen = Len(text) wkStr = "" For i = 1 To MyLen If ( _ (Asc(Mid(text, i, 1)) >= &HA6) And _ (Asc(Mid(text, i, 1)) <= &HDF)) Then wkStr = wkStr & " " Else wkStr = wkStr & Mid(text, i, 1) End If Next i ChgKana = wkStr End Function

NuboChan
質問者

お礼

HohoPapaさん、修正されたコードありがとうございます。 不要な改行もどきの行が削除されて  テキストファイルが更新されるのを確認しました。 前の質問から引き続き参加いただき感謝いたします。 やりたいことが出来たので終了にしますね。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.5

ループの前という書き方が間違ってましたDoの前でした。 複数ある改行を一つだけにしたいという事だと思いますので 現状はファイル書き出しにしていますので、セルにだけ書き出したい場合は、コメント部分を有効にしてファイル書き出し部分をコメントにしてください。 buf2 = buf2 & vbCrLf の2か所と 最後の方の NewFileName = "New" & Dir(SelectFile) mPath = ThisWorkbook.Path & "\" & NewFileName FileNum = FreeFile Open mPath For Output As #FileNum Print #FileNum, buf2 Close #FileNum 部分です。 元ファイル ↓ あアんンぱ  パんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ が 新ファイル ↓ あ ん ぱ   ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ になります。 Sub Test() Dim j As Long, n As Long, cnt As Long Dim SelectFile As Variant Dim buf As String, buf2 As String Dim mCha As String, NewFileName As String Dim mPath As String Dim FileNum As Integer 'ChDir "C:\Users\NuNu\Desktop" SelectFile = Application.GetOpenFilename("txtファイル(*.txt),*.txt") If VarType(SelectFile) = vbBoolean Then MsgBox "キャンセルされました" Else 'MsgBox SelectFile & " が選択されました" Open SelectFile For Input As #1 End If n = 1 Do Until EOF(1) Line Input #1, buf If Len(buf) > 1 Then For j = 1 To Len(buf) mCha = Mid(buf, j, 1) If mCha Like "[ヲ-゚ ]" Then buf2 = buf2 & " " Else buf2 = buf2 & mCha End If Next cnt = 0 ' Cells(n, "A").Value = buf2 ' n = n + 1 ' buf2 = "" buf2 = buf2 & vbCrLf 'ここ Else If cnt = 0 Then ' Cells(n, "A").Value = buf ' n = n + 1 buf2 = buf2 & vbCrLf 'ここ End If cnt = cnt + 1 End If Loop Close #1 NewFileName = "New" & Dir(SelectFile) mPath = ThisWorkbook.Path & "\" & NewFileName FileNum = FreeFile Open mPath For Output As #FileNum Print #FileNum, buf2 Close #FileNum End Sub

NuboChan
質問者

補足

HohoPapaさん、kkkkkmさん 回答感謝します。 HohoPapaさんに指摘されて気が付きました。 提示したサンプル画像のテキスト情報ですが 空行に見える行は改行だけではありませんでした。 指摘されたように半角スペースの連続と最後に改行でした。 (半角のカタカナを半角のスペースに変換したので   結果は当然なのですが。。。。) 私のケアレスミスで質問の前提が崩れてしまい 横道にそれた回答を頂き無駄になった事をお詫び申し上げます。 以下の参考画像は、  ファイルに書き出した変換後のテキストファイルを  テキストエディター(Em Editor)で表示した画像です。  改行コード(↓)の左側に   ずらっと連続する複数の半角スペースコード()が配置されています。 https://imgur.com/ivgTsL1   *半角コードが赤枠で示したモノかどうかは良くわかりませんが    形は同じなので付加しただけで参考程度と思ってください。 コードが全く違う方向になると思いますが宜しくお願いします。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.4

空行が2行以上連続していたら、これを空行1行に変換する、 つまり、改行が3つ以上連続していたら、2つに置き換えるということでいいでしょうか。 であれば、また、 過日当方がポストしたコードを手直ししたものでよければ、 以下です。 なお、 サンプル提示された情報(テキスト)が画像なので よくわかりませんが、 空行に見える行は改行だけなんですよね? それとも、半角、あるいは全角のスペースが含まれますか? Option Explicit Sub Sample1()    Dim buf As String  Dim Target     Target = _   Application.GetOpenFilename(Filefilter:="ansiのテキストファイル,*.txt")  If Target = False Then Exit Sub     With CreateObject("ADODB.Stream")   .Charset = "Shift_jis"   .Open   .LoadFromFile Target   buf = .ReadText      '改行が3つ連続していたら、改行を2つに変更   Do    If InStr(buf, vbCrLf & vbCrLf & vbCrLf) = 0 Then Exit Do    buf = Replace(buf, vbCrLf & vbCrLf & vbCrLf, vbCrLf & vbCrLf)   Loop      .Close   .Open   .writetext ChgKana(buf)   .savetofile Target, 2   .Close  End With End Sub Function ChgKana(text As String) As String    Dim MyLen As Long  Dim wkStr As String  Dim i As Long  MyLen = Len(text)    wkStr = ""  For i = 1 To MyLen   If ( _     (Asc(Mid(text, i, 1)) >= &HA6) And _     (Asc(Mid(text, i, 1)) <= &HDF)) Then    wkStr = wkStr & " "   Else    wkStr = wkStr & Mid(text, i, 1)   End If  Next i  ChgKana = wkStr End Function

NuboChan
質問者

補足

HohoPapaさん、kkkkkmさん 回答感謝します。 HohoPapaさんに指摘されて気が付きました。 提示したサンプル画像のテキスト情報ですが 空行に見える行は改行だけではありませんでした。 指摘されたように半角スペースの連続と最後に改行でした。 (半角のカタカナを半角のスペースに変換したので   結果は当然なのですが。。。。) 私のケアレスミスで質問の前提が崩れてしまい 横道にそれた回答を頂き無駄になった事をお詫び申し上げます。 以下の参考画像は、  ファイルに書き出した変換後のテキストファイルを  テキストエディター(Em Editor)で表示した画像です。  改行コード(↓)の左側に   ずらっと連続する複数の半角スペースコード()が配置されています。 https://imgur.com/ivgTsL1   *半角コードが赤枠で示したモノかどうかは良くわかりませんが    形は同じなので付加しただけで参考程度と思ってください。 コードが全く違う方向になると思いますが宜しくお願いします。 ---------------------- >空行が2行以上連続していたら、これを空行1行に変換する、 >つまり、改行が3つ以上連続していたら、2つに置き換えるということでいいでしょうか。 連続した改行もどき(連続する複数の半角スペース+改行)を  一つの改行だけにしたいです。 難しい場合は、3個続いたら1つに置き換えるでも構いません。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

書き忘れてました No1は、元の質問のNo3さんの回答をもとにしたものです。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.2

No1の追加です。 ファイル出力しなくて1行ごと1セルに入れたい場合には buf2 = buf2 & vbCrLf を ループの前にでもn=1入れて Cells(n, "A").Value = buf2 n = n + 1 buf2 = "" にしてください。

NuboChan
質問者

お礼

kkkkkmさん、半角カタカナ文字の削除(スペースへ変換)の別回答ありがとうございます。 元ファイル(ターゲット)を残して  新規に別ファイル(New+ターゲット)に書き出すので安心感があります。 >No1の追加です。 >ファイル出力しなくて1行ごと1セルに入れたい場合には 下記のようにしましたがシートに出力されません。 どこが間違っていますか ? Do Until EOF(1) Line Input #1, buf If Len(buf) > 1 Then For j = 1 To Len(buf) mCha = Mid(buf, j, 1) If mCha Like "[ヲ-゚ ]" Then buf2 = buf2 & " " Else buf2 = buf2 & mCha End If Next 'buf2 = buf2 & vbCrLf Cells(n, "A").Value = buf2 n = n + 1 buf2 = "" End If n = 1 Loop Close #1 ---------------------- 又、今回の質問である無駄な改行を削除する件に付いて  教えていただければ幸いです。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.1

もとの テキストファイル中のカタカナ文字をスペースに変換 ということでテキストファイルに書き出す(もしくはひとつのセルに書き出す)のでしたら元のファイル名にNewを頭につけて書き出します。 あアんンぱ  パんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ あアんンぱパんンまマんンがガあアるルくクよ のテキストファイルを あ ん ぱ   ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ あ ん ぱ ん ま ん が あ る く よ のテキストファイルにします。 Sub Test() Dim j As Long Dim SelectFile As Variant Dim buf As String, buf2 As String Dim mCha As String, NewFileName As String Dim mPath As String Dim FileNum As Integer 'ChDir "C:\Users\NuNu\Desktop" SelectFile = Application.GetOpenFilename("txtファイル(*.txt),*.txt") If VarType(SelectFile) = vbBoolean Then MsgBox "キャンセルされました" Else 'MsgBox SelectFile & " が選択されました" Open SelectFile For Input As #1 End If Do Until EOF(1) Line Input #1, buf If Len(buf) > 1 Then For j = 1 To Len(buf) mCha = Mid(buf, j, 1) If mCha Like "[ヲ-゚ ]" Then buf2 = buf2 & " " Else buf2 = buf2 & mCha End If Next buf2 = buf2 & vbCrLf End If Loop Close #1 NewFileName = "New" & Dir(SelectFile) mPath = ThisWorkbook.Path & "\" & NewFileName FileNum = FreeFile Open mPath For Output As #FileNum Print #FileNum, buf2 Close #FileNum 'ひとつのセルに出したい場合はこちらで 'Range("A1").Value = buf2 End Sub

関連するQ&A

  • 秀丸エディタで改行を削除するマクロ

    秀丸エディタであるファイルを開いています。 ファイル形式はテキストです。 このファイルの改行を全て削除して、改行なしのファイルに変換したいのですが、そのようなマクロはどこかに存在しないでしょうか? ちなみにファイルサイズが大きいので、私が発見したマクロではファイルサイズが大きすぎてつかえませんでした。 どうかよろしくお願い致します。

  • 改行の削除

    VB2005とシリアル通信で温度計の温度データをPCに取り込むプログラムを作成しています。 一定間隔で温度計からデータを受信し、テキストファイルに追加しています。この温度データの後ろに日時を追加したいのですが、温度データの末尾に改行がついており、日時の前で改行されてしまいます。 受信した段階、又はテキストファイルに追加する前に改行を削除する事は出来ませんでしょうか? 宜しくお願いいたします。

  • 【Outlook 2003】意図していないのに改行が削除される

    Outlook2003を使用しています。 メールを送付する際に確認すると、意図した箇所に改行が挿入されています。しかし、そのメールに対して他の人が返信をしてくれたメールを見ると、「このメッセージ内の余分な改行が削除されました。」と表示され、改行していた箇所が削除され、文章がつながってしまっています。 「改行の復元」をすると元の改行位置に、正しく改行が挿入されるのですが、なぜこのようなことが起こるのでしょうか?「余分な改行」として認識されないようにデータを入力したいのですが、どうすればよろしいでしょうか? ちなみに、 ・余分な改行といわれる箇所のデータは、あるホームページからコピーした文字を貼り付けたもの ・書式は「テキスト形式」 です。

  • 改行してスペースという文字の並びを削除するスクリプト

    シェルスクリプトでテキストを変換したいのですが、 テキストに改行につづいてスペースが入っている場合、それを削除したいのですが、どうやって書けばいいでしょうか? 複数行にわたる変換なので、うまくできないのです。 教えてください。

  • 改行コードの変換方法

    Excelシート内にあるテキストボックスの改行コード(LF)が多数存在してます。 これを改行コード(CRLF)に簡単に変換する方法はありますか? 対象文字を選択してExcelの置換機能で変換できませんか?

  • テキストファイルから改行コードを削除して読込む方法

    ExcelエクセルVBAマクロについてテキストファイルから改行コードを取り除いて 変数に読み込む方法について確認させてください。 下記のVBAログラムはWordファイルをテキストファイルに落としたファイルを変数aに 読み込んでいます。 このとき、読み込んだテキストファイルはWordファイルをテキストファイルに 落とし込んだファイルなので改行コードが残ってしまいます。 この改行コードを削除したうえで変数aに読み込みたいのですが可能でしょうか。 改行コードはメモ帳では「↓」と下矢印に似た文字で表示されます。 (実際には下矢印ではないようです。) 今のところ、Replace関数で改行コードを削除するプログラムを 考えているのですが、改行コードのVBAでの表現方法が分からないので 先に進むことが出来ません。いい案があればぜひご教授下さい。 あるいはほかの方法でも改行コードが削除出来れば結構です。 またこの変数aに読み込んである文字列からかぎカッコの内部にある文字を 抽出してエクセルの行方向に出力する方法があればご教授頂ければ幸いです。 例えば “あなたは「こんにちは」と言いました。 私は「元気ですか」と聞きました。” が文字列aに読み込んである場合、“こんにちは”、“元気ですか”を抽出して エクセルに順に出力という方法です。 色々と書きましたが、よろしくお願いいたします。 以下、VBAプログラム本文です。 ---------------------------------- Sub sample1() Dim a As String a = CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream.Readall CreateObject("Scripting.FileSystemObject").GetFile("C:\sample.txt").OpenAsTextStream.Close End Sub

  • エクセルのセル内改行のエクスポートについて

    システムの設計で、人が手入力した情報をtsvファイルにエクスポートして、そのファイルをシステムで取り込もうと検討しています。 けれども、元ファイル内に、エクセルのセル内改行が含まれていて、それをどうしても何かの記号に置換して、改行を詰めてテキストファイルに吐き出すことができません。 やりたいことは以下になります。 1.エクセルの改行を、テキストに吐き出すときには詰めたい。 2.テキストファイルで、改行は詰まっているけれど、変わりに別の文字「"」や「|」などに置換されていたい。 ややこしいですが、どなたか教えてください!

  • fgetsで拾われる改行文字を削除したい

    お世話になります  C言語初心者のものです。今課題でC言語を用いたプログラミングを Fedora上でやっています。問題は、fgetsでテキストファイルから、取得 した文字列の中から改行文字を削除できないことです。文字変数のアド レスはわかっているのですが、終端文字に置換しようとすると、セグメ ントエラーになってしまいます。これは如何にして解決すべきでしょう か。よろしくお願いします。

  • ファイル内の改行を削除し1行にするシェル

    お世話になっております。 ファイル(テキスト)内には、改行を含んだ複数の行が記述されています。 これを1行にして上書き保存するシェルを実行をするための シェルを作成したいと思っています。 ファイル内には以下のような値が改行を含んで入っています。 123 456 789 →これを、「123456789」と改行を取り除き、既存のファイルの上書き保存をしたい なお、改行を含んだ対象のファイルは、ファイル名にある文字を含む ファイルのみに対して行いたいのですが。 例:ファイル名に、「*abc*」、「*def*」、「*xyz*」を含むファイルが対象 改行を取り除くコマンドはわかるのですが、シェルにするプロセスがわかりません。 cat 入力ファイル名 | tr -d '\n' > 変換後の出力ファイル名 ご教授いただきたく、よろしくお願いします。

  • 特定の改行コードだけ削除する

    CSVファイルを変換するPGを書きたいのですが、 変換したいCSVには改行コード\nと\r\nが混在しています。 改行コード\r\nはそのままにして \nだけ削除したいのですが どのように書けばよろしいのでしょうか。 Perlは5.12.2です。 よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう