返回列表 上一主題 發帖

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

如果手動新增一個活頁簿時,這個活頁簿卻不會被計算到?

各位前輩們大家好,

疑問是:『如果手動新增一個活頁簿時,這個活頁簿卻不會被計算到?VBA該如何修正才能知道正確的活頁簿數量? 』

疑問發生如下:
我有一個檔案名稱為A.xlsm,在代碼上寫上debug.print workbooks.count能計算出 1 (實際上只有1個excel檔案)。
如果這時手動新增一個excel新檔,在A.xlsm執行debug.print workbooks.count還是只能顯示 1 (實際上有2個excel檔)

請問各位前輩們,代碼應該如何修正?請指導,感謝∼
  1. debug.print workbooks.count
複製代碼

TOP

各位前輩們大家好,

疑問是:『如果手動新增一個活頁簿時,這個活頁簿卻不會被計算到?VBA該如何修正才能 ...
justintoolbox 發表於 2015-7-24 07:25


各位前輩們,對於『手動新增活頁簿』前面說的不清楚,底下再詳細說明。

手動新增活頁簿的方式為:按住shift鍵,並在a.xlsm檔上點一下左鍵(如下圖a),就會出現一個活頁簿了(如下圖b)。

未命名_副本.jpg ----圖a
----圖b
=====================================================
只有以上這種的手動新增方式,workbooks.count為 1
但若是採用在 a.xlsm的檔案-->新增活頁簿的方式,這可以正確計算出來為 2

不知道為什麼會這樣子?

TOP

這一層並非workbooks喔!
因該是workbooks的爸爸 application才對,所以因該沒有辦法用application.vba去計 ...
Min 發表於 2015-7-25 00:32


原來是"不同層"的關係∼
非常感謝Min大解惑!
也提供一個解決問題的方向,非常感謝!

但是...因為對上一層API真的不瞭解。
前輩們能否再提醒一下這部分的關鍵字應該查詢什麼?
讓我可以更清楚的去找尋答案。感謝!

TOP

回復 4# justintoolbox
各位前輩們大家好,
目前問題:如何能抓到第二個excel並讀取檔名?
打開工作管理員,知道這兩個workbook是不同一個excel。
工作管理員.jpg

用以下方法,只能讀取第一個excel的檔名(a.xlsm),代碼應該如何修正才能讀取第二個EXCEL檔名?
拜託,各位前輩們出手相救!
  1. Sub ex()
  2. Dim oXL   As Excel.Application
  3. Dim oWB   As Excel.Workbook

  4. Set oXL = GetObject(, "Excel.Application")
  5. For Each oWB In oXL.Workbooks
  6.         Debug.Print oWB.Name
  7. Next

  8. End Sub
複製代碼

TOP

回復  justintoolbox
各位前輩們大家好,
目前問題:如何能抓到第二個excel並讀取檔名?
打開工作管理員 ...
justintoolbox 發表於 2015-7-25 10:02


各位前輩們大家好
目前找到了方法(代碼如下)可以知道有幾個獨立EXCEL(不知道該如何稱呼,暫時先稱為獨立EXCEL),
想繼續尋根究底的知道,代碼應該如何修正才能知道第二個獨立EXCEL的檔名?
  1. Option Explicit
  2. Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias _
  3. "FindWindowExA" ( _
  4. ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
  5. ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
  6. Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () As Long

  7. Sub GetXLhWnds() '資料:http://www.pcreview.co.uk/threads/getobject-when-more-than-1-excel-is-running.3575757/
  8. Dim n As Long
  9. Dim hWndXL As Long

  10. Do
  11.         hWndXL = FindWindowEx(GetDesktopWindow, hWndXL, "XLMAIN", vbNullString)
  12.         If hWndXL Then
  13.         n = n + 1
  14.         End If
  15. Loop Until hWndXL = 0
  16. Debug.Print "獨立EXCEL有:" & n &"個"
  17. End Sub
複製代碼

TOP

回復  justintoolbox

不好意思,剛剛我貼的行不通
我照你的方法開啟excel,真的不行
no3-taco 發表於 2015-7-25 12:17


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

我有查到網路上的類似的問題。我把代碼放在底下(上一封的代碼是我依照下面的代碼修正而來,可顯示多少個獨立EXCEL)。

測試結果:
我在a.xlsm執行過底下代碼的test程序,結果debug.print出來是一串長整數。
如果這時候:『按下shit鍵並在a.xlsm按下左鍵』,則會新增出一個獨立的excel檔。
這時候在a.xlsm執行test程序,會出現兩串長整數。

感想:
只知道這兩串各代表著兩個獨立EXCEL,但卻不知道如何利用?
我有思考:若知道這兩串數字,就說不定可以操控個別獨立EXCEL了(也就可以知道另一個獨立EXCEL檔名了)

懇請各位前輩或高手們,出手相救∼ 感謝!∼
  1. Option Explicit
  2. Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias _
  3. "FindWindowExA" ( _
  4. ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
  5. ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
  6. Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () As Long

  7. Sub test()
  8. Dim i As Long
  9. Dim arrXLhWnd() As Long

  10. If GetXLhWnds(arrXLhWnd) Then
  11. For i = LBound(arrXLhWnd) To UBound(arrXLhWnd)
  12. Debug.Print arrXLhWnd(i)
  13. Next
  14. End If

  15. End Sub

  16. Function GetXLhWnds(arrXLhWnd() As Long) As Long
  17. Dim n As Long
  18. Dim hWndXL As Long, hWndDT As Long

  19. ReDim arrXLhWnd(1 To 100) ' cater for 100 potential Excelinstances
  20. hWndDT = GetDesktopWindow

  21. Do
  22. hWndXL = FindWindowEx(hWndDT, hWndXL, "XLMAIN", vbNullString)
  23. If hWndXL Then
  24. n = n + 1
  25. arrXLhWnd(n) = hWndXL
  26. End If
  27. Loop Until hWndXL = 0
複製代碼

TOP

試試看(測試環境 : Win7 + Office2013)
azrael19 發表於 2015-7-25 18:22


哇!哇!哇!真的太....太棒了!
非常感謝azrael19大,出手相救!(連檔案路徑都幫忙擷取出來了,太感動了!)
原來需要這麼多的代碼才能知道檔名(汗顏中...),
看來這需要花一些時間去理解與吸收,再次感謝azrael19大!

TOP

連附上原創者答案的連結都會莫名其妙被砍.... 無言
bobomi 發表於 2015-7-26 06:36


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

能否再提供你昨天的網站連結呢?
讓我也一併吸收,再次感謝您!

TOP

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

各位前輩們大家好,

以 A.xlsm 為中心(請搭配下圖),若切換到 C.xlsx(屬同一個獨立EXCEL 1),則會觸發 Private Sub Workbook_Deactivate() 程序。
若從 A.xlsm 切換到 A2.xlsx(屬於另一個獨立EXCEL 2),卻不會觸發 Private Sub Workbook_Deactivate() 程序。



心得:
觸發Private Sub Workbook_Deactivate() 只能在同一個獨立EXCEL內的活頁簿間切換,才就會執行該程序。
但,若是切換另一個獨立EXCEL時,對A.xlsm而言是沒有變化的。

問題:
代碼該如何修正?才能知道有切換到另一個獨立EXCEL。
請各位前輩們出手相救!感恩!
  1. Private Sub Workbook_Deactivate()
  2. msgbox "有切換"  
  3. End Sub
複製代碼

各位前輩們大家好,

以 A.xlsm 為中心(請搭配下圖),若切換到 C.xlsx(屬同一個獨立EXCEL 1),則會觸發 ...
justintoolbox 發表於 2015-7-26 07:05


各位前輩們,不知道能否做到 切換到另一個獨立EXCEL時觸發程序?
拜託各位高手前輩們解惑!

TOP

        靜思自在 : 心中常存善解、包容、感思、知足、惜福。
返回列表 上一主題