Workbook_Open()上的计时问题

时间:2016-11-23 17:11:51

标签: excel-vba events timing vba excel

我想我在这里遇到时间问题。

情境:
在Excel启动时有一个帮助程序加载项检查更新并更新另一个加载项。

棘手的部分是“在Excel启动时”。通过帮助程序加载项的Workbook_Open()事件打开Excel,我可以检查更新。
实际上它确实有效,另一个插件得到更新。

问题是当用户打开Excel单击.xlsx / .xls / .csv / etc文件时。

我想检测到这一点,如果通过Excel图标打开Excel,则运行更新检查,否则它必须不执行任何操作。

如何确定Excel的打开方式?

到目前为止我尝试了什么:

  • 验证是否已打开非工作簿(不工作)
  • 验证Application.Ready(不工作)

这两个测试都无法正常工作,因为我认为,在创建空工作簿(如果Excel通过其图标启动)或加载(如果通过单击启动Excel启动)之前触发了辅助加载项Workbook_Open事件一个.xls文件)。

提前谢谢你:)

实施了可能的解决方案,检查命令行参数: https://www.dmcinfo.com/latest-thinking/blog/id/247/read-command-line-parameters-from-vba

Option Explicit

Private Declare Function GetCommandLineA Lib "kernel32" () As Long
Private Declare Function lstrcpynA Lib "kernel32" ( _
   ByVal pDestination As String, ByVal pSource As Long, _
   ByVal iMaxLength As Integer) As Long

Private Sub Workbook_Open()
    Dim pCmdLine As Long     ' Pointer to the string
    Dim strCmdLine As String ' Command line string

    ' Get the pointer to the command line string
    pCmdLine = GetCommandLineA

    ' Fill the string with zeros
    ' 300 characters for command line seems to be enough
    strCmdLine = String(300, vbNullChar)

    ' Copy from the pointer to VBA-style string
    lstrcpynA strCmdLine, pCmdLine, Len(strCmdLine)

    ' At this point we got the string
    ' But rest of it filled with 0 characters.
    strCmdLine = Left(strCmdLine, InStr(1, strCmdLine, vbNullChar) - 1)
End Sub

如果单独启动Excel,结果为:

"C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE"

否则:

"C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" /dde

0 个答案:

没有答案