- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个从电子表格函数(用户定义函数,UDF)调用的 VBA 宏。当从互联网下载电子表格并且用户相应地设置“信任中心”设置时,电子表格将在所谓的“ protected View ”中打开。该函数将不会被调用。显示按钮“启用编辑”。如果按下按钮,电子表格将被“信任”并正常重新打开,开始计算,从而调用用户定义的函数。
但是,在该 VBA 函数中,Application.ActiveWorkbook
的值为 Nothing
。这可以在调试器中验证。
由于我只需要读取电子表格的一些属性(如路径名),因此我也可以检查 Application.ActiveProtectedViewWindow
的可用性,它应该引用工作簿的 protected 版本。在调试器中,可以检查该对象。但是,在发布版(不带调试)中运行时,Application.ActiveProtectedViewWindow
的值也是Nothing
。
这两种行为(尤其是第一种行为)似乎是 Excel 2010 和 2013 中存在的错误(另请参阅 a post at the MSDN forum )。
Question: Is there a way to get hold of properties of the active workbook after it has been enabled for editing?
PS:作为 Siddharth Rout 的精彩观察的后续,“ThisWorkbook”可能会起作用:就我而言,宏不是开放式工作簿的一部分。 UDF 在 XLA 中定义。因此,本工作簿将引用 XLA。我确实需要获取 ActiveWorkbook(= 调用 UDF 的工作簿)而不是 ThisWorkbook(= 运行 UDF 的工作簿)。
重要要求:
我的函数被调用为用户定义函数,即执行顺序由 Excel 更新单元格决定。
该函数不是正在打开的工作簿的一部分。它是 XLA 的一部分。
我无法向打开的工作簿添加任何代码。
最佳答案
摘要: 该问题可以重现,并且有一些可能的解决方法。最有希望的一种方法(通过聊天得出)是使用 ActiveWindow.Parent
而不是 ActiveWorkbook
。
我能够复制这个问题。
我试过了
Private Sub Workbook_Open()
MsgBox "Application.ActiveWorkbook Is Nothing = " & _
CStr(Application.ActiveWorkbook Is Nothing)
End Sub
我得到了正确
但是,然后我尝试了这个,它给了我False
Private Sub Workbook_Open()
MsgBox "Application.ActiveWorkbook Is Nothing = " & _
CStr(Application.ThisWorkbook Is Nothing)
End Sub
现在回答您的问题...
Question: Is there a way to get hold of properties of the workbook after it has been enabled for editing?
是的。使用 ThisWorkbook
而不是 ActiveWorkbook
评论跟进
退出保护模式
后工作簿完全加载后,您将能够访问ActiveWorkbook
对象。要对此进行测试,请将此代码放入 protected 文件中。
Private Sub Workbook_Activate()
MsgBox "Application.ActiveWorkbook Is Nothing = " & _
CStr(Application.ActiveWorkbook Is Nothing)
End Sub
您会注意到您得到了False
因此,一旦您的工作簿加载,您的外接程序就可以使用 ActiveWorkbook
与打开的文件进行交互。
这是另一个测试
Private Sub Workbook_Activate()
MsgBox ActiveWorkbook.Path
End Sub
这就是我退出保护模式
时得到的结果
聊天跟进
使用 ActiveWindow.Parent.Path
而不是 ActiveWorkbook.Path
可以解决问题。
关于当 protected View 中的 "Nothing"时,Excel VBA ActiveWorkbook 为 "Enable Editing",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19345600/
... 每 100 次迭代保存您的工作簿? 它只是一个编程语言问题。 是 If x/100 = Int(x/100) Then ActiveWorkbook.Save 还是 if x/100 = In
我对 activeworkbook/activesheet 属性有一些疑问,希望得到您的帮助: 在任何情况下,最多只有一个事件工作簿或没有,这适用于事件表。那正确吗? 如果范围、单元格等属性在使用时不
ActiveWorkbook 和有什么区别和 ActiveWindow ? 有时我觉得他们是一样的。 最佳答案 Windows 和工作簿确实有不同的属性/方法(尽管有些是相同的),所以你不能总是用一个
上下文:Excel 2013 VBA。使用加载项时,术语“ActiveWorkBook”应指正在编辑的文档,而“ThisWorkBook”则指后台的加载项。考虑代码 在外接程序的 ThisWorkBo
我希望这是一个简单的问题... 我的理解是“ActiveWorkbook”返回当前事件的工作簿,即使宏在不同的工作簿中运行(这就是为什么我几乎总是使用“ThisWorkbook”来代替)。 即使宏在不
我创建了一个加载项,将工作表添加到工作簿并导入多个模块。然后,我希望加载项运行现在位于 Active Workbook 中的子例程。这是我到目前为止所拥有的,并且我收到运行时错误“438”:对象不支持
ActiveWorkbook.SaveCopyAs Filename : 给 Runtime error 1004 但点击 Debug>Run> Continue 代码按预期运行。 我有一个启用宏的
执行以下行时,抛出1004运行时错误(应用程序定义或对象定义错误) rangeString = ActiveWorkbook.Names.Item("MyTableName").RefersToLoc
我有一个子例程,它调用 ActiveWorkbook.RefreshAll 从网站上的 XML 源引入新数据,然后对其执行多项修改。问题是没有足够的时间来完成 RefreshAll 命令,因此以下子命
我搜索了这个网站,发现了类似的问题,但仍然不同。 我在这个网站上找到的那些(例如 this 、 this 和 this )涉及太多代码(这可能是它没有正确执行的原因)并且还涉及 Workbook_Be
我不确定为什么我的 VBA 代码片段不起作用 - 我希望有人能提供帮助。 我只是试图将 ActiveWorkbook.SaveAs 作为更大模块的一部分执行,但它出错了。 这是发生错误的代码片段: L
我在 MS-Project 中编写了这段代码,但我认为我包含了所有必要的库来与 Excel 交互。 这是我尝试过的: Sub OpenBackupFile() Titler = ActiveP
在 Excel 2013 (Office 15) 中,快捷方式和非常简单的用户表单(用于格式化)的组合有时会导致事件工作簿消失,而另一个工作簿无缘无故地显示(仅有时会发生,通常是在更改事件工作簿之后)
我的功能如下: Sub saveCSV() Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:= _
我正在编写一个 Excel 加载项。以下是我的代码 private void ThisAddInStartup(object sender, EventArgs e) { Excel.Shee
我正在尝试将一些嵌入在 Excel 电子表格中的 VBA 代码转换为将所有选项卡作为 CSV 保存到 VBS 脚本中,我可以从命令行运行该脚本来执行相同的操作。 Set objFSO = Create
所以,这基本上就是我想要做的。我在从 MSSQL 生成的文件中有一列员工编号。我想在 URL 所在的单元格中创建一个函数,http://www.someplace.com/employee.php?I
我有这个 VBA: ActiveWorkbook.SaveAs Filename:=Path & Filename & ".xls" ActiveWorkbook.Close 这应该将当前事件的工作簿
我发现 Workbook.Activate并不总是将该工作簿带到窗口的前面。我想知道将工作簿设置为窗口顶部的正确方法是什么,所以当宏完成时,这就是您正在查看的工作簿。 我应该使用任何Windows()
从外部源中选择数据 我有一个使用 select 检索数据的数据连接使用 vba 代码从 SQL 服务器查询到 Excel 工作表,如下所示: With ActiveWorkbook.Connectio
我是一名优秀的程序员,十分优秀!