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!
Bạn dùng code này nhé:Ai có code lấy tên các workbook đang mở không cho mình tham khảo với. Thanks!
Sub XemWb()
Dim wb As Workbook
For Each wb In Application.Workbooks
MsgBox wb.FullName
Next
End Sub
Bạn thử code chưa mà nói vậy chứ?Nó chỉ hiện được tên workbook có code còn mình muốn in ra tất cả các tên workbook mình đang bật cơ( kể cả workbook không có code) thanks!
Đương nhiên là tôi đã test và xác định code ấy chính xácMình thử nhiều lần rồi. bạn Test lại dùm mình nhé!
Bạn làm như thế này nè: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?
Bạn có thể cho mình biết ý định của bạn là gì không ? Có thể có cách khác hay hơn.Đấy cái mình gặp khó khăn là các workbook mở bằng cách kích chuột chứ không phải là tạo new nhấn Ctrl + N như bạn nói. mình định duyệt tất cả các workbook hiện hành xem workbook có tên là book2 đã được mở hay chưa? các bạn thử nghĩ coi có cách nào không?
Private Sub Workbook_Open()
Dim wbk As Workbook
For Each wbk In Workbooks
If wbk.Name = "Book2.xls" Then
MsgBox "File cua ban da duoc mo roi "
Application.ThisWorkbook.Close
End If
Next
End Sub
Nghĩ cũng lạ... Vụ này tưởng đơn giản, vậy mà tìm trên google muốn "banh ta long" luôn cũng chẳng thấy câu trả lời nào thỏa đángBạn có thể cho mình biết ý định của bạn là gì không ? Có thể có cách khác hay hơn.
Function WbIsOpen(wbName As String) As Boolean
On Error Resume Next
WbIsOpen = Not Workbooks(wbName & ".xls") Is Nothing
End Function
Ái chà...
Hôm qua đến giờ nghiên cứu vụ này mới phát hiện thì ra mấy cái Function như phát hiện 1 Workbook đang mở:
hình như không dùng được (trong trường hợp mở Excel giống như tác giả topic này)PHP:Function WbIsOpen(wbName As String) As Boolean On Error Resume Next WbIsOpen = Not Workbooks(wbName & ".xls") Is Nothing End Function
Một ngày nào đó ta mở 2 file Excel (mở bằng 2 session) rồi dùng code trên kiểm tra workbook có đang mở hay không... nó lại cho kết quả = False thì ... thật buồn cười
Chẳng lẽ không có code nào làm việc được với MutiSession hay sao ta? ---> Phải xem lại kiến thức mà ta đã học thôi vì rắc rối này đã kéo theo thêm mấy rắc rối khác ---> Hic...
Trên mạng cũng đã có người quan tâm đến vấn đề này... xem tại đây:
http://www.mrexcel.com/forum/showthread.php?t=72743
Tuy nhiên các câu trả lời cũng chưa giải quyết triệt để được vấn đề
Vấn đề này được giải quyết chưa bạn?
Không, ý mình là liệt kê tất cả các Workbooks đang mở trên tất cả các session chớ không phải kiểm tra một file nào đó đã được mở hay chưa.
Dài thấy ớn, cao thủ nào test và rút gọn bớt dùm
Hic nếu file TV nó sẽ như sau Thầy à:
Dim n as Long
For Each wb In ExcelApp.Workbooks
n = n +1
Cells(n, 1) = wb.Name
Next
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