みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

フォルダ内の複数のファイルで置換したい

お世話になります。

現在、フォルダ内にWord及びExcelファイルがたくさんありまして、
その中の”2009-11-30”という語を”2009-12-22”に
一括で置換したいと思っています。
置換したい語は、Wordではヘッダに、Excelではフッタにあります。

ネットで検索したらスクリプトという物があることを知り、また、
以下のようなword用のスクリプトを見つけたので、
置換する用語の部分だけ変更したのですが、
ヘッダに書いてある文字は置換してくれませんでした。
(ヘッダ以外の文字で試したらOKでした)

これは、アイコンをダブルクリックして
対象のファイルが入っているフォルダを指定するものらしいです。

-------------------------------
'#1 フォルダ全部のファイルでやる場合
'#2 指定したファイルだけやる場合

Const wdReplaceAll = 2

strDir = InputBox("ディレクトリ名を入力してください。") '#1
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") '#1
Set objFolder = objFSO.GetFolder(strDir) '#1

Set objWord = CreateObject("Word.Application")
objWord.Visible = True

For Each objFile In objFolder.Files '#1
If Lcase(Right(objFile.Name, 4)) = ".doc" Then '#1
strArg = objFile.Path '#1

'#2 For Each strArg In WScript.Arguments

Set objDoc = objWord.Documents.Open(strArg)
Set objSelection = objWord.Selection

objSelection.Find.ClearFormatting
objSelection.Find.Replacement.ClearFormatting
With objSelection.Find
.Text = "2009-11-30"
.Replacement.Text = "2009-12-22"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = True
End With
objSelection.Find.Execute ,,,,,,,,,,wdReplaceAll
'Replace:=wdReplaceAll
objDoc.Save
objWord.Documents.Close
Set objDoc = Nothing
Set objSelection = Nothing

End if '#1
Next
objWord.Quit
--------------------------------------

これは、内容をどう変えたらヘッダやフッタ部分も
置換してくれるようになりますか?
また、Excel用にするには、このスクリプト内の
"Word"を"Excel"に変えるだけで良いのでしょうか?

参考までに、OSはXPです。
足りない情報等ございましたらご指摘願います。
どうぞよろしくお願いいたします。

投稿日時 - 2009-12-21 11:09:04

QNo.5537461

暇なときに回答ください

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

こんにちは
>With ws.PageSetup
>If .LeftFooter = "2009-11-30" Then .LeftFooter = "2009-12-22"
>If .CenterFooter = "2009-11-30" Then .CenterFooter = "2009-12-22"
>If .RightFooter = "2009-11-30" Then .RightFooter = "2009-12-22"
>End With

>エクセルはフッタの左側にあり、
>そこには他の文字も含まれています。
なのでフッター値を一旦、変数に取得して置換えれば良いでしょうね
With ws.PageSetup
myFooter = .LeftFooter
myFooter = Replace(myFooter, "2009-11-30", "2009-12-22")
.LeftFooter = myFooter
End With

ワードは
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Open("G:\Test.doc")
With objDoc.Sections(1).Headers(1)
myHeader = .Range.Text
myHeader = Replace(myHeader, "2009-11-30", "2009-12-22")
.Range.Text = myHeader
End With
objDoc.Close True
を参考に

投稿日時 - 2009-12-25 16:45:18

ANo.2

横槍失礼いたします。
こんな感じでしょうか、watabe007様のコードを流用させていただきました。

Dim objExcel
Dim wb, ws
Dim dirPath As String
Dim strFilePath As String

Set objExcel = CreateObject("Excel.Application")
'objExcel.Visible = True '処理中Excelを表示したいのなら先頭の' を消してください。

With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
dirPath = .SelectedItems(1) & "\"
Else
Exit Sub
End If
End With

' 先頭のファイル名の取得
strFilePath = Dir(dirPath & "*.xls", vbNormal)
' ファイルが見つからなくなるまで繰り返す
Do While strFilePath <> vbNullString
Set wb = objExcel.Workbooks.Open(dirPath & strFilePath)
For Each ws In wb.Worksheets
With ws.PageSetup
If .LeftFooter = "2009-11-30" Then .LeftFooter = "2009-12-22"
If .CenterFooter = "2009-11-30" Then .CenterFooter = "2009-12-22"
If .RightFooter = "2009-11-30" Then .RightFooter = "2009-12-22"
End With
Next
wb.Close True 'Test.xls 変更を保存して閉じる
' 次のファイル名を取得
strFilePath = Dir()
Loop

objExcel.Quit 'Excelを終了
Set objExcel = Nothing
MsgBox "処理しました。"

投稿日時 - 2009-12-25 15:28:39

ANo.1

Excelの単体ファイルC:\Test.xlsでフッターの置換をしました。
参考になれば

Dim objExcel
Dim wb, ws

Set objExcel = CreateObject("Excel.Application")
'objExcel.Visible = True '処理中Excelを表示したいのなら先頭の' を消してください。
Set wb = objExcel.Workbooks.Open("C:\Test.xls")
For Each ws in wb.WorkSheets
With ws.PageSetup
If .LeftFooter = "2009-11-30" Then .LeftFooter = "2009-12-22"
If .CenterFooter = "2009-11-30" Then .CenterFooter = "2009-12-22"
If .RightFooter = "2009-11-30" Then .RightFooter = "2009-12-22"
End With
Next
wb.Close True 'Test.xls 変更を保存して閉じる
objExcel.Quit 'Excelを終了
Set objExcel = Nothing
MsgBox "処理しました。"

投稿日時 - 2009-12-21 13:14:59

補足

watabe007様の内容を見て気づきました。

補足です。
ワードはヘッダに変更箇所があります。
エクセルはフッタの左側にあり、
そこには他の文字も含まれています。

投稿日時 - 2009-12-21 13:34:59

お礼

回答どうもありがとうございます!

こちらを試してみたのですが、これは全てのファイル名を
この中で指定しないといけないんですよね?
ファイルが数十個ある場合は、どうすればよいのでしょうか?

投稿日時 - 2009-12-21 13:34:14

あなたにオススメの質問