Nhờ hướng dẫn viết Sub thoát file thông minh (Chỉ đóng file hoặc Quit Excel) (1 người xem)

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

Tôi tuân thủ nội quy khi đăng bài

Đạt Lùn 99

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
16/8/26
Bài viết
8
Được thích
3
Chào các anh chị em trên diễn đàn,

Em đang tạo một nút Thoát cho file Excel và muốn nhờ mọi người hỗ trợ đoạn mã xử lý theo 2 điều kiện sau:

  • Nếu đang mở nhiều file Excel: Chỉ đóng đúng file chứa code (không cần lưu) để tránh làm ảnh hưởng đến các file làm việc khác của người dùng.
  • Nếu chỉ mở duy nhất file này: Thoát hoàn toàn ứng dụng Excel (Application.Quit).
Rất mong nhận được tư vấn code tối ưu và chuẩn nhất từ các anh chị!

Em xin cảm ơn ạ.1786895139478.png
 

File đính kèm

kiểm tra có nhiều file đang mở hay không ?
Application.Workbooks.Count

Đóng file chứa code, không lưu
ThisWorkbook.Close False

Đóng hoàn toàn ứng dụng excel
Application.Quit
 
Upvote 0
Upvote 0
Dựa vào bài #2 ta có:
If Application.Workbooks.Count > 1 Then
ThisWorkbook.Close False
Else
Application.Quit
End If
 
Upvote 0
Mỗi 1 file mở bằng click tên trong cửa sổ Explore thì phức tạp đó
 
Upvote 0
Upvote 0
Mỗi 1 file mở bằng click tên trong cửa sổ Explore thì phức tạp đó
vâng , bác chỉ ra trường hợp rất hay, nếu mở từng file trong cửa sổ Explore thì nó sẽ có nhiều tiến trình excel giống như ta vào taskmanage xem các tiến trình đang chạy
đối với trường hợp này em dùng API code như sau bác chỉnh sửa giúp em nếu sai nhé

'* GetWindowThreadProcessId là một Windows API nó cho phép lấy tiến trình đang chạy, ở đây ta cần lấy PID ( EXCEL.EXE)
' cái này hỏi AI em cũng chẳng rõ thư viện này :D


'khai báo cho excel 2010 trở lên
#If VBA7 Then
Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" ( _
ByVal hwnd As LongPtr, _
ByRef lpdwProcessId As Long) As Long
'khai báo cho excel cũ cho nó chắc
#Else
Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
ByVal hwnd As Long, _
ByRef lpdwProcessId As Long) As Long
#End If

Sub Thoat()

Dim PID As Long
Dim WMI As Object
Dim p As Object

'Có file Excel khác trong cùng Instance
If Application.Workbooks.Count > 1 Then
ThisWorkbook.Close SaveChanges:=False
Exit Sub
End If

'Lấy PID của Excel hiện tại
GetWindowThreadProcessId Application.hwnd, PID

'Kiểm tra các Excel Instance khác
Set WMI = GetObject("winmgmts:\\.\root\cimv2")

For Each p In WMI.ExecQuery( _
"SELECT ProcessId FROM Win32_Process WHERE Name='EXCEL.EXE'")

If p.ProcessId <> PID Then
ThisWorkbook.Close SaveChanges:=False
Exit Sub
End If

Next p

'Không còn Excel/File nào khác
Application.Quit

End Sub
 
Upvote 0
Khi chưa ai trả lời thì kêu tốc độ phản hồi chậm, khi có người trả lời thì chê bai, bạn có thái độ gì vậy?
"Admin đang đánh tráo khái niệm giữa 'câu trả lời hỗ trợ''sự đáp trả cho có'.

Người dùng tìm đến diễn đàn để giải quyết bài toán kỹ thuật, chứ không ai chờ đợi hàng giờ để nhận về một câu châm biếm hay lời xua đuổi 'đi nơi khác mà chơi' rồi tính đó là 'đã có người trả lời'.

Thái độ của tôi là mong muốn diễn đàn lột xác để phát triển. Còn thái độ phòng thủ, quy chụp và xua đuổi người dùng của Admin mới chính là lý do đẩy cộng đồng rời xa diễn đàn để chọn AI mỗi ngày."
 
Upvote 0
trình còn non và xanh lắm. đúng gà con bao năm trình độ vẫn y vậy
Bài trả lời này chưa chứng tỏ kiến thức của bạn đủ cao & có hạng ở diễn đàn này;
/(/hưng nó RẤT chứng tỏ văn hóa, nhất là văn hóa ứng xử của bạn là thấp kém nhất diễn đàn!

. . . . . . . Cạn lời!
$$$$@
 
Upvote 0
"Admin đang đánh tráo khái niệm giữa 'câu trả lời hỗ trợ''sự đáp trả cho có'.

Người dùng tìm đến diễn đàn để giải quyết bài toán kỹ thuật, chứ không ai chờ đợi hàng giờ để nhận về một câu châm biếm hay lời xua đuổi 'đi nơi khác mà chơi' rồi tính đó là 'đã có người trả lời'.

Thái độ của tôi là mong muốn diễn đàn lột xác để phát triển. Còn thái độ phòng thủ, quy chụp và xua đuổi người dùng của Admin mới chính là lý do đẩy cộng đồng rời xa diễn đàn để chọn AI mỗi ngày."
Bài 2 là câu trả lời kỹ thuật và bạn chê bai. Không phải "trả lời cho có".
Chờ hàng giờ hay hàng tuần thậm chí hàng tháng cũng là việc của người hỏi, không phải việc của người trả lời.
Bạn đang quy chụp rằng tôi (admin) xua đuổi. Vậy thì tôi thực hiện việc ngăn cản bạn có thái độ xấu. Xong.
 
Upvote 0

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

Back
Top Bottom