プロが教えるわが家の防犯対策術!

エクセルで同じフォルダに入っている複数のファイルがあります。(数百個)その中の特定の文字を別の文字に置き換えることは可能でしょうか?

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます。
エクセルのバージョンは2000です。
残念ながらVBAはわかりません。
せっかく書いてもらったのによく理解できなくてすみません。

お礼日時:2005/09/03 07:16

こんにちは。


>他のドライブ(たとえばDドライブ、ネットワーク越しのサーバー内のフォルダ等)を指定したい場合どうしたらいいでしょうか?

Dドライブの時は、
 D:\
でよいのですが、ネットワークの場合は、

 "\\サーバー名\フォルダ"

ということになります。ただし、書き換えられる状態になっていないといけませんが。

この回答への補足

返答が遅れてすみません。

>Dドライブの時は、
> D:\
>でよいのですが、ネットワークの場合は、
>
> "\\サーバー名\フォルダ"

どこを書き換えればいいですか?
マクロを実行すると
”フォルダを選んでください”
となって、Cドライブ以下を選択するようになっています。

ネットワーク越しに関してはもちろん書き換え可能な権限があります。

補足日時:2005/09/08 12:55
    • good
    • 0
この回答へのお礼

すみません。やりもしないで聞くばかりで。

いま、マクロの部分を書き換えたらできました。
ありがとうございました。

お礼日時:2005/09/08 13:01

こんにちは。



>セルの中の一文字のみを指定していたためのようです。
>試していませんが指定フォルダの下位フォルダの中のファイルも置換されるのでしょうか?

それについては、細かく触れていませんでしたが、

'置換のサブルーチン
という中の
×LookAt:=xlWhole, _
  ↓
 LookAt:=xlPart, _

と書き換えれば、部分でも検索して置換してくれます。
今、試してみましたが、どうやら、そちらのほうがよかったですね。気が付かないですみません。


>試していませんが指定フォルダの下位フォルダの中のファイルも置換されるのでしょうか?

これも、間違いやすい表現でした。
現在のバージョンでは、

#'ここは下位フォルダでも可能です。
#  Const myDrive As String = "C:\"

下位フォルダを書いてもよいです、という意味です。
もちろん、下位フォルダを調べることの出来るように作ることも出来ますが、もう少し、コードが長くなりそうです。でも、存在するExcelのブックを全て調べてしまうこともあるので、ちょっとどうなるか分りません。
    • good
    • 0
この回答へのお礼

何度もすみません。
このマクロだとCドライブのみの指定になりますが
他のドライブ(たとえばDドライブ、ネットワーク越しのサーバー内のフォルダ等)を指定したい場合どうしたらいいでしょうか?

お礼日時:2005/09/05 09:36

こんにちは。


#4 のWendy02 です。

>フォルダがデスクトップに置いてあるのですがそれが問題でしょうか?
たぶん、それが一番、問題の核心に近いと思います。

デスクトップというのは、実際は、C:\Windowsフォルダにあるのですが、そのフォルダ自体は、ショートカットがほとんどで、デスクトップを指定しても、そこには何もないというわけです。もし、Excelファイルが、Windowsフォルダに存在するというなら、あまり、そこに置くのはお勧めできません。

デスクトップに置いてあるフォルダーを右クリックして、プロパティのリンク先を調べてみてくれますか?たぶん、別の場所にあるのではないかと思います。
    • good
    • 0
この回答へのお礼

できました。ありがとうございます。
デスクトップフォルダはXPなので
C:\Documents and Settings\****\デスクトップ
にあるのですが、原因はそれではなく、
セル全体の単語を指定しないで、セルの中の一文字のみを指定していたためのようです。
試していませんが指定フォルダの下位フォルダの中のファイルも置換されるのでしょうか?

お礼日時:2005/09/04 15:53

#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を起動させないで動く)のシェアウェアのほうがよろしいかもしれません。
    • good
    • 0
この回答へのお礼

試してみました。
でも置換されません。
マクロ登録し、置換したい文字、置換後の文字を指定して実行したのですが変化がありません。
フォルダがデスクトップに置いてあるのですがそれが問題でしょうか?
具体的な内容ですがあるファイルで文字の書き間違えがあり(替→換)また、このファイルが数百個あるためそれを書き換えするのが大変なのでこの質問をしているのです。

下のフリーウェアは使い方がいまいちよくわかりませんでした。
シェアウエアを使うほどでもないのですが・・・。

お礼日時:2005/09/04 09:01

#2です。


書いた後で完全に質問の意図を読み間違えている事に気づきました;
無視してください、スミマセン!
    • good
    • 0

どうしてもExcelでやらないといけないんでしょうか?


フリーのリネームソフトを使用したほうが簡単だと思うのですが。
的はずれでしたらゴメンナサイ;

参考URL:http://www.vector.co.jp/soft/win95/util/se156290 …
    • good
    • 0

マクロを作成すればできると思いますがVBAはわかりますか?



あとはフリーソフトなどであるかもしれません。
Excel対応のものはほとんどシェアウェアになるかもしれませんが。

http://download.goo.ne.jp/software/search.php?MT …
    • good
    • 0
この回答へのお礼

ありがとうございます。
元のファイルのコピーをとってから試してみます。

お礼日時:2005/09/03 07:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!