
VBAに関する質問です。
複数のテキストファイルを読み込んで
指定した文字列を別の文字列に検索・置換してくれるプログラムを作りたいと考えています。
これをするためには一度
Set MyTxt = FSO.OpenTextFile(StrPath, 1)
Do While MyTxt.AtEndOfStream = False
hairetu(xxx) = MyTxt.ReadLine
loop
のようにしてテキストデータを全て配列に読み込み、
Replace関数で一つずつ検索・置換した後に
Open StrPath For Output As #1
Print #1, hairetu(xxx)
のようにしてファイルを出力し直すしかないですか?
配列に読み込まずに
既存のファイルを直接編集する方法を教えてください。
No.8ベストアンサー
- 回答日時:
1行でも同じです。
「1行」というのは、「改行文字」という特殊な文字を区切りに使っているもので、コンピュータにとっては、他の文字と違いはありません。
「行で探す」というのは「改行文字の数で探す」ことになります。
文字列で探すのと、ほとんど同じことです。
バイト数が置換の前後で同じなら、方法は無いわけではありません
(MODE BINARY ACCESS READ WRITE でOPEN→SEEKで書き換える位置へ移動)
ですが、プログラムの難易度を考えると、現在の方法より優れている、とは言えません。
もし、Excelでやらなければならない理由が無いのなら、他の方法を使うのが楽です。
例えば、テキストエディタの「grep置換」等と呼ばれる機能を使うとか。
UNIX系OSでは標準の sed コマンドのWindows版を使うとか。
この回答への補足
これであっていますか?
もっと良い方法があれば教えてください。
Sub test78()
Dim FSO As Object, buf As String
Set FSO = CreateObject("Scripting.FileSystemObject")
''C:\Work\Sample.txtの全ての文字を読み込んで表示します
With FSO.GetFile("d:\新しいテキスト ドキュメント.txt").OpenAsTextStream
buf = .ReadAll
buf = Replace(buf, "コリアン", "ジャパニーズ")
.Close
End With
Set FSO = Nothing
StrPath = "D:\test.txt"
Open StrPath For Output As #1
Print #1, buf
Close #1
End Sub
ありがとうございます。
結局のところ、VBAでやるなら全てのテキストデータを一度配列に読み込ませた後に、
replace関数で全ての文字列を置換後に再度テキストデータとして
出力するしかないということでしょうか?
grepのソフトウェアはあるのですが
これらのソフトも同じように一度配列に書き出す方法をとっているのでしょうか?
No.7
- 回答日時:
【補足】3行目の"ABC"を"123"に書き換えよ。
>別ファイルに出力する手段は取ってはいけない。
>ただし、1行目、2行目と順次に3行目まで読み込むのは構わない。
【答】FileSystemObjectでは不可能。
1、X行目を取得する関数を作成する。
2、X行目を直接に書き換える関数を作成する。
これなら可能です。
No.6
- 回答日時:
> 例えば、
>
> ABC
> DEF
> GHI
> というテキストファイルがあり
>
> DEFだけをJKLに書き換えるにはどうしたら良いですか?
Excelにこだわらず、Wordでやってみるのも一案かと思います。
以下は、Wordのマクロの自動記録です。
手順は
1.変換元のファイル(test.txt)を開く
2.置換で「DEF→JKL」(全置換)
3.別名で(test_p.txt)テキスト形式で保存
…以下だけは変更してあります。
[元ファイルのあるフォルダ名]
自動保存ですが、ここまで可能です。
後は、
・オプション変換オプション
・複数ファイルのループ設定
・変換後のファイルの保存先、ファイル名
などを調整してください
Sub Macro1()
'
' Macro1 Macro
'
'
ChangeFileOpenDirectory "[元ファイルのあるフォルダ名]"
Documents.Open FileName:="test.txt", ConfirmConversions:=False, ReadOnly:= _
False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _
"", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _
Format:=wdOpenFormatAuto, XMLTransform:="", Encoding:=932
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "DEF"
.Replacement.Text = "JKL"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
ActiveDocument.SaveAs FileName:="test_p.txt", FileFormat:=wdFormatText, _
LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _
:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False, Encoding:=932, InsertLineBreaks:=False, AllowSubstitutions:=False, _
LineEnding:=wdCRLF
End Sub
No.4
- 回答日時:
一般的には「直接編集する」方法は無いと思ってください。
ファイルは、原稿用紙をイメージしてください。
できることは
・マスに1文字書き込む。既に書いてあるマスだったら、消しゴムで消してから書き込む
・書いてある文字を1マスずつ読む
・全体の長さを決める
だけです。
「1行読む」は「1マス読む、を改行まで繰り返す」ことです。
ABCDE のBC をb に置き換えたいとします。
ただ2マス目をbに書き換えただけだと
AbCDE
となり、Cが残ります。「取り除く」ことはできません。
そこで
3マス目に次の文字(D)を読み込んで書く
4マス目に次の文字(E)を読み込んで書く
長さを4に決める
とやる必要があります。これで AbDE になります。
挿入時も同様に 長さを延す→後へずらす→空いたマスに書き込む という操作が必要です。
これを楽にやる方法の一つが、「操作が楽なものにコピーを作って、出来上がったら元に戻す」というものです。
その実例の一つが「操作が楽な文字列の配列にコピーを作って、出来上がったものを元のファイルに書き出す」という今のやりかたです。
ファイルまるごと直接編集は無理だとして
一行ごとに直接編集は可能ですか?
例えば、
ABC
DEF
GHI
というテキストファイルがあり
DEFだけをJKLに書き換えるにはどうしたら良いですか?
No.3
- 回答日時:
VBAというからにはエクセルあたりを使うわけですよね?
であれば配列とあわせて読み込んだ行をセルに表示して
目に見えるような状態にするというのも1つの方法です
シートをわけることでBefore・Afterのような
プレビューも実装することができますし
保存するコードを書く時も簡単に
ActiveWorkbook.SaveAs Filename:="ファイル名", FileFormat:=xlText
みたいにできます
以上参考までに・・・
No.2
- 回答日時:
「DOSコマンドを利用する」という手は除外するとして・・・。
ファイルを一行づつ読み込むって手はあります。次は、私が1998年頃にマイサイトにアップした FileRead関数です。207: FileRead関数: ファイルの各行を順次に読み込みます。
Public Function FileRaed(ByVal FileName As String) As String
On Error GoTo Err_FileRead
Static isOpen AS Boolean
Static fso As FileSystemObject
Static fil AS File
Static txs As TextStream
If Not isOpen Then
isOpen = True
Set fso = New FileSystemObject
Set fil = fso.GetFile(FileName)
Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)
End If
FileRead = IIf(fil.Name = FileName, txs.ReadLine, "")
Exit_FileRead:
If Len(FileRaed) = 0 Then
isOpen = False
Set txs = Nothing
Set fil = Nothing
Set fso = Nothing
End If
Exit Function
Err_FileRead:
MsgBox Err.Description & "(FileRead)", vbExclamation, " 関数エラーメッセージ"
Resume Exit_FileRead
End Function
? FileWrite("Test.txt", "1: A" & Chr$(13) & Chr$(10) & "2: B" & Chr$(13) & Chr$(10))
True
? FileRead("Test.txt")
1: A
? FileRead("Test.txt")
2: B
? FileRead("Test.txt")
FileRead関数を使っての順次読み込みを中止する場合には FileRead("") とファイル名にヌル値をセットします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAでCSVの1行目だけを書き換える方法
Excel(エクセル)
-
テキストファイル中の文字列の置換
Visual Basic(VBA)
-
EXCEL VBAでテキストファイルの特定の場所にデータを書き込む方法
Visual Basic(VBA)
-
-
4
テキストファイルの特定行の削除方法
Visual Basic(VBA)
-
5
[エクセル VBA]テキストファイルから特定の行のみを抜き出したい 下記のようなテキストファイルから
Excel(エクセル)
-
6
ExcelVBA メモ帳を起動し名前を付けて指定フォルダに保存
Visual Basic(VBA)
-
7
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
8
別インスタンスのエクセルを制御したい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
access vbaでCSVファイルを文...
-
C#でのファイル編集と上書き保...
-
unicode文字列(日本語)のファイ...
-
VBAで新しい日付順にファイルを...
-
Excel.VBA テキストファイルを...
-
BCPユーティリティの使用法_...
-
ある文字列を含む行の抽出
-
大量のフォルダからひとつのフ...
-
コマンドプロンプトの「%1」と...
-
コマンドプロンプトのエラーに...
-
隠しファイルの扱い
-
アクセス 壊れた? 「ファイ...
-
binファイルを解凍したいの...
-
バッチでテキストファイルから...
-
これってパソコンの最適化が完...
-
Thunderbirdで社内共有フォルダ...
-
[teraterm] waitコマンドで停止...
-
バッチ処理でファイルの中身を...
-
batファイルで立ち上げたaplを...
-
win10の「フォト」で、「次へ」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ある文字列を含む行の抽出
-
特定フォルダ内のテキストファ...
-
VBAでPowerPointからExcelにデ...
-
VB6側からテキストファイルをク...
-
BCPユーティリティの使用法_...
-
Excel.VBA テキストファイルを...
-
unicode文字列(日本語)のファイ...
-
テキストファイルの行頭に文字...
-
access vbaでCSVファイルを文...
-
複数行の文字列を変数として使...
-
バッチでiniファイルの編集
-
RandomとBinaryモードの違い
-
excelにテキストファイルの指定...
-
テキストファイルを直接置換す...
-
時間短縮のために、テキストフ...
-
VB.NETでテキストファイルからH...
-
C#でのファイル編集と上書き保...
-
ExcelVBAで以下のマクロを作成...
-
VBSを用いてIPアドレスを取得し...
-
VBAで新しい日付順にファイルを...
おすすめ情報