Excel VBA代码,用于将包含命名范围的工作表从源工作簿复制到目标工作簿

Excel VBA代码,用于将包含命名范围的工作表从源工作簿复制到目标工作簿,excel,worksheet,named-ranges,vba,Excel,Worksheet,Named Ranges,Vba,我有两本作业本。源工作簿和目标工作簿。它们是完全相同的,除了1个工作表在两个工作表中具有相同的名称,但数据不同(两个工作表都包含大约30张工作表)。我想要的是将源工作簿中其余相同的工作表复制到目标工作簿,留下数据延迟的1个工作表 基本上,目标工作簿中相同的工作表应该替换为源工作簿中的工作表。工作表包含公式和命名范围。 我成功地编写了VBA代码来复制工作表。但由于命名范围具有工作簿范围。命名范围仍然引用源工作簿中的位置。所以我得到了两个同名的命名范围。比如: 'The one already pr

我有两本作业本。源工作簿和目标工作簿。它们是完全相同的,除了1个工作表在两个工作表中具有相同的名称,但数据不同(两个工作表都包含大约30张工作表)。我想要的是将源工作簿中其余相同的工作表复制到目标工作簿,留下数据延迟的1个工作表

基本上,目标工作簿中相同的工作表应该替换为源工作簿中的工作表。工作表包含公式和命名范围。 我成功地编写了VBA代码来复制工作表。但由于命名范围具有工作簿范围。命名范围仍然引用源工作簿中的位置。所以我得到了两个同名的命名范围。比如:

'The one already present in the destination workbook (from the worksheet which was replaced)
Name=VaccStart , Refers To =Sheet2!$A$2 
'The one due to the copied worksheet.
Name=VaccStart , Refers To =[C:\Users\.....\Source.xls]Sheet2!$A$2 

复制时,我希望命名范围引用目标工作簿,而不是源工作簿。因为两个工作簿中的所有工作表都是相同的,我只是替换它们。

这将修改命名范围以删除外部文件引用:

Sub ResetNamedRanges()
    Dim nm As Name
    Dim sRefersTo As String
    Dim iLeft As Integer
    Dim iRight As Integer

    For Each nm In ActiveWorkbook.Names
        sRefersTo = nm.RefersTo
        iLeft = InStr(sRefersTo, "[")
        iRight = InStr(sRefersTo, "]")
        If iLeft > 1 And iRight > 0 Then
            sRefersTo = Left$(sRefersTo, iLeft - 1) & Mid$(sRefersTo, iRight + 1)
            nm.RefersTo = sRefersTo
        End If
    Next nm
End Sub

从源工作簿移动到目标工作簿时,避免意外创建链接的一种简单方法是将目标工作簿从源工作簿重新链接到其自身

xl2010截图

  • 编辑。。。。链接
  • “更改源”,并选择当前文件作为新源

复制工作表时,您的代码是什么?
SourceWorkBk.Worksheets(i).copy Before:=DestWorkBk.Worksheets(myindex)
嘿,这很有效。但是在复制了大约30张工作表之后,我最终得到了多个同名的重复命名范围。我想到的方法是在复制工作表之后删除目标中的所有命名范围,然后将所有源名称复制粘贴到目标。告诉我这是否有意义。
对于DestWorkBk.N中的每个nmames nm.Delete Next For SourceWorkBk中的每个nm.Names DestWorkBk.Names.Add Name:=nm.Name,referesto:=nm.referesto Next
我不太清楚目标wbk(源wbk和原始目标wbk)中是否有两组命名范围或者是否只有一个集合并且引用指向了错误的文件。我建议您尝试@brettdj的建议,看看是否有效。首先从目标文件中删除命名范围可能会有效…也尝试一下。我的整个过程将是自动化的,因为它将在循环中对大约200本工作簿执行相同的操作。因此一个手动的东西。你能告诉我一个vba代码吗?另外,我刚刚发现,除了命名的范围之外,公式还在链接回sourceworkbook。我如何修复它?这就像一个符咒。下面是我使用的代码
DestWorkBk.ChangeLink Name:=SourcePath&“\”&SourceFileName,NewName:=DestPath&”\“&DestFileName,Type:=xlExcelLinks
现在是否有删除重复命名范围的代码?是的-您可以运行此代码,然后使用Dictionary对象进一步编写代码,以查找缩进连接的名称和工作表地址。我建议提出一个新问题:)