- ベストアンサー
エクセルで複数のファイルの特定の文字の置き換え
エクセルで同じフォルダに入っている複数のファイルがあります。(数百個)その中の特定の文字を別の文字に置き換えることは可能でしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 これは、その都度、ファイルは閉じてはいますが、メモリとか使っているような気がしますね。あまり、IE などを開いたままには、このVBAマクロはお勧めできません。 シェアウェアでは、どうしているのでしょうね。このレベルでは、お金を取れるような内容ではありません。直接、ファイルに書き込むようなことをしなければね。 それから、たぶん、Excel97 では、無理だと思います。いままで、同じようなものは、何度も作ってきて、使ってはいただいていますが、今回は、複数の文字列の置換ということが、初めてです。(そのようなリクエストはありませんでしたけれど)一対一交換のものは、成功したものが別にあります。 例: 交換条件 →交換済み 5757AAAA →5902BBB コンマ(,)で区切って指定します。 フォルダの中は、全ての場合と、そうでない場合を想定しています。ファイル・オープンダイアログは、マルチセレクト(複数選択)が可能な状態です。 最初に、量を少なくして、バックアップを取ってから行ってください。 なお、私が解明できない不明なエラーがある時は、現在のこの版は、あっさりと見送り、以前のものを公開します。 '<標準モジュール> Sub xlsReplace() Dim objF As Object, Ret As Variant, Fnames() As Variant, Fname As Variant Dim sWords$(), rWords$(), Words As Variant, i As Long, j As Long, OrgPath As String '============================================================ '検索語 Const sWord = "交換条件,5757AAAA" '置換語(上記と対にする) Const rWord = "置換済み,5902BBB" 'ここは下位フォルダでも可能です。 Const myDrive As String = "C:\" ' '============================================================ sWords = Split(sWord, ",") rWords = Split(rWord, ",") ReDim Words(1, UBound(sWords)) For i = LBound(sWords) To UBound(sWords) Words(0, i) = sWords(i) Words(1, i) = rWords(i) Next i OrgPath = CurDir Set objF = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選んでください。", 0, myDrive) If Not objF Is Nothing Then Ret = MsgBox(objF.items.Item.Path & "のフォルダのファイルを全て実行しますか?", _ vbYesNoCancel) If Ret = vbYes Then ChDir objF.items.Item.Path Fname = Dir(objF.items.Item.Path & "\" & "*.xls") Do ReDim Preserve Fnames(j) Fnames(j) = Fname j = j + 1 Fname = Dir Loop Until Fname = "" Application.ScreenUpdating = False For Each Fname In Fnames Call ReplaceValues(CStr(Fname), Words) Next Fname Application.ScreenUpdating = True ElseIf Ret = vbNo Then ChDir objF.items.Item.Path Fnames = Application.GetOpenFilename("xls ファイル(*.xls),*.xls,全てのファイル(*.*),*.*", , , , True) If VarType(Fnames) = vbBoolean Then Exit Sub Application.ScreenUpdating = False For Each Fname In Fnames Call ReplaceValues(CStr(Fname), Words) Next Fname Application.ScreenUpdating = True End If End If Set objF = Nothing MsgBox "終了" End Sub '置換のサブルーチン Private Sub ReplaceValues(Fname As String, ParamArray Words()) Dim wb As Worksheet, k As Long, arWords arWords = Words With Workbooks.Open(Fname) For Each wb In .Worksheets On Error Resume Next For k = LBound(arWords(0), 2) To UBound(arWords(0), 2) wb.Cells.Replace What:=arWords(0)(0, k), _ Replacement:=arWords(0)(1, k), _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ MatchCase:=False Next k 'Replace の仕様:xlWhole=全一致 On Error GoTo 0 Err.Clear Next .Save .Close True End With End Sub
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >他のドライブ(たとえばDドライブ、ネットワーク越しのサーバー内のフォルダ等)を指定したい場合どうしたらいいでしょうか? Dドライブの時は、 D:\ でよいのですが、ネットワークの場合は、 "\\サーバー名\フォルダ" ということになります。ただし、書き換えられる状態になっていないといけませんが。
お礼
すみません。やりもしないで聞くばかりで。 いま、マクロの部分を書き換えたらできました。 ありがとうございました。
補足
返答が遅れてすみません。 >Dドライブの時は、 > D:\ >でよいのですが、ネットワークの場合は、 > > "\\サーバー名\フォルダ" どこを書き換えればいいですか? マクロを実行すると ”フォルダを選んでください” となって、Cドライブ以下を選択するようになっています。 ネットワーク越しに関してはもちろん書き換え可能な権限があります。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >セルの中の一文字のみを指定していたためのようです。 >試していませんが指定フォルダの下位フォルダの中のファイルも置換されるのでしょうか? それについては、細かく触れていませんでしたが、 '置換のサブルーチン という中の ×LookAt:=xlWhole, _ ↓ LookAt:=xlPart, _ と書き換えれば、部分でも検索して置換してくれます。 今、試してみましたが、どうやら、そちらのほうがよかったですね。気が付かないですみません。 >試していませんが指定フォルダの下位フォルダの中のファイルも置換されるのでしょうか? これも、間違いやすい表現でした。 現在のバージョンでは、 #'ここは下位フォルダでも可能です。 # Const myDrive As String = "C:\" 下位フォルダを書いてもよいです、という意味です。 もちろん、下位フォルダを調べることの出来るように作ることも出来ますが、もう少し、コードが長くなりそうです。でも、存在するExcelのブックを全て調べてしまうこともあるので、ちょっとどうなるか分りません。
お礼
何度もすみません。 このマクロだとCドライブのみの指定になりますが 他のドライブ(たとえばDドライブ、ネットワーク越しのサーバー内のフォルダ等)を指定したい場合どうしたらいいでしょうか?
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #4 のWendy02 です。 >フォルダがデスクトップに置いてあるのですがそれが問題でしょうか? たぶん、それが一番、問題の核心に近いと思います。 デスクトップというのは、実際は、C:\Windowsフォルダにあるのですが、そのフォルダ自体は、ショートカットがほとんどで、デスクトップを指定しても、そこには何もないというわけです。もし、Excelファイルが、Windowsフォルダに存在するというなら、あまり、そこに置くのはお勧めできません。 デスクトップに置いてあるフォルダーを右クリックして、プロパティのリンク先を調べてみてくれますか?たぶん、別の場所にあるのではないかと思います。
お礼
できました。ありがとうございます。 デスクトップフォルダはXPなので C:\Documents and Settings\****\デスクトップ にあるのですが、原因はそれではなく、 セル全体の単語を指定しないで、セルの中の一文字のみを指定していたためのようです。 試していませんが指定フォルダの下位フォルダの中のファイルも置換されるのでしょうか?
- Wendy02
- ベストアンサー率57% (3570/6232)
#4 の Wendy02です。 最初に、ミスがありました。 xlsReplaceのコードの中の最後の部分 .Save '←は不要です。同じことを二度していました。 .Close True End With End Sub baltoさんへ >残念ながらVBAはわかりません。 一応、設定の仕方だけは書いておきます。 今回に関しては、Alt + F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、コードを貼り付けて、再び、Alt + F11 で、画面を閉じます。 実行は、Alt + F8 で、「xlsReplace」を選んで、実行。 または、ボタンをつけるというわけです。 記録マクロでもしていたら、ある程度お分りになるかと思います。なお、Versionに関しては十分です。 後は、#1で、g_nekoruさんがご紹介してくださった、外部ツール(Excelを起動させないで動く)のシェアウェアのほうがよろしいかもしれません。
お礼
試してみました。 でも置換されません。 マクロ登録し、置換したい文字、置換後の文字を指定して実行したのですが変化がありません。 フォルダがデスクトップに置いてあるのですがそれが問題でしょうか? 具体的な内容ですがあるファイルで文字の書き間違えがあり(替→換)また、このファイルが数百個あるためそれを書き換えするのが大変なのでこの質問をしているのです。 下のフリーウェアは使い方がいまいちよくわかりませんでした。 シェアウエアを使うほどでもないのですが・・・。
- hitoshipon
- ベストアンサー率38% (24/62)
#2です。 書いた後で完全に質問の意図を読み間違えている事に気づきました; 無視してください、スミマセン!
- hitoshipon
- ベストアンサー率38% (24/62)
どうしてもExcelでやらないといけないんでしょうか? フリーのリネームソフトを使用したほうが簡単だと思うのですが。 的はずれでしたらゴメンナサイ;
- g_nekoru
- ベストアンサー率34% (30/88)
マクロを作成すればできると思いますがVBAはわかりますか? あとはフリーソフトなどであるかもしれません。 Excel対応のものはほとんどシェアウェアになるかもしれませんが。 http://download.goo.ne.jp/software/search.php?MT=%92u%8A%B7+EXCEL
お礼
ありがとうございます。 元のファイルのコピーをとってから試してみます。
お礼
ありがとうございます。 エクセルのバージョンは2000です。 残念ながらVBAはわかりません。 せっかく書いてもらったのによく理解できなくてすみません。