但因為需要更換 File Server 路徑導致參照會失效
因此撰寫了 VBScript 來進行置換
多年後翻出此程式碼
不確定是否有 Bug, 也許還能用也說不定
===== 程式開始 =====
' 程式會自動搜尋所在資料夾與子資料夾中所有 .xls 檔案並進行字串取代
' 本程式要是 ANSI 編碼
ReplaceCount=10
Dim FindString(10)
Dim ReplaceString(10)
FindString(0)="\\FileServer-01\ShareFolder-01"
FindString(1)="\\FileServer-01\ShareFolder-02"
FindString(2)="\\FileServer-01\ShareFolder-03"
FindString(3)="\\FileServer-01\ShareFolder-04"
FindString(4)="\\FileServer-01\ShareFolder-05"
FindString(5)="\\FileServer-01\ShareFolder-06"
FindString(6)="\\FileServer-01\ShareFolder-07"
FindString(7)="\\FileServer-01\ShareFolder-08"
FindString(8)="\\FileServer-01\ShareFolder-09"
FindString(9)="\\FileServer-01\ShareFolder-10"
ReplaceString(0)="\\FileServer-02\ShareFolder-01"
ReplaceString(1)="\\FileServer-02\ShareFolder-02"
ReplaceString(2)="\\FileServer-02\ShareFolder-03"
ReplaceString(3)="\\FileServer-02\ShareFolder-04"
ReplaceString(4)="\\FileServer-02\ShareFolder-05"
ReplaceString(5)="\\FileServer-02\ShareFolder-06"
ReplaceString(6)="\\FileServer-02\ShareFolder-07"
ReplaceString(7)="\\FileServer-02\ShareFolder-08"
ReplaceString(8)="\\FileServer-02\ShareFolder-09"
ReplaceString(9)="\\FileServer-02\ShareFolder-10"
OpenExcelPassword=inputbox("如果開啟 Excel 檔案需要密碼, 請輸入密碼, 若不須密碼請直接按確認")
Dim TargetPath
Dim FilesArray()
'-----------------------------------------------------------------------
NowPath=left(Wscript.ScriptFullName,len(Wscript.ScriptFullName)-len(Wscript.ScriptName))
' 啟用檔案處理元件
Set fso=CreateObject("Scripting.FileSystemObject")
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
objExcel.DisplayAlerts = False
objExcel.ScreenUpdating = False
Dim BypassArray()
BypassCount=0
Dim ErrorArray()
ErrorCount=0
For Each TargetPath In Wscript.Arguments
TargetLogFile=replace(TargetPath,"\","_")&".log"
Set fid = fso.OpenTextFile(NowPath&TargetLogFile, 8, true, -1)
Dim AlreadyArray()
AlreadyCount=0
Set fidAlready = fso.OpenTextFile(NowPath&TargetLogFile, 1, false, -1)
While Not fidAlready.AtEndOfStream
FileProcess=fidAlready.readline
if InStr(FileProcess," File: ") > 0 then
AlreadyCount=AlreadyCount+1
end if
Wend
AlreadyCount=AlreadyCount-1
fidAlready.close
ReDim AlreadyArray(AlreadyCount)
AlreadyCount=0
Set fidAlready = fso.OpenTextFile(NowPath&TargetLogFile, 1, false, -1)
While Not fidAlready.AtEndOfStream
FileProcess=fidAlready.readline
if InStr(FileProcess," File: ") > 0 then
FileProcessSplit=split(FileProcess," File: ")
AlreadyArray(AlreadyCount)=FileProcessSplit(1)
AlreadyCount=AlreadyCount+1
end if
Wend
AlreadyCount=AlreadyCount-1
fidAlready.close
LoopFolder(TargetPath)
fid.Close
wscript.echo "Finish!! "&TargetPath
Next
Function LoopFolder(Target)
TargetIsFolder=0
if fso.FolderExists(Target) then
TargetIsFolder=1
set folder=fso.GetFolder(Target)
For Each subFolder in folder.SubFolders
' 進入 SubFolder
Enter=1
if instr(subFolder,"Folder\To\Bypass") then
Enter=0
end if
if Enter=1 then
LoopFolder(subFolder)
end if
Next
' 沒進 SubFolder
FilesCount=0
For Each File In folder.Files
FilesCount=FilesCount+1
ReDim Preserve FilesArray(FilesCount)
FilesArray(FilesCount-1)=File
Next
else
FilesCount=0
FilesCount=FilesCount+1
ReDim Preserve FilesArray(FilesCount)
FilesArray(FilesCount-1)=Target
end if
for i=0 to FilesCount-1
if fso.GetExtensionName(FilesArray(i))="xls" or fso.GetExtensionName(FilesArray(i))="xlsx" then
Skip=0
if Skip=0 then
for j=0 to AlreadyCount
if InStr(FilesArray(i),AlreadyArray(j)) then
Skip=1
exit for
end if
next
end if
if Skip=0 then
fid.writeline Date&" "&Time&" Process!! "&FilesArray(i)
DoReplaceSTR=ReplaceSTR(FilesArray(i))
end if
end if
next
End Function
Function ReplaceSTR(TargetFile)
'wscript.echo "Staring String Replace of [" & TargetFile & "]"
On Error Resume Next
Set objWorkbook = objExcel.Workbooks.Open (TargetFile, false, false, , OpenExcelPassword)
objExcel.ScreenUpdating = False
If Err.Number <> 0 Then
ErrDesc=Err.Description
ErrNumber=Err.Number
fid.writeline Date&" "&Time&" Error!!!! File: "&TargetFile&" ---------- "&ErrNumber&" "&ErrDesc
if ErrNumber=462 then
fid.Close
wscript.echo TargetPath
wscript.quit
end if
else
Found=0
For Each S in objWorkbook.WorkSheets
S.Activate
for i=0 to ReplaceCount
FocusReplaceSTR=S.Cells.Replace(FindString(i),ReplaceString(i))
next
Next
objWorkbook.Save
objWorkbook.Close
objExcel.Quit
fid.writeline Date&" "&Time&" Success!! File: "&TargetFile
'Shell.Run("cmd /C ""del /F /Q "&TargetFile&""""),0,True
End If
'wscript.echo "String Replace for [" & TargetFile & "] is Finished"
End Function
===== 程式結束 =====
沒有留言:
張貼留言