【问题标题】:Find and replace specific string inside a formula in multiple excel workbooks在多个 Excel 工作簿的公式中查找和替换特定字符串
【发布时间】:2017-03-07 22:04:21
【问题描述】:

我有一个包含 6 个子文件夹和约 300 个 Excel 工作簿的目录(每天都在增长)。 每个工作簿都有多个公式(每个工作簿约 1200 个)引用存储在服务器路径上的 CSV 数据转储。

我的问题是,excel 将 CSV 数据转储视为“脏数据”,并在每次打开工作簿时提示警告,声称它无法更新链接(但是当检查链接时,excel 会说没有问题) . 在我的所有研究中,我发现似乎没有办法解决这个问题,除了用 .xsl 文件替换数据源,excel 引用时没有任何问题。

我需要做的是对大约 300 个工作簿执行查找和替换,在公式中找到 CSV 服务器路径并将其替换为 .xls 文件的新服务器路径。

我尝试过“Sobolsoft 的 Excel 查找和替换”软件,但它似乎不想在公式内部查找来替换。我使用了“Easy-XL”和“Kutools”,它们都只能在打开的工作簿上工作(我可以忍受,如果我必须一次打开 20-50 个工作簿,运行查找和替换,然后打开下一批),但他们都不想工作。

我已使用以下宏来取消保护/保护目录中完美运行的每个工作簿

Const cStartFolder = "M:\Transfer\DrillHole_Interaction\4.For_Survey" 'no slash at end
Const cFileFilter = "*.xlsm"
Const cPassword = "" 'use empty quotes if blank

Sub UnprotectAllWorksheets()
Dim i As Long, j As Long, arr() As String, wkb As Workbook, wks As Worksheet

ExtractFolder cStartFolder, arr()

On Error Resume Next
j = -1: j = UBound(arr)
On Error GoTo 0

For i = 0 To j
    Set wkb = Workbooks.Open(arr(i), False)
    For Each wks In wkb.Worksheets
        wks.Protect cPassword, True, True
    Next
    wkb.Save
    wkb.Close
Next
End Sub

Sub ExtractFolder(Folder As String, arr() As String)
Dim i As Long, objFS As Object, objFolder As Object, obj As Object

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(Folder)

For Each obj In objFolder.SubFolders
    ExtractFolder obj.Path, arr()
Next

For Each obj In objFolder.Files
    If obj.Name Like cFileFilter Then
        On Error Resume Next
        i = 0: i = UBound(arr) + 1
        On Error GoTo 0
        ReDim Preserve arr(i)
        arr(i) = objFolder.Path & Application.PathSeparator & obj.Name
    End If
Next
End Sub

如果有帮助,我也愿意从“主”工作簿复制并将特定范围复制到彼此的工作簿中(将范围复制到每本书的范围),但我无能为力,不要知道如何进行。 任何帮助将不胜感激。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    无需在所有公式中查找和替换 csv 全名(路径和文件名),只需在每个工作簿中一次更改链接源即可。

    在所有需要更改的工作簿中循环尝试此操作。

    Dim Wbk As Workbook
    
        Application.DisplayAlerts = False
        Set Wbk = Workbooks.Open(Filename:="WbkTarget.Fullname", UpdateLinks:=3)
        With Wbk
            .ChangeLink _
                Name:="CsvFile.Fullname", _
                NewName:="XlsFile.Fullname", _
                Type:=xlExcelLinks
            .Save
            .Close
        End With
        Application.DisplayAlerts = True
    

    地点:

    WbkTarget.Fullname:要替换链接的工作簿的路径和名称

    CsvFile.Fullname:要替换的csv文件的路径和名称

    XlsFile.Fullname:替换 csv 文件的 xls 的路径和名称

    【讨论】:

    • 当然!...为什么我没有早点想到..这比我尝试做的要容易得多...我可以将其放入保护/取消保护循环中并立即完成所有工作!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多