Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1126 / 13645 ツリー ←次へ | 前へ→

【76135】ExcelのVBAでテキストファイルの編集の書き換えをする方法 みその 14/10/3(金) 21:31 質問[未読]
【76136】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/3(金) 22:43 発言[未読]
【76137】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/3(金) 23:10 発言[未読]
【76138】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/3(金) 23:13 発言[未読]
【76139】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/4(土) 0:05 質問[未読]
【76140】Re:ExcelのVBAでテキストファイルの編集の... みその 14/10/4(土) 6:31 質問[未読]
【76141】Re:ExcelのVBAでテキストファイルの編集の... みその 14/10/4(土) 6:38 質問[未読]
【76142】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/4(土) 7:52 発言[未読]
【76153】Re:ExcelのVBAでテキストファイルの編集の... みその 14/10/5(日) 18:09 質問[未読]
【76154】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/5(日) 20:16 発言[未読]
【76156】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/6(月) 11:40 発言[未読]
【76157】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/6(月) 11:46 発言[未読]
【76158】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/6(月) 11:52 発言[未読]
【76159】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/6(月) 11:54 発言[未読]
【76174】Re:ExcelのVBAでテキストファイルの編集の... γ 14/10/8(水) 19:50 発言[未読]
【76177】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/8(水) 22:40 発言[未読]
【76179】Re:ExcelのVBAでテキストファイルの編集の... γ 14/10/9(木) 6:12 発言[未読]
【76181】Re:ExcelのVBAでテキストファイルの編集の... γ 14/10/9(木) 6:21 発言[未読]
【76182】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/9(木) 9:04 発言[未読]
【76183】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/9(木) 11:17 発言[未読]
【76185】Re:ExcelのVBAでテキストファイルの編集の... γ 14/10/9(木) 21:40 発言[未読]
【76160】Re:ExcelのVBAでテキストファイルの編集の... みその 14/10/6(月) 16:16 お礼[未読]
【76162】Re:ExcelのVBAでテキストファイルの編集の... マルチーズ 14/10/6(月) 17:19 発言[未読]
【76186】Re:ExcelのVBAでテキストファイルの編集の... kanabun 14/10/10(金) 9:05 発言[未読]

【76135】ExcelのVBAでテキストファイルの編集の書...
質問  みその  - 14/10/3(金) 21:31 -

引用なし
パスワード
   デスクトップにexampleというフォルダがあり、その中にたくさんテキストファイル(拡張子が.txt)が入っているとします。

それらのファイルを中身を以下のルールに従って、書き換えます。


1.'<'と'>'の間に、改行以外の文字列で入るものは空白置換。(<abcd>や<ab cd ef>など)
2.改行コードが2行以上のものは1行に置換。(改行コードは最大で100行ぐらい連続します。また、改行コードはCRLF、CR、LFなどすべての種類があるとします。)


コードをよろしくお願い申し上げます。

【76136】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/3(金) 22:43 -

引用なし
パスワード
   ▼みその さん:
>デスクトップにexampleというフォルダがあり、その中にたくさんテキストファイル(拡張子が.txt)が入っているとします。
>
>それらのファイルを中身を以下のルールに従って、書き換えます。

とりあえず、「デスクトップのexampleフォルダ」内の *.txt ファイルを Dir関数
を使って取得すればいいと思います。

--------------
Option Explicit

Sub Try1()
  Dim f As String
  Dim DeskTop As String
  
  DeskTop = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
  DeskTop = DeskTop & "example\"
  
  f = Dir$(DeskTop & "*.txt")
  Do While Len(f) > 0
    '処理
    Debug.Print DeskTop & f
    
    '次のファイル
    f = Dir$()
  Loop
    
End Sub

上の '処理 のところに、
ファイルをOpenして、やりたいテキスト置換処理を記述して、
SaveしてCloseする... という処理を書くわけですが。
テキストファイルをOpenし、テキストを置換するコードは、分りますか?

【76137】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/3(金) 23:10 -

引用なし
パスワード
   ファイルが見つかったら、Openして 置換して 保存する作業は
別プロシージャに独立させると見通しがよくなります。

Sub Try2()
  Dim f As String
  Dim DeskTop As String
  
  DeskTop = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
  DeskTop = DeskTop & "example\"
  
  f = Dir$(DeskTop & "あいう*.txt")
  Do While Len(f) > 0
    '処理
    ReplaceText DeskTop & f '別プロシージャ呼び出し
    
    '次のファイル
    f = Dir$()
  Loop
    
End Sub

Private Sub ReplaceText(Filename$)
  Dim io As Integer
  Dim buf() As Byte
  Dim ss As String
  
  '---- ファイルを開いて全文読み取り
  io = FreeFile()
  Open Filename For Binary As io
   ReDim buf(1 To LOF(io))
   Get io, , buf     '全文読み取り(ShiftJIS)
  Close io
  ss = StrConv(buf, vbUnicode) '全文Unicode文字列に変換
  
  '---- テキスト置換作業
  ' ここに 文字列ss を Replaceする作業内容を記述する  
  

  '---- 変換後のテキストを保存
  Open Filename For Output As io
   Print #io, ss;
  Close io
  
End Sub

【76138】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/3(金) 23:13 -

引用なし
パスワード
   失礼

> f = Dir$(DeskTop & "あいう*.txt")

は こちらのチェック用です。すべてのテキストなら Try1() のとおり

 f = Dir$(DeskTop & "*.txt")

です。

【76139】Re:ExcelのVBAでテキストファイルの編集...
質問  kanabun  - 14/10/4(土) 0:05 -

引用なし
パスワード
   ▼みその さん:

変換の方法
>
>1.'<'と'>'の間に、改行以外の文字列で入るものは空白置換。(<abcd>や<ab cd ef>など)
>2.改行コードが2行以上のものは1行に置換。(改行コードは最大で100行ぐらい連続します。また、改行コードはCRLF、CR、LFなどすべての種類があるとします。)
>
は 文章ではよく分からないので、
具体例をあげたほうが分りやすいと思います。

[変換前のテキスト]

[変換後のテキスト]

【76140】Re:ExcelのVBAでテキストファイルの編集...
質問  みその  - 14/10/4(土) 6:31 -

引用なし
パスワード
   どうもありがとうございます。

>テキストファイルをOpenし、テキストを置換するコードは、分りますか?
VBAはマクロの記録を眺めたことがある程度なので、よくわかりません。申し訳ありません。

また私の説明不足で申し訳ありません。

規則を説明しなおしたので、ふたたび、よろしくお願い致します。


順番は1を行った後に2を行います。

ファイルの内容のみ変更して、ファイル名は変更しません。

UFT-8以外の形式の場合、UFT-8の形式にします。

テキストファイルの拡張子はすべてtxtです。

処理するのはフォルダに存在するすべてのテキストです。


1.

"<"と">"の間に、改行以外の文字列が入るものは空白置換。

この文章でダブルクオーテーションは下記と同じような使い方をしています。つまり、対象をくくっているだけなので、それ自体に意味はありません。

f = Dir$(DeskTop & "あいう*.txt")

例)

"<abcd>"は""に置換する

"<ab cd ef>"は""に置換する

"<#$%&'あいうabu>"は""に置換する


2.

3つの連続する改行コードがあるときは、2つの連続する改行コードに置換。

3つ以上連続する改行コードがあるときも、2つの連続する改行コードに置換。

改行コードはCRLF、CR、LFなどすべての種類があるとします。

改行コードは最大で100個ぐらい連続します。

あまり詳しくありませんが、PHPでいうstr_replaceのようなイメージかもしれません。

例)

==============================================
あいうえお  '残す改行コード←1個目の改行コード
       '残す改行コード←2個目の改行コード
       '消す改行コード←3個目の改行コード
かきくけこ  '残す改行コード←1個目の改行コード
       '残す改行コード←2個目の改行コード
       '消す改行コード←3個目の改行コード
       '消す改行コード←4個目の改行コード
       '消す改行コード←5個目の改行コード
さしすせそ  '残す改行コード←1個目の改行コード
たちつてと  '残す改行コード←1個目の改行コード
なにぬねの  '残す改行コード←1個目の改行コード
       '残す改行コード←2個目の改行コード
       '消す改行コード←3個目の改行コード
       '消す改行コード←4個目の改行コード
       '消す改行コード←5個目の改行コード
       '消す改行コード←6
はひふへほ  '残す改行コード←1個目の改行コード
==============================================

上記は下記のように置換(変換)する。

==============================================
あいうえお  '文字列と文字列の空白は0行か1行になります。

かきくけこ

さしすせそ
たちつてと
なにぬねの

はひふへほ
==============================================

【76141】Re:ExcelのVBAでテキストファイルの編集...
質問  みその  - 14/10/4(土) 6:38 -

引用なし
パスワード
   追伸です。

1.の"<"と">"はそれぞれ"["と"]"に変えてください。"<"と">"というのは誤りでした。

2.ですが、改行コードが2つ連続す場合、1つしか続かない場合は何もしません。例にあるように、編集(置換)するのは3つ以上の場合のみです。


よろしくお願い致します。

【76142】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/4(土) 7:52 -

引用なし
パスワード
   ▼みその さん:

>UFT-8以外の形式の場合、UFT-8の形式にします。

UTF-8の話は初めて聞いたので、上のサンプルでは通常の ShiftJISを仮定して
書いています。

そもそもUTF-8テキストとそれ以外のコード体系のテキストとが混在している
のでしたら、読み込むテキストがどんなコードで書かれているかを判別しなければ
なりませんが、あいにくぼくはそういうことに詳しくありません。
ご自分で調べるか、他の方のレスをお待ちください。

でかけますので、これ以降コメントできません。

【76153】Re:ExcelのVBAでテキストファイルの編集...
質問  みその  - 14/10/5(日) 18:09 -

引用なし
パスワード
   kanabunさん

返信が遅れて申し訳ありません。

>そもそもUTF-8テキストとそれ以外のコード体系のテキストとが混在している
>のでしたら、読み込むテキストがどんなコードで書かれているかを判別しなければ
>なりませんが、あいにくぼくはそういうことに詳しくありません。

考え直してみたら、編集前も編集後もUTF-8のみでよいことがわかりました。混在していることもないので、判別も必要もないと思います。

前回丁寧に具体的なコードを書いていただいているので、それをぜひ生かしたいと考えています。

しかし私はコーディングできないので、再度お願いできますでしょうか。

下記のコードは私が書いたものではありませんが、参考になるかもしれません。

よろしければではありますが、よろしくお願い致します。

Function myReplace(s As String) As String
  Dim re As Object
  Dim s2 As String
  Dim s3 As String

  Set re = CreateObject("VBScript.RegExp")
  With re
    .Global = True
    .Pattern = "\[[^\n\r]*?\]"
    s2 = .Replace(s, "")

    .Pattern = "(\r\n|\r|\n){3,}" '3つ以上の連続した改行は二つに縮める
    s3 = .Replace(s2, "$1$1")
  End With
  Set re = Nothing
  myReplace = s3
End Function

【76154】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/5(日) 20:16 -

引用なし
パスワード
   ▼みその さん:

>考え直してみたら、編集前も編集後もUTF-8のみでよいことがわかりました。混在していることもないので、判別も必要もないと思います。

UTF-8テキストファイルの読み書きについては、

ExcelVBA即効テクニック研究室(その15)
ht tp://moug.net/faq/viewtopic.php?t=69889

投稿日時: 14/08/02 19:34:21 投稿者: kanabun
  〜

投稿日時: 14/08/02 22:00:32 投稿者: simple

あたりが参考になると思います。

【76156】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/6(月) 11:40 -

引用なし
パスワード
   流れとしてはこんな感じになるのでは、と思います。

’-----------------------------------------------------------
Option Explicit

'StreamTypeEnum
Const adTypeBinary = 1
Const adTypeText = 2

'LineSeparatorsEnum
Const adCR = 13
Const adCRLF = -1
Const adLF = 10

'StreamWriteEnum
Const adWriteChar = 0
Const adWriteLine = 1

'SaveOptionsEnum
Const adSaveCreateNotExist = 1
Const adSaveCreateOverWrite = 2


Sub Try2()
  Dim f As String
  Dim DeskTop As String
  
  'Desktop\HTML\ の UTF-8形式の*.htmlファイルを読む(改行コード:CrLf)
  DeskTop = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
  DeskTop = DeskTop & "html\" '◆テスト用
  
  f = Dir$(DeskTop & "*.html")
  Do While Len(f) > 0
    '処理
    ReplaceUTF8 DeskTop & f  '●UTF8テキストファイル読み込み
    
    '次のファイル
    f = Dir$()
  Loop
  MsgBox DeskTop & " ---- All File Replaced"
End Sub

Private Sub ReplaceUTF8(Filename As String)
  Dim ss As String
  Dim newFilename As String 'テストのため別名で保存
 
  '----ファイルを開いてテキストを読み込む
  With New ADODB.Stream
    .Type = adTypeText     'adTypeText:2
    .Charset = "UTF-8"
    .LineSeparator = adCRLF   '改行コードの指定
    .Open            'StreamObjectのOpen
    .LoadFromFile Filename   'Utf-8ファイルを Stream に読み込む
    .Position = 0        'ポインタを先頭へ(不要か?)
    ss = .ReadText()      'ReadAll As Unicode
    .Close
  End With
  
  '-------テキスト置換作業
  ss = myReplace(ss)    '● simpleさんのRegExp置換処理ルーティンへ
  
  
  '---- 変換後のテキストをUTF-8形式で保存(◆未完成)
  Dim j&
  j = InStrRev(Filename, "\")
  newFilename = "D:\HTML" & Mid$(Filename, j)
  With New ADODB.Stream
    .Type = adTypeText
    .Charset = "UTF-8"
    .LineSeparator = adLF    '改行コードは LFとする
    .Open            'StreamObjectのOpen
    .WriteText ss, adWriteChar
    .SaveToFile newFilename, adSaveCreateOverWrite
    .Close
  End With
End Sub

Private Function myReplace(ss As String) As String
(以下略)

'-----------------------------------------------------------
以上ですが、まだ不具合があります。
(1) UTF-8形式で(改行コードはわざと元とちがう LF にして)別の場所に
  保存しようとしているのですが、LFだけになっていないようです。
  (秀丸エディタで確認)
(2) 保存ファイルの先頭に(もとのUTF-8ファイルにはなかった) BOMがつきます。
  これも不要なので BOMなしで保存したいのですが、まだコード化してありません。
  これについては

ht tp://amano41.hateblo.jp/entry/2014/04/25/145637

あたりを参考に挑戦してみてください。

【76157】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/6(月) 11:46 -

引用なし
パスワード
   補足です。

> 
>  '----ファイルを開いてテキストを読み込む
>  With New ADODB.Stream
>
New を使って ADODB.Stream のインスタンスを生成するためには あらかじめADODB
への参照設定をしておくことが必要です。

>ht tp://amano41.hateblo.jp/entry/2014/04/25/145637
>
’-----------------------------------------------------------
>ライブラリの参照設定
> デフォルトでは ADO のライブラリは読み込まれていないため,New でオブジェクト
> を生成することができず,Visual Basic Editor のコード補完機能なども働きま
> せん。 オブジェクトの生成は CreateObject 関数で可能なのですが,クラスや
> 定数にアクセスできないのは不便なので,まずはライブラリの参照設定をしま
> しょう。
’-----------------------------------------------------------
>あたりを参考に挑戦してみてください。

【76158】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/6(月) 11:52 -

引用なし
パスワード
   もう一点、補足です。

上のテストでは、最初 Desktop にフォルダをつくって そこへ保存しようと試みま
したが、エラーになります。
調べたところ、コードに不備があるのではなく、保存先がデスクトップだから
ということが分かりました。管理者権限とか? そういうことが絡んできている
気がします。
とりあえず、保存先は システムドライブでない、ローカル・ドライブに変えてあります。

【76159】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/6(月) 11:54 -

引用なし
パスワード
   > Private Function myReplace(ss As String) As String
> (以下略)

ここは
> Private Function myReplace(s As String) As String
> (以下略)

がオリジナルでしたね

【76160】Re:ExcelのVBAでテキストファイルの編集...
お礼  みその  - 14/10/6(月) 16:16 -

引用なし
パスワード
   ありがとうございました。

私には難しいですが、もう少し試行錯誤してみます。

【76162】Re:ExcelのVBAでテキストファイルの編集...
発言  マルチーズ  - 14/10/6(月) 17:19 -

引用なし
パスワード
   ここの掲示板のルールです。

>別のサイト(掲示板)にまったく同じ目的の投稿をすることを、一般に「マルチポスト」といいます。
>当質問箱では、マルチポストは原則認めています。
>つまり、ほかのサイトで質問したことをこのサイトで質問してもかまわないということです。

>しかし、もしマルチポストをするのなら、可能な限り「○○にも同じ質問を出しました」ということを宣言してください。
>そして、仮に他のサイトで解決したのなら、ここにも必ずその顛末を書いてください。質問しっぱなし、というのはモラルに反します。
>「解決したからいいや」というのではありません。

>また、マルチポストを明示的に禁止しているサイトとのマルチポストをしてはいけません。

【76174】Re:ExcelのVBAでテキストファイルの編集...
発言  γ  - 14/10/8(水) 19:50 -

引用なし
パスワード
   ▼kanabun さん:
> 以上ですが、まだ不具合があります。
> (1) UTF-8形式で(改行コードはわざと元とちがう LF にして)別の場所に
>   保存しようとしているのですが、LFだけになっていないようです。
>   (秀丸エディタで確認)

横から失礼します。
.LineSeparatorを指定せずに読んで、
指定せずに書き込んでみてはいかがでしょうか。

【76177】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/8(水) 22:40 -

引用なし
パスワード
   ▼γ さん:

ありがとうございます。

>.LineSeparatorを指定せずに読んで、
>指定せずに書き込んでみてはいかがでしょうか。

やってみましたが、LF改行にはなっていませんでした。
(今度は バイナリ・エディタで確認)
元のテキストが CRLF改行なので、指定しなければ、CrLfのままということでは
ないでしょうか?

【76179】Re:ExcelのVBAでテキストファイルの編集...
発言  γ  - 14/10/9(木) 6:12 -

引用なし
パスワード
   こんにちは。
>元のテキストが CRLF改行なので、指定しなければ、CrLfのままということでは
>ないでしょうか?
私は、元の改行コードをそのまま残すことで良いのではないかと思っていました。
元がCRならCR。
元がLFならLFだと。

CRLF改行のものをLineSeparator指定でLFに変更するということですね。
実験しましたら、ご指摘のとおりでした。

ADODBのヘルプによると、
>LineSeparator は、テキスト Stream の内容を読み取るとき行の解釈に使います。
という説明がありましたので、読み込み時だけ有効のようですね。
もし改行コードの統一が必要なら、
置換処理の中で対応するのが良いかもしれません。

【76181】Re:ExcelのVBAでテキストファイルの編集...
発言  γ  - 14/10/9(木) 6:21 -

引用なし
パスワード
   蛇足ですが、閲覧者が誤解してはいけませんので、補足しますと、
>もし改行コードの統一が必要なら、
というのは、すべてのファイルで、という意味で書きました。
(ひとつのファイル中で改行コードが混在していることは無いでしょうから、
 そうした意味ではありません。)

【76182】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/9(木) 9:04 -

引用なし
パスワード
   ▼γ さん:

>ADODBのヘルプによると、
>>LineSeparator は、テキスト Stream の内容を読み取るとき行の解釈に使います。
>という説明がありましたので、読み込み時だけ有効のようですね。

情報ありがとうございます。
すると、出力時に LineSeparator を指定するような直接的プロパティはない
ということになりますか?

もし元が CrLf改行 のテキストを LF改行に変更したいなら、それも

> 置換処理の中で対応

ということなんですね。

【76183】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/9(木) 11:17 -

引用なし
パスワード
   LineSeparator は読み込みのとき、何を改行コードと解釈するか、に使うものだと
いうことは理解しましたが、
出力するときにも、以下のように その場で一行文字列を生成しながら書き込む
ときにも、LineSeparator プロパティは使えますね

Sub SaveTest_UTF8()
 With CreateObject("ADODB.Stream")
   .Type = adTypeText
   .Charset = "utf-8"
   .LineSeparator = adLF '◆出力時の改行コードをLFに指定
   .Open
   
   '出力文字列を生成して改行コードを付加して書き込む
   .WriteText "これはテストです。", adWriteLine
   .WriteText "よろしく。", adWriteLine
 
   .SaveToFile "D:\(Data)\temp\UTF-8_Test.txt", adSaveCreateOverWrite
   .Close
 End With
End Sub

ただし、いまやろうとしていることは 改行コード込みの文字列の固まり?
の出力なので、そのときには LineSeparator は使えないんだ、ということは
よく分かりました m(_ _)m

【76185】Re:ExcelのVBAでテキストファイルの編集...
発言  γ  - 14/10/9(木) 21:40 -

引用なし
パスワード
   kanabunさんへ。
ご指摘、勉強になりました。

それぞれ別のLineSeparatorを持った二つのStreamを用意して、
ReadTextで一行読み込み、
WriteTextで一行書き込み、
と繰り返すことで可能は可能ですね。

どうもありがとうございました。

【76186】Re:ExcelのVBAでテキストファイルの編集...
発言  kanabun  - 14/10/10(金) 9:05 -

引用なし
パスワード
   あと、そのままだとBOM付きで出力されてしまうので、
BOMをとって出力する方法は

ht tp://qiita.com/kou_tana77/items/66b14c7649792c9703d8
とか

ht tp://hatenachips.blog34.fc2.com/blog-entry-374.html

などを参考にすれば、できるとおもいます。

1126 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free