Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Excel 宏混淆了ActiveWorkbook和ThisWorkbook的区别_Excel_Vba - Fatal编程技术网

Excel 宏混淆了ActiveWorkbook和ThisWorkbook的区别

Excel 宏混淆了ActiveWorkbook和ThisWorkbook的区别,excel,vba,Excel,Vba,第一篇文章,但不是第一次访问-这个论坛在过去3年中对我发展VBA编码技能提供了宝贵的帮助-非常感谢 我遇到了一个奇怪的问题 我已经创建了一个月末模板供我的团队使用。 此模板存储许多宏,包括一些由键盘快捷键激活的宏。这些快捷方式激活的宏都以CSV格式在其他报表上运行 我已经确保,如果活动工作簿是主工作簿,宏将停止运行,因为它会进行大量格式化,并会严重损坏主工作簿 因此,这个故障保护短代码将每天运行数百次。。。。。偶尔,一个月一两次,excel会感到困惑。尽管ActiveWorkbook不是This

第一篇文章,但不是第一次访问-这个论坛在过去3年中对我发展VBA编码技能提供了宝贵的帮助-非常感谢

我遇到了一个奇怪的问题

我已经创建了一个月末模板供我的团队使用。 此模板存储许多宏,包括一些由键盘快捷键激活的宏。这些快捷方式激活的宏都以CSV格式在其他报表上运行

我已经确保,如果活动工作簿是主工作簿,宏将停止运行,因为它会进行大量格式化,并会严重损坏主工作簿

因此,这个故障保护短代码将每天运行数百次。。。。。偶尔,一个月一两次,excel会感到困惑。尽管ActiveWorkbook不是ThisWorkbook,但它的行为与ThisWorkbook相同,并中止宏

'防止在月末分配模板上运行宏

Dim w As Workbook

Set w = ActiveWorkbook

If w Is ThisWorkbook Then
Exit Sub

End If
我真的想不起来了,代码非常简单,100%防止了对主工作簿的不必要的损坏(这是最主要的事情),但偶尔也会阻止格式化宏在其他工作簿中运行

在这些罕见的情况下,用户必须关闭所有excel工作簿,一旦重新打开,它将再次正常工作:|


这只是一个excel错误吗?这里有什么我没有考虑的,这个代码应该改进吗?我喜欢它的简单性,并且它100%避免了对主工作簿的损坏,我只是对excel似乎对该工作簿是什么/应该是什么感到恼火,而且我无法解释它。

任何您不希望用户弄乱的主工作簿都应该具有由宏关闭和打开的保护。将数据与视图分开。锁定视图并仅修改数据。对您来说,这意味着CSV将导入到隐藏工作表上的列中,然后您的受保护工作表上的数据和链接的数据表将神奇地更新。应该没有格式化宏。格式是静态的。链接的数据是什么变化

任何您不希望用户弄乱的主工作簿都应该具有由宏关闭和打开的保护。将数据与视图分开。锁定视图并仅修改数据。对您来说,这意味着CSV将导入到隐藏工作表上的列中,然后您的受保护工作表上的数据和链接的数据表将神奇地更新。应该没有格式化宏。格式是静态的。链接的数据是什么变化

你为什么不定义其他工作簿呢
Set w=workbook.Open(路径和名称)
Set w=workbook(名称和扩展)
应尽量避免使用
ActiveWorkbook
。与避免依赖
单元格或区域的方法相同,您将希望避免依赖
.Active
工作簿和/或工作表。依赖这些方法会给用户留下错误的空间,这是不好的。当你可以明确地说出你的两本书是什么的时候,没有必要这样做@Damian@Damian这将是一个挑战。工作簿名称是可变的,包括月份-年份(格式为MMYYYY),这很简单,但也包括一个存储编号,可以是编号介于1和2000之间的830个存储中的任意一个。店号将是一个很大的绊脚石。我将对此进行研究,但由于用户手动打开了将在其上运行宏的工作簿,因此我不确定是否能够定义存储编号。我也许可以通过比较工作簿名称的一部分来绕过它,因为这是可以预测的。@Urderboy,我认为这本工作簿非常可靠?对活动工作簿的引用很好地避免了在此工作簿上运行宏,但由于某些原因,我无法理解,活动工作簿与此工作簿混淆。它将每月发生一次或两次,我可以看到-在调试模式下,从目标工作簿(应该是活动工作簿)开始,VBA代码最终退出子工作簿,认为它是此工作簿。如果用户关闭所有excel窗口并重新启动,则工作正常。@urdearboy您是对的,而且我最近对大多数代码都非常详细。您为什么不定义其他工作簿
Set w=workbook.Open(路径和名称)
Set w=workbook(名称和扩展)
应尽量避免使用
ActiveWorkbook
。与避免依赖
单元格或区域的方法相同,您将希望避免依赖
.Active
工作簿和/或工作表。依赖这些方法会给用户留下错误的空间,这是不好的。当你可以明确地说出你的两本书是什么的时候,没有必要这样做@Damian@Damian这将是一个挑战。工作簿名称是可变的,包括月份-年份(格式为MMYYYY),这很简单,但也包括一个存储编号,可以是编号介于1和2000之间的830个存储中的任意一个。店号将是一个很大的绊脚石。我将对此进行研究,但由于用户手动打开了将在其上运行宏的工作簿,因此我不确定是否能够定义存储编号。我也许可以通过比较工作簿名称的一部分来绕过它,因为这是可以预测的。@Urderboy,我认为这本工作簿非常可靠?对活动工作簿的引用很好地避免了在此工作簿上运行宏,但由于某些原因,我无法理解,活动工作簿与此工作簿混淆。它将每月发生一次或两次,我可以看到-在调试模式下,从目标工作簿(应该是活动工作簿)开始,VBA代码最终退出子工作簿,认为它是此工作簿。如果用户关闭所有excel窗口并重新启动,那么它就可以正常工作。@urdearboy您是对的,我已经