friendship293a
Thành viên mới

- Tham gia
- 9/3/08
- Bài viết
- 25
- Được thích
- 0
Ai có code lấy tên các workbook đang mở không cho mình tham khảo với. Thanks!
Hic nếu file TV nó sẽ như sau Thầy à:
Mã:Sub Example() Dim AllExcelApps As Collection, ExcelApp As Application, wb As Workbook, Pid As Long Set AllExcelApps = GetAllInstances If Not AllExcelApps Is Nothing Then For Each ExcelApp In AllExcelApps [COLOR=#ff0000]GetWindowThreadProcessId ExcelApp.hwnd, Pid [/COLOR] Debug.Print ExcelApp.Caption & ", Process ID = " & Pid For Each wb In ExcelApp.Workbooks Debug.Print " " & wb.Name Next Next End If End Sub
Bạn nào dùng Excel2010 kiểm tra file trên (Liệt kê các file Excel đang mở.xls) giùm!
Mình test thế này. mình bật 1 workbook đầu tiên lên nó tên là book1 sau đó bật tiếp workbook 2 nó tên là book2 sau đó mình nhấn Alt+F11 -> Insert module nhập đoạn code trên vào và run nó chỉ thông báo là book2 mà không thông báo book1.
Ko biết Test thế đúng chưa bạn?
Nó sẽ liệt kê tất tần tật những file excel đang mở.
Vọc từ sáng giờ rốt cuộc cũng hoàn thiện được, không quá dài, gởi tặng mọi người.
Liệt kê được tất cả các File Excel đang mở trên tất cả các session, kể cả có dấu tiếng Việt.
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextW" (ByVal hWnd As Long, ByVal lpString As Long, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthW" (ByVal hWnd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Dic As Object
Public Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean
Dim sSave As String, Ret As Long, wClass As String
Ret = GetWindowTextLength(hWnd)
sSave = Space(Ret)
GetWindowText hWnd, StrPtr(sSave), Ret + 1
wClass = WinClassName(hWnd)
If (wClass = "MS-SDIb") Or (wClass = "XLMAIN") Then
If sSave Like "Microsoft Excel - *" Then sSave = Mid(sSave, 19)
sSave = Trim(Replace(sSave, "[Compatibility Mode]", ""))
If Not Dic.Exists(sSave) Then Dic.Add sSave, ""
End If
EnumWindowsProc = True
End Function
Function WinClassName(ByVal hWnd As Long) As String
Dim RetVal As Long, lpClassName As String
If hWnd <> 0 Then
lpClassName = Space(256)
RetVal = GetClassName(hWnd, lpClassName, 256)
WinClassName = Left$(lpClassName, RetVal)
End If
End Function
Sub Main()
Set Dic = CreateObject("Scripting.Dictionary")
UserForm1.Show
End Sub
Private Sub CommandButton1_Click()
On Error Resume Next
EnumWindows AddressOf EnumWindowsProc, ByVal 0&
Me.ListBox1.List() = Dic.Keys
End Sub
Bài này có liên quan đến CÁC CỬA SỔ nên chợt nghĩ đến hàm EnumWindows và AddressOf Operator
Thử làm bài này theo phương án ấy xem:
---------------
Code
---------------
Hoàn toàn không có tí vòng lập nào hen
Giải thuật là:
- Cứ cửa số nào có ClassName = "XLMAIN" hoặc "MS-SDIb" thì lấy
- Lấy xong, xử lý các phần thừa để chỉ còn lại TÊN
Giải thuật là như vậy nhưng vì chưa rành API lắm, lại thông qua quá trình thí nghiệm mà suy luận nên phần triển khai có chút luộm thuộm
Rất mong các cao thủ góp ý, nhất là code trong hàm EnumWindowsProc (chưa hài lòng lắm)
Mình rất khoái thằng em "AddressOf" ---> Có vẽ như là 1 sự "tương tác 2 chiều gì đó" mà mình không mấy hiểu
Tôi kích hoạt 3 Excel 2007 và mỗi instance load 2 tập tin, tổng cộng 6 tập tin. Tìm được hết- Mở thử nhiều file trên nhiều session, test thử và thấy: Mỗi session chỉ liệt kê được một file, chắc là tại "Hoàn toàn không có tí vòng lập nào hen"
Ret = GetWindowTextLength(hWnd)
sSave = Space(Ret)
GetWindowText hWnd, StrPtr(sSave), Ret + 1