Vba 似乎无法移动工作表';内容可靠

Vba 似乎无法移动工作表';内容可靠,vba,excel,Vba,Excel,这已经是我的第一部StackOverflow三部曲的第4部分:)希望把这一切结合在一起能找到答案,或者证明它无法处理 快速总结 (有关更多详细信息和结论,请参阅。) 我有一个带有数字签名VBA项目的Excel工作簿,供我的客户使用。它的一个功能是,用户可以复制图纸(模板),我的代码可以识别模板图纸和副本本身(用于进一步处理)。工作表本身包含工作表范围的命名范围,工作表在公式中的所有位置都使用彼此的名称。它们也都使用表(ListObject表)。此外,我的目的是让用户可以自由地向这些表单添加任何他

这已经是我的第一部StackOverflow三部曲的第4部分:)希望把这一切结合在一起能找到答案,或者证明它无法处理

快速总结 (有关更多详细信息和结论,请参阅。)

我有一个带有数字签名VBA项目的Excel工作簿,供我的客户使用。它的一个功能是,用户可以复制图纸(模板),我的代码可以识别模板图纸和副本本身(用于进一步处理)。工作表本身包含工作表范围的命名范围,工作表在公式中的所有位置都使用彼此的名称。它们也都使用表(ListObject表)。此外,我的目的是让用户可以自由地向这些表单添加任何他们想要的内容

我的第一次设置是按代码名找到这些工作表的,但由于使用代码名意味着这些工作表有一个代码模块(即使它们后面没有任何代码),因此在它们的计算机上复制这些工作表(上面没有我的数字证书)将破坏VBA项目的签名。从那时起,我的客户将在保存并重新打开工作簿后收到宏安全警告。不需要的

修正1是调整我的代码,通过在图纸上使用特殊名称的代码来识别这些图纸。这样我就不依赖于任何VBA工作表的细节。而且,由于工作表可能缺少VBA模块(再次请参见-基本上创建一个新工作表,从那时起不再打开VBA IDE),我希望找到一种方法来清除这些工作表中的VBA。我会在现在交付解决方案时使用它,并且在将来升级工作簿的实时生产版本中的代码时也会使用它。全部自动化,以减少出错的机会

那么问题是如何移动现有的Excel工作表内容?我看到两种选择:

  • 将图纸的内容移动到新图纸
  • 将工作表移到另一个(VBA free.xlsx)工作簿中并返回
  • 将内容移动到新工作表 我已经知道了。它仍在继续,但我高度怀疑这是一条死胡同。我使用了以下伪代码:

    sheetName = sourceSheet.Name
    Set destSheet = ThisWorkbook.Worksheets.Add
    Call sourceSheet.Cells.Cut(destSheet.Cells)
    Call sourceSheet.Delete
    destSheet.Name = sheetName
    Call fixBrokenFormulasAndOtherStuff(ThisWorkbook)
    
    Set scrubWorkbook = Workbooks.Add(1)
    Set allSheets = CollectSpecialSheets(ThisWorkbook)
    Call MoveSheets(allSheets, ThisWorkbook, scrubWorkbook)
    Call SaveAndReopenScrubWorkbook(scrubWorkbook)
    Set allSheets = CollectSpecialSheets(scrubWorkbook)
    Call MoveSheets(allSheets, scrubWorkbook, ThisWorkbook)
    
    摘要:将工作表的内容移动到新工作表会使工作表范围内的名称变得混乱;移动之后,剩下的是分叉名称定义,两个分支都在使用中,这不是实现上述
    fixbrokenformula和其他东西的简单方法

    将内容移动到新工作簿 我试图解决这个问题。然而,这篇文章似乎也没有任何进展

    为此,我使用了以下伪代码:

    sheetName = sourceSheet.Name
    Set destSheet = ThisWorkbook.Worksheets.Add
    Call sourceSheet.Cells.Cut(destSheet.Cells)
    Call sourceSheet.Delete
    destSheet.Name = sheetName
    Call fixBrokenFormulasAndOtherStuff(ThisWorkbook)
    
    Set scrubWorkbook = Workbooks.Add(1)
    Set allSheets = CollectSpecialSheets(ThisWorkbook)
    Call MoveSheets(allSheets, ThisWorkbook, scrubWorkbook)
    Call SaveAndReopenScrubWorkbook(scrubWorkbook)
    Set allSheets = CollectSpecialSheets(scrubWorkbook)
    Call MoveSheets(allSheets, scrubWorkbook, ThisWorkbook)
    
    在MoveSheets的实现中,表是非常麻烦的。虽然Excel可以一次移动多个工作表,保留它们的链接,但当工作表上有任何表时,它拒绝这样做。因此
    工作表(Array())。Move
    不会剪切它

    单独移动工作表是可行的(通过
    Worksheet.Move
    ),但是我们再次得到了移动工作表内容时相同的范围名称mangling。因此,我们又剩下了一个不需要的强制性
    调用fixbrokernformula和其他东西

    这样移动不起作用,但我们也可以复制,对吗?但是,复制工作表与移动工作表具有相同的表限制,因此在这里我们还必须逐个工作表进行复制。这反过来意味着,所有在工作表副本上使用公式的范围名称仍然指向原始工作簿工作表,需要删除这些工作表,从而终止这些公式。换句话说:对
    调用fixbrokenformula和其他东西的另一种需求

    问题 现在我简直不敢相信我是第一个同时签署他的VBA项目并让他的用户能够复制他们的表单的人/公司?!其他人如何解决这一困境?或者他们只是不签署VBA项目,并指示用户减少其宏安全设置


    我不太热衷于编写
    fixbrokenformula和其他
    函数的原因是,我真的无法理解需要在其中添加什么。当然,我可以在所有工作表上的所有单元格上循环,并在那里修复任何公式,但还有许多其他地方可以使用公式。数据验证列表、表单控件链接值等。。。?现在我是一个精通Excel的专家,但我不敢说我知道Excel的每一个细节;用户们时不时地用Excel中我甚至不知道的东西让我惊讶:)或者也许我只是拥有比一般人更多的创意用户…:P

    @任何主持人:删除其他3个问题并将它们合并到这个问题中会更好吗?不过,他们都会问一些无关的问题。我也会让他们链接回这个。