使用VBA启用Excel COM加载项而不使用.Connect,而是使用SendMessage或PostMessage

时间:2018-11-16 12:34:50

标签: excel vba excel-vba excel-addins

我有以下代码,可以正常工作,但仅当用户正在查看屏幕时才有效。我需要找到一种实现相同结果的解决方案,但是在屏幕锁定时可以使用。我知道SendKeys在屏幕锁定时不起作用。

我不能使用vntAddIn.Connect = True,因为这会导致错误。可以使用对话框手动成功启用COM加载项,但不能通过.Connect属性成功启用。

我相信我可以使用SendMessagePostMessage API来实现此目的,但是我不确定如何做到这一点。我不确定要使用哪个窗口句柄(例如,它是主要的Excel应用程序?),并且我不知道如何发送Alt组合吗?任何帮助将不胜感激。

注意,我知道使用 PAGE DOWN 到达列表底部并不可靠,因为如果Com加载项不是列表中的最后一项,它可能会失败。我有一个单独的解决方案来确定加载项在列表中的何处出现,并且可以使用特定数量的 DOWN 箭头替换 PAGE DOWN 来解决此问题,但要在实施之前为此,我想确保一切皆有可能,因为在屏幕锁定时无法执行此操作,毫无意义。

Public Sub EnableComAddIn()
  Dim blnAddInIsConnected  As Boolean
  Dim vntAddIn As Variant
  Const CstrComAddinDescription As String = "Oracle Smart View for Office"

  blnAddInIsConnected = False
  For Each vntAddIn In ThisWorkbook.Application.COMAddIns
    If vntAddIn.Description = CstrComAddinDescription Then
      blnAddInIsConnected = vntAddIn.Connect
      Exit For
    End If
  Next

  If Not blnAddInIsConnected Then

    'Make sure Excel application window is active, and a cell is selected.
    ThisWorkbook.Activate
    ThisWorkbook.Worksheets(1).Select
    ThisWorkbook.Worksheets(1).Cells(1, 1).Select

    'Make sure Developer tab is shown on ribbon or Alt-L will not work.
    ThisWorkbook.Application.ShowDevTools = True

    'Use SendKeys to use ALT-L, J to open Com Add-ins window, page down twice to select last entry on list, press space to check the box, press Enter to save.
    DoEvents
    ThisWorkbook.Application.Wait Now() + TimeSerial(0, 0, 1)
    DoEvents
    ThisWorkbook.Application.SendKeys "%LJ{PGDN}{PGDN} {ENTER}", True
    DoEvents
    ThisWorkbook.Application.Wait Now() + TimeSerial(0, 0, 1)
    DoEvents

  End If
End Sub

0 个答案:

没有答案