2,748
社区成员
发帖
与我相关
我的任务
分享*-- 测试代码
Local ii, jj
Local oCollection as Collection
Local oExcel as Excel.Application
Local oBook as Excel.Workbook
Clear
m.oCollection = GetAllExcelObjs()
If m.oCollection.Count > 0
? '找到 ' + Transform(m.oCollection.Count) + ' 个 Excel 实例:'
? '-------------------------'
For m.ii = 1 to m.oCollection.Count
m.oExcel = m.oCollection[m.ii]
? '实例 ' + Transform(m.ii) + ',打开文件数: ' + Transform(m.oExcel.Workbooks.Count)
For m.jj = 1 to m.oExcel.WorkBooks.Count
m.oBook = m.oExcel.WorkBooks(m.jj)
? ' 文件 ' + Transform(m.jj) + ': ' + m.oBook.FullName
EndFor
EndFor
Else
? '未找到任何 Excel 实例。'
EndIf
*-- end of 测试代码
*-- 函数 GetAllExcelObjs: 查找并返回所有打开的 Excel 实例对象集合
#define IID_IDispatch '{00020400-0000-0000-C000-000000000046}'
#define OBJID_NATIVEOM 0xFFFFFFF0
Function GetAllExcelObjs() as Collection
Local cIID, hExcel, hDesk, hBook, cName, nLen, oBook
Local oRet as Collection
Declare Long IIDFromString in ole32 String, String @
Declare Long FindWindowEx in win32api Long, Long, String, String
Declare Long GetClassName in win32api Long, String @, Long
Declare Long AccessibleObjectFromWindow in oleacc Long, Long, String @, Object @
m.oRet = NewObject('Collection')
m.cIID = Replicate(0h00, 16)
IIDFromString(Strconv(IID_IDispatch, 5) + 0h00, @ m.cIID)
m.hExcel = FindWindowEx(0, 0, 'XLMAIN', Null)
Do while !Empty(m.hExcel)
m.hDesk = FindWindowEx(m.hExcel, 0, 'XLDESK', Null)
If !Empty(m.hDesk)
m.hBook = FindWindowEx(m.hDesk, 0, Null, Null)
Do while !Empty(m.hBook)
m.cName = Space(256)
m.nLen = GetClassName(m.hBook, @ m.cName, 256)
If Left(m.cName, m.nLen) == 'EXCEL7'
m.oBook = Null
If 0 == AccessibleObjectFromWindow(m.hBook, OBJID_NATIVEOM, m.cIID, @ m.oBook)
m.oRet.Add(m.oBook.Application)
Exit
EndIf
EndIf
m.hBook = FindWindowEx(m.hDesk, m.hBook, Null, Null)
EndDo
EndIf
m.hExcel = FindWindowEx(0, m.hExcel, 'XLMAIN', Null)
EndDo
Return m.oRet
EndFunc