Dùng code gì để đóng (Close) một file ở một cửa sổ khác? (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Chào các Anh Chị,

Nếu như mở một file đã lưu sẳn, rồi lại mở tiếp một file đã lưu sẳn lên thì nó có chung một cửa sổ, sau đó dùng code để đóng một file thì rất dễ (Workbooks(FileName).Close True/False).

Nhưng khi mở sẳn một file rồi ta lại mở một file trắng, sau đó trong file này ta mở một file có sẳn thì lúc này ta có 2 file nhưng mỗi file lại có 2 cửa sổ (xem hình), thì tôi không thể đóng file kia được bằng code.

Vậy các Anh Chị cho tôi hỏi là dùng code gì trong file này để đóng file kia được?

Cám ơn rất nhiều!
 

File đính kèm

  • TwoWindows.jpg
    TwoWindows.jpg
    73.7 KB · Đọc: 35
Lần chỉnh sửa cuối:
Dùng API thôi anh
Cái này nghĩ anh Nghĩa rành quá còn gì!
[GPECODE=vb]
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CLOSE = &H10

Sub thunghiem()
Dim winHwnd As Long
winHwnd = FindWindow("XLMAIN", "Microsoft Excel - File_can_dong.xlsx")
'MsgBox "handle = " & winHwnd
PostMessage winHwnd, WM_CLOSE, 0&, 0&
End Sub
[/GPECODE]
 
Upvote 0
Dùng API thôi anh
Cái này nghĩ anh Nghĩa rành quá còn gì!
[GPECODE=vb]
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CLOSE = &H10

Sub thunghiem()
Dim winHwnd As Long
winHwnd = FindWindow("XLMAIN", "Microsoft Excel - File_can_dong.xlsx")
'MsgBox "handle = " & winHwnd
PostMessage winHwnd, WM_CLOSE, 0&, 0&
End Sub
[/GPECODE]

nếu mà Nghĩa đẹp chai rành quá thì coi chừng đây là đố đó , không phải là hỏi =)):-=:-=
 
Upvote 0
Dùng API thôi anh
Cái này nghĩ anh Nghĩa rành quá còn gì!
[GPECODE=vb]
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CLOSE = &H10

Sub thunghiem()
Dim winHwnd As Long
winHwnd = FindWindow("XLMAIN", "Microsoft Excel - File_can_dong.xlsx")
'MsgBox "handle = " & winHwnd
PostMessage winHwnd, WM_CLOSE, 0&, 0&
End Sub
[/GPECODE]

Có những thứ mình không nghĩ ra được, chứ đâu phải cái gì cũng biết hết đâu ... ẹc ... ẹc ...

Cám ơn em trai!
 
Upvote 0
Đóng chi vậy? File mở cùng cửa sổ thì mới sợ các biến, các sự kiện chồng lẫn nhau, cần đóng bớt để tránh nhầm lẫn. Khác cửa sổ thì chúng độc lập.
 
Upvote 0
Dùng API thôi anh
Cái này nghĩ anh Nghĩa rành quá còn gì!
[GPECODE=vb]
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CLOSE = &H10

Sub thunghiem()
Dim winHwnd As Long
winHwnd = FindWindow("XLMAIN", "Microsoft Excel - File_can_dong.xlsx")
'MsgBox "handle = " & winHwnd
PostMessage winHwnd, WM_CLOSE, 0&, 0&
End Sub
[/GPECODE]
Không biết có gì khác thường không, nhưng anh mới test thử và ... không đóng được file! Hic hic

Mã:
Sub thunghiem()
Dim winHwnd As Long
    winHwnd = FindWindow("XLMAIN", "Microsoft Excel - [COLOR=#ff0000][B]OCT_2015.xlsx[/B][/COLOR]")
'MsgBox "handle = " & winHwnd
    PostMessage winHwnd, WM_CLOSE, 0&, 0&
End Sub
 
Upvote 0
Đóng chi vậy? File mở cùng cửa sổ thì mới sợ các biến, các sự kiện chồng lẫn nhau, cần đóng bớt để tránh nhầm lẫn. Khác cửa sổ thì chúng độc lập.
Em đang SAVE chồng lên nó, buộc phải đóng nó trước, không thôi nó báo lỗi. Đây là một sự lường trước khả năng có thể xảy ra vì một số người có thói quen mở file trắng rồi theo đường dẫn có sẳn trong Recent cho nó lẹ, vì thế nó tạo ra nhiều cửa sổ một lúc đó anh.
 
Upvote 0
Không biết có gì khác thường không, nhưng anh mới test thử và ... không đóng được file! Hic hic

Mã:
Sub thunghiem()
Dim winHwnd As Long
    winHwnd = FindWindow("XLMAIN", "Microsoft Excel - [COLOR=#ff0000][B]OCT_2015.xlsx[/B][/COLOR]")
'MsgBox "handle = " & winHwnd
    PostMessage winHwnd, WM_CLOSE, 0&, 0&
End Sub
Nếu file cần đóng không phải ActiveWorkbook của Application đó thì không tìm thấy đâu. Ngoài ra, nếu tìm thấy thì code này không phải chỉ đóng đúng file được chỉ định mà đóng luôn cả Application đang mở file đó.
 
Upvote 0
Nếu file cần đóng không phải ActiveWorkbook của Application đó thì không tìm thấy đâu. Ngoài ra, nếu tìm thấy thì code này không phải chỉ đóng đúng file được chỉ định mà đóng luôn cả Application đang mở file đó.
Vậy đành phải đóng file thủ công rồi phải không huuthang_bd? Phát hiện nó đang được mở thì dễ còn đóng nó lại khó mới ghê!
 
Upvote 0
Không biết có gì khác thường không, nhưng anh mới test thử và ... không đóng được file! Hic hic

Mã:
Sub thunghiem()
Dim winHwnd As Long
    winHwnd = FindWindow("XLMAIN", "Microsoft Excel - [COLOR=#ff0000][B]OCT_2015.xlsx[/B][/COLOR]")
'MsgBox "handle = " & winHwnd
    PostMessage winHwnd, WM_CLOSE, 0&, 0&
End Sub
Em thử (với trường hợp mỗi file là 1 window) thì vẫn hoạt động bình thường (không nhất thiết phải activeworkbook), còn nếu 2 file chung 1 window thì không dùng trong trường hợp này anh nhé
 
Upvote 0
Em thử (với trường hợp mỗi file là 1 window) thì vẫn hoạt động bình thường (không nhất thiết phải activeworkbook), còn nếu 2 file chung 1 window thì không dùng trong trường hợp này anh nhé
Không tìm ra Handle của nó (bằng 0) thì không thể nào đóng nó được! Anh xài trên Excel 2010.
 
Upvote 0
người ta nói vậy chứ chắc gì đã phải đóng thủ công , lỡ có Code đóng được thì sao ?
Ẹc ẹc...
PHP:
Sub CloseWBInOtherApp()
    On Error Resume Next
    Dim xlApp As Application
    Const sFullName = "D:\ABC.xls"
    Set xlApp = GetObject(sFullName).Application
    xlApp.Workbooks(Mid(sFullName, InStrRev(sFullName, "\") + 1)).Close False
End Sub
 
Upvote 0
Ẹc ẹc...
PHP:
Sub CloseWBInOtherApp()
    On Error Resume Next
    Dim xlApp As Application
    Const sFullName = "D:\ABC.xls"
    Set xlApp = GetObject(sFullName).Application
    xlApp.Workbooks(Mid(sFullName, InStrRev(sFullName, "\") + 1)).Close False
End Sub

hiện đại quá tôi theo không kịp . Tôi đang tìm cách tạo ra 2 cửa sổ Application khác nhau mà vẫn chưa được . Bạn nào biết làm bằng thủ công hoặc Code giúp tôi với . Hic
 
Upvote 0
hiện đại quá tôi theo không kịp . Tôi đang tìm cách tạo ra 2 cửa sổ Application khác nhau mà vẫn chưa được . Bạn nào biết làm bằng thủ công hoặc Code giúp tôi với . Hic
Có đoạn của anh Nghĩa đây ạ:
Hoàng Trọng Nghĩa đã viết:
Nhưng khi mở sẳn một file rồi ta lại mở một file trắng, sau đó trong file này ta mở một file có sẳn thì lúc này ta có 2 file nhưng mỗi file lại có 2 cửa sổ (xem hình)
 
Upvote 0
Hoặc anh thử kết hợp như thế này xem:
[GPECODE=vb]
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CLOSE = &H10


Sub thunghiem()
Dim winHwnd As Long
winHwnd = FindWindow("XLMAIN", "Microsoft Excel - OCT_2015.xlsx")
If winHwnd = 0 Then
Workbooks("OCT_2015.xlsx").Close
Else
'MsgBox "handle = " & winHwnd
PostMessage winHwnd, WM_CLOSE, 0&, 0&
End If
End Sub
[/GPECODE]
 
Upvote 0
Em xài, ex2007, win7, nếu 2 file cùng 1 cửa sổ thì handle=0, còn 2 cửa sổ thì máy em vẫn trả về.

Hiểu rồi, nhưng thật là bất tiện, mỗi cái Application.Caption nó khác nhau, có thằng thì Micro... trước, thằng thì sau, thằng thì có cái đuôi .xlsx thằng thì không!

Cũng khó xác định sao cho chính xác bằng API thật!
 
Upvote 0
hiện đại quá tôi theo không kịp . Tôi đang tìm cách tạo ra 2 cửa sổ Application khác nhau mà vẫn chưa được . Bạn nào biết làm bằng thủ công hoặc Code giúp tôi với . Hic
Tôi thấy bạn hay nói chơi kiểu giả ngu +-+-+-+
PHP:
Sub AddApp()
With CreateObject("Excel.Application")
    .Workbooks.Add 'Or .Workbooks.Open...
    .Visible = True
End With
End Sub
 
Upvote 0
Ẹc ẹc...
PHP:
Sub CloseWBInOtherApp()
    On Error Resume Next
    Dim xlApp As Application
    Const sFullName = "D:\ABC.xls"
    Set xlApp = GetObject(sFullName).Application
    xlApp.Workbooks(Mid(sFullName, InStrRev(sFullName, "\") + 1)).Close False
End Sub
Cám ơn huuthang_bd, đã giải quyết được vân đề, nhưng mình có thay đổi một chút vì mình muốn đóng luôn cửa sổ đó, mình thay dòng màu đỏ bằng dòng màu xanh:

Mã:
Sub CloseWBInOtherApp()
    On Error Resume Next
    Dim xlApp As Application
    Const sFullName = "C:\Users\HOANG TRONG NGHIA\Desktop\VoYeu\NAM_2015\OCT_2015.xlsx"
    Set xlApp = GetObject(sFullName).Application
    
[COLOR=#ff0000]    ''xlApp.Workbooks(Mid(sFullName, InStrRev(sFullName, "\") + 1)).Close False[/COLOR]
    
[COLOR=#0000ff]    xlApp.Workbooks(Mid(sFullName, InStrRev(sFullName, "\") + 1)).Saved = True[/COLOR]
[COLOR=#0000ff]    xlApp.Quit[/COLOR]


End Sub
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom