返回列表 上一主題 發帖

[發問] 有兩個獨立EXCEL,如何知道切換到另一個獨立EXCEL?

no3-taco前輩,謝謝你的幫忙。

我有查到網路上的類似的問題。我把代碼放在底下(上一封的代碼是我依 ...
justintoolbox 發表於 2015-7-25 17:37


試試看(測試環境 : Win7 + Office2013)
  1. Option Explicit
  2. Option Base 1

  3. #If Win64 Then
  4. Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
  5.         (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, _
  6.          ByVal lpsz2 As String) As LongPtr
  7. Private Declare PtrSafe Function IIDFromString Lib "ole32" _
  8.         (ByVal lpsz As LongPtr, ByRef lpiid As GUID) As LongPtr
  9. Private Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" _
  10.         (ByVal hWnd As LongPtr, ByVal dwId As LongPtr, ByRef riid As GUID, _
  11.          ByRef ppvObject As Object) As Long

  12. #Else
  13. Private Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" _
  14.         (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _
  15.          ByVal lpsz2 As String) As Long
  16. Private Declare Function IIDFromString Lib "ole32" _
  17.         (ByVal lpsz As Long, ByRef lpiid As GUID) As Long
  18. Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
  19.         (ByVal hWnd As Long, ByVal dwId As Long, ByRef riid As GUID, _
  20.          ByRef ppvObject As Object) As Long
  21. #End If
  22.          
  23. Private Type GUID
  24.     Data1 As Long
  25.     Data2 As Integer
  26.     Data3 As Integer
  27.     Data4(7) As Byte
  28. End Type

  29. Private Const S_OK As Long = &H0
  30. Private Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
  31. Private Const OBJID_NATIVEOM As Long = &HFFFFFFF0

  32. Private Function GetXLapp(hWinXL, xlApp As Object) As Boolean
  33.     Dim hWinDesk, hWin7, obj As Object
  34.     Dim iid As GUID
  35.     Call IIDFromString(StrPtr(IID_IDispatch), iid)
  36.     hWinDesk = FindWindowEx(hWinXL, 0&, "XLDESK", vbNullString)
  37.     hWin7 = FindWindowEx(hWinDesk, 0&, "EXCEL7", vbNullString)
  38.     If AccessibleObjectFromWindow(hWin7, OBJID_NATIVEOM, iid, obj) = S_OK Then
  39.         Set xlApp = obj.Application
  40.         GetXLapp = True
  41.     End If
  42. End Function

  43. Private Function IsCollectionExists(ByVal oCol As Collection, ByVal vKey As Variant) As Boolean
  44.     On Error Resume Next
  45.     oCol.Item vKey
  46.     IsCollectionExists = (Err.Number = 0)
  47.     Err.Clear
  48.     On Error GoTo 0
  49. End Function

  50. Public Function GetXLInstanceInfo(ByRef col As Object) As Long
  51.     Dim hWndXL, i As Long
  52.     Dim xlApp As Object, wb As Object

  53.     Set col = Nothing
  54.     Set col = New Collection

  55.     hWndXL = FindWindowEx(0&, 0&, "XLMAIN", vbNullString)
  56.     While hWndXL > 0
  57.         If GetXLapp(hWndXL, xlApp) Then
  58.             For Each wb In xlApp.Workbooks
  59.                 If Not IsCollectionExists(col, wb.Name) Then
  60.                      col.Add Array(hWndXL, xlApp, wb.Name, wb.Path), wb.Name
  61.                 End If
  62.             Next
  63.         End If
  64.         hWndXL = FindWindowEx(0, hWndXL, "XLMAIN", vbNullString)
  65.     Wend
  66.     GetXLInstanceInfo = col.Count
  67.    
  68. End Function

  69. Sub Ex()
  70.     Dim col As Collection
  71.     Dim i As Long
  72.     Dim xlApp As Excel.Application, AR As Variant
  73.    
  74.     i = GetXLInstanceInfo(col)
  75.     Debug.Print "獨立EXCEL有:" & i & "個"
  76.    
  77.     '測試 : 在所有Excel檔第1個工作表儲存格A1上寫入自己的檔名
  78.     For i = 1 To col.Count
  79.         AR = col(i)    ' AR(1): HWND (視窗控制代碼)
  80.                        ' AR(2): xlApp (Excel檔所屬的父項 Excel.Application)
  81.                        ' AR(3): 檔名
  82.                        ' AR(4): 檔案路徑
  83.         Set xlApp = AR(2)
  84.         xlApp.Workbooks(AR(3)).Sheets(1).Range("A1").Value = "檔名:" & AR(3)
  85.     Next
  86.    
  87.     Set xlApp = Nothing
  88.     Set col = Nothing
  89.    
  90. End Sub
複製代碼

TOP

也非常感謝bobomi大姊!
昨天我也有看到你貼超連結,只是今早就沒看見了,可能是系統的問題吧。

能 ...
justintoolbox 發表於 2015-7-26 06:44


網址:
https://social.msdn.microsoft.com/Forums/office/en-US/e3e99712-01a7-483e-bf0e-52bb1f94889c/how-to-use-accessibleobjectfromwindow-api-in-vba-to-get-excel-application-object-from-excel?forum=exceldev

還有不好意思讓bobomi前輩您不開心,以後回文我會注意加上參考資料來源,希望您能見諒!

TOP

        靜思自在 : 要用心,不要操心、煩心。
返回列表 上一主題