这已经成为我的第一个StackOverflow三部曲的第四部分:)希望将它们全部整合在一起将导致答案,或者证明它无法处理。
(有关详细信息和结论,请参阅the background。)
我有一个带有数字签名VBA项目的Excel工作簿,供我的客户使用。它具有的功能之一是用户可以复制工作表(模板),我的代码可以识别模板表和副本本身(用于进一步处理)。工作表本身包含工作表范围的命名范围,工作表使用公式中的所有其他名称。它们也都使用表(ListObject一个)。此外,我的目的是让用户可以随意添加他们想要的任何内容。
我的第一个设置通过代码名称找到了这些工作表,但由于使用代码名称意味着具有代码模块的工作表(即使他们后面没有任何代码),在他们的计算机上复制这些工作表(没有我的数字证书就可以打破VBA项目的签名。从那时起,我的客户将在保存并重新打开工作簿后获得宏安全警告。不希望的。
修复1是调整我的代码,通过使用工作表上特殊名称的代码来识别这些工作表。这样我就不依赖于工作表的任何VBA细节。由于工作表可能缺少VBA模块(再次参见the background - 基本上创建一个新工作表并从那时开始 NOT 打开VBA IDE),我希望找到一种方法擦掉这些纸张上的VBA。我现在在交付解决方案时使用它,以及在将来升级工作簿的实时生产版本中的代码时也是如此。全部自动化,以减少错误的机会。
问题是如何移动现有的Excel工作表内容?我看到两个选择:
我已经started a separate post了。它仍在继续,但我非常怀疑这是一个死路一条。我使用了以下伪代码:
sheetName = sourceSheet.Name
Set destSheet = ThisWorkbook.Worksheets.Add
Call sourceSheet.Cells.Cut(destSheet.Cells)
Call sourceSheet.Delete
destSheet.Name = sheetName
Call fixBrokenFormulasAndOtherStuff(ThisWorkbook)
总结:将工作表的内容移动到新工作表会使工作表范围的名称变得混乱;在移动之后,您将使用分叉名称定义,两个分支都在使用中,而不是上面实现fixBrokenFormulasAndOtherStuff
的简单方法。
我试图用my other question here解决此选项。那个帖子似乎也没有去任何地方......
为此,我使用了以下伪代码:
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可以一次移动多张纸,保留其链接,但当纸张上有任何表格时,它拒绝这样做。因此Worksheets(Array(<all names>)).Move
不会削减它。
单独移动工作表(通过Worksheet.Move
),然后我们再次获得与移动工作表本身内容时相同的范围名称。因此,我们再次留下了不必要的强制性Call fixBrokenFormulasAndOtherStuff
。
因此移动不起作用,但我们也可以复制,对吗?但是,复印纸张具有与移动相同的表格限制,因此这里我们还必须逐页进行。这反过来意味着使用工作表副本上的公式的所有范围名称仍然指向需要删除的原始工作簿工作表,这反过来又会杀死这些公式。换句话说:另一个需要Call fixBrokenFormulasAndOtherStuff
...
现在我无法相信我是第一个签署他的VBA项目的人/公司,并且他的用户能够复制他们的床单吗?!其他人如何解决这种困境?或者他们只是不签署VBA项目,并指导用户减少他们的宏安全设置?
我不太热衷于编写fixBrokenFormulasAndOtherStuff
函数的原因是我真的无法理解我需要放入它的内容。当然,我可以遍历所有工作表上的所有单元格并修复那里的任何公式,但随后有许多其他地方公式被使用。数据验证列表,表单控件链接值,......?现在我是一位精通Excel的专家,但我不敢声称我知道每一个最后的Excel细节;用户总是不停地让我惊讶于我甚至不知道的东西是在Excel中:)或者我只是拥有比平均水平更多的创意用户......:P