Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在多个excel工作簿中查找并替换公式中的特定字符串_Vba_Excel - Fatal编程技术网

Vba 在多个excel工作簿中查找并替换公式中的特定字符串

Vba 在多个excel工作簿中查找并替换公式中的特定字符串,vba,excel,Vba,Excel,我有一个包含6个子文件夹和~300个excel工作簿的目录(每天都在增长)。 每个工作簿都有多个公式(每个工作簿约1200个),这些公式引用存储在服务器路径上的CSV数据转储 我的问题是excel将CSV数据转储视为“脏数据”,并在每次打开工作簿时提示警告,声称无法更新链接(但选中链接后,excel会说没有问题)。 在我所有的研究中,我发现除了用excel没有任何问题的.xsl文件替换数据源之外,似乎没有其他方法可以解决这个问题 我需要做的是,在大约300本工作簿上执行查找和替换,在公式中找到C

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

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

我需要做的是,在大约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
如果有帮助的话,我也愿意从“主”工作簿复制,并将特定范围复制到其他工作簿(将每本书的范围复制到另一个范围),但我束手无策,不知道如何继续。
任何帮助都将不胜感激。

无需在所有公式中查找和替换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的路径和名称

当然!。。。我为什么不早点想到那件事。。这比我想做的容易多了。。。我可以把它扔进我的protect/unprotect循环中,立刻完成所有的事情!非常感谢!