Vì sao file xlsm đã đóng nhưng trong cửa sổ VBAProject vẫn tồn tại Project của nó?

Liên hệ QC

Maika8008

Thành viên gạo cội
Tham gia
12/6/20
Bài viết
4,763
Được thích
5,718
Donate (Momo)
Donate
Giới tính
Nam
Gần đây tôi mới thấy trên máy xuất hiện tình trạng đã đóng file nhưng trong cửa sổ VBAProject vẫn tồn tại Project của file đó (xem hình). Chi tiết như sau:
1. Có file bị như thế, có file không.
2. Gặp tình trạng như thế thì có 1 số file dù không thay đổi gì cả nhưng khi đóng file vẫn hiện hộp thoại hỏi có lưu hay không.
3. Mỗi lần mở ra, đóng lại thì chồng thêm 1 project.
4. Thoát Excel và mở lại thì các project thừa kia sẽ mất đi.
5. Với 1 vài file xlsm khi mở lên, đóng lại sẽ hiện lỗi Out of memory.
Tôi tìm rất lâu trên mạng nhưng câu trả lời là nhiều người đã gặp tình trạng này mà không có cách giải quyết, đến 1 ngày đẹp trời nào đó thì tự nhiên sự cố này biến mất mà không phải làm gì cả, cài lại office cũng sẽ không giải quyết được gì.

Tuy nhiên, tôi nghĩ là tôi tìm chưa thấy hoặc chưa biết cách tìm, chứ chẳng là sự việc này không có cách nào trị sao?

Vậy anh em có ai gặp tình trạng này chưa và khắc phục nó như thế nào? Tôi cảm ơn!
Hình: Các file B.xlsm, C.xlsm và CopyAllFile_online_.xlsm đều đã đóng.
1652403269618.png
 
Tôi gỡ hết Add-ins rồi. Chỉ mở file .xlsm không có code gì cả và đóng bằng thủ công chứ chẳng code kiếc gì. Trước đây chỉ 1 số file bị thôi, chừ thì file nào cũng bị thế. Có người nói mở file ngoài thư mục đồng bộ của G.Drive thì không bị nhưng tôi thấy trong hay ngoài cũng vẫn thế. Qua đó tôi nghĩ G.Drive không phải là lý do nên không gỡ.
Bài đã được tự động gộp:

Dùng VB6 để build dll (và tất nhiên có dùng dll này trong 1 file thôi) có liên quan gì đến lỗi này không mọi người nhỉ?
Lúc trước tôi có dùng VSTO build một file Exe nhưng code không kỹ, không giải phóng Excel instance nên nó còn lưu lại một đống Excel trong Task Manager. :D
 
Upvote 0
Mã:
Sub ShowCodeName()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    MsgBox ws.CodeName
End Sub


Mình có một đoạn code như trên và để ở một file nào đó đang mở. Đoạn code này hiện CodeName của sheet hiện hành.
Khi cửa sổ vba đóng, ở trong excel tạo một file mới, sau đó nhấn ALT+F8 và chạy macro trên. Kết quả là hiện ra hộp thoại trắng tính, không hề thấy chữ nào ( mình đoán là CodeName đang là rỗng). Bạn nào có cách khắc phục để code trên lấy đúng CodeName thì giúp mình với!
Nếu cửa sổ vba đang mở thì code trên vẫn chạy đúng.
 
Upvote 0
Giải phóng Excel thế nào bạn? Tôi Kill EXCEL.EXE mà nó hổng chịu kill
Làm như bạn làm trong VBA thôi. Khi Set Object nào đó là Excel.Application thì nhớ App.Quit và Set app = Nothing cho nó sau khi hoàn thành tác vụ. Đóng tất cả các Object (workbook, sheet...) đã mở cùng với Excel, nếu nó còn tồn tại là Excel Quit không được.
Kiểm tra code lại xem có đoạn nào làm cho nó Quit không được.
 
Upvote 0
Làm như bạn làm trong VBA thôi. Khi Set Object nào đó là Excel.Application thì nhớ App.Quit và Set app = Nothing cho nó sau khi hoàn thành tác vụ. Đóng tất cả các Object (workbook, sheet...) đã mở cùng với Excel, nếu nó còn tồn tại là Excel Quit không được.
Kiểm tra code lại xem có đoạn nào làm cho nó Quit không được.
Nếu code chỉ mở Excel để chép dữ liệu vào thì không thực hiện quit. Tôi chỉ set tất cả các biến = Nothing thôi. Cuối cùng khi thoát Excel bằng tay thì trong Details của Task Manager thấy vẫn còn Excel.exe.
 
Upvote 0
Nếu code chỉ mở Excel để chép dữ liệu vào thì không thực hiện quit. Tôi chỉ set tất cả các biến = Nothing thôi. Cuối cùng khi thoát Excel bằng tay thì trong Details của Task Manager thấy vẫn còn Excel.exe.
Biến đối tượng thì bạn Close - Quit - Set Nothing.
Các biến bạn có khai báo tường minh không? nhiều trường hợp khai báo implicit cũng gây lỗi không thoát. Dùng Late binding.
 
Lần chỉnh sửa cuối:
Upvote 0
Biến đối tượng thì bạn Close - Quit - Set Nothing.
Các biến bạn có khai báo tường minh không? nhiều trường hợp khai báo implicit cũng gây lỗi không thoát. Dùng Late binding.
Mấy cái thuật ngữ đó tôi không biết bạn à. Tôi thấy người ta khai báo thể nào thì tôi làm thế ấy để chạy thử 1 đoạn code tạo báo cáo thôi. Chạy thì ổn rồi, chỉ có cái là chạy bao nhiêu lần thì còn bấy nhiêu dòng EXCEL.EXE trong Details Task Manager.

Nhắc lại là chạy báo cáo xong, tôi cho visible cửa sổ Excel để xem báo cáo. Xem báo cáo xong tôi mới đóng cửa sổ Excel bằng tay.
 
Upvote 0
Mấy cái thuật ngữ đó tôi không biết bạn à. Tôi thấy người ta khai báo thể nào thì tôi làm thế ấy để chạy thử 1 đoạn code tạo báo cáo thôi. Chạy thì ổn rồi, chỉ có cái là chạy bao nhiêu lần thì còn bấy nhiêu dòng EXCEL.EXE trong Details Task Manager.

Nhắc lại là chạy báo cáo xong, tôi cho visible cửa sổ Excel để xem báo cáo. Xem báo cáo xong tôi mới đóng cửa sổ Excel bằng tay.
Có cái COM/Excel Add-in nào chạy không? Workbook bạn đang làm thì đóng nhưng file Add-in nó chưa thoát (Tôi gặp trường hợp này rồi).
Thiết lập luôn mở Excel "as Administrator". Còn các nguyên nhân nào khác nữa thì tôi chưa biết rồi.
Bạn copy bộ code đó lên đây xem thử đi.
 
Lần chỉnh sửa cuối:
Upvote 0
Có cái COM/Excel Add-in nào chạy không? Workbook bạn đang làm thì đóng nhưng file Add-in nó chưa thoát (Tôi gặp trường hợp này rồi).
Thiết lập luôn mở Excel "as Administrator". Còn các nguyên nhân nào khác nữa thì tôi chưa biết rồi.
Bạn copy bộ code đó lên đây xem thử đi.
Tôi tìm ra lỗi rồi: thiếu 2 dòng giải phóng đối tượng
releaseObject(objBooks)
releaseObject(objApp)
 
Upvote 0
Đang táy máy VB.Net chơi ấy mà
Có cái thủ tục để giải phóng đối tượng releaseObject . Phải chạy nó để khi tắt Excel bằng tay thì App Excel mới không chạy ngầm
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
End Try
End Sub
 
Upvote 0
Đang táy máy VB.Net chơi ấy mà
Có cái thủ tục để giải phóng đối tượng releaseObject . Phải chạy nó để khi tắt Excel bằng tay thì App Excel mới không chạy ngầm
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
End Try
End Sub
Quan điểm của tôi là: hiện giờ nếu mất thời gian ngâm cứu thêm thì ngâm cứu cái mới luôn chứ quay về VB6 sẽ phí thời gian (mặc dù nó gần gũi VBA nên dễ học). Giờ .NET máy Windows nào cũng có sẵn, phát triển ứng dụng với nó thì khỏi phải tích hợp thêm cái bộ máy (runtime machine) để chạy, nên file ứng dụng sẽ nhẹ đi nhiều. Còn chuyện build cho các phiên bản 32/64 bit thì khỏi phải mất công dùng các thủ thuật, có thể làm ảnh hưởng đến tốc độ xử lý không đáng có. Xây dựng Add-in cho Office thì VSTO là tuyệt vời rồi.
 
Upvote 0
Nếu là tôi thì tôi sẻ chọn C++ Or Delphi vì chỉ có 2 cái đó viết API chạy là Nhanh nhất thế giới thôi
còn lại các Tools khác ko viết API được ( nếu có thì cũng chỉ lách + lạng thôi ... Như VB6 tôi vẫn viết API chạy ngọt )
 
Upvote 0
Nếu là tôi thì tôi sẻ chọn C++ Or Delphi vì chỉ có 2 cái đó viết API chạy là Nhanh nhất thế giới thôi
còn lại các Tools khác ko viết API được ( nếu có thì cũng chỉ lách + lạng thôi ... Như VB6 tôi vẫn viết API chạy ngọt )
Tùy mục tiêu của mỗi người, muốn viết cái gì thì chọn ngôn ngữ phù hợp với nó mà học thôi. Người muốn viết Web App, người muốn theo khoa học dữ liệu, hay điều khiển tự động hoặc an toàn thông tin v.v..
 
Upvote 0
Quan điểm của tôi là: hiện giờ nếu mất thời gian ngâm cứu thêm thì ngâm cứu cái mới luôn chứ quay về VB6 sẽ phí thời gian (mặc dù nó gần gũi VBA nên dễ học). Giờ .NET máy Windows nào cũng có sẵn, phát triển ứng dụng với nó thì khỏi phải tích hợp thêm cái bộ máy (runtime machine) để chạy, nên file ứng dụng sẽ nhẹ đi nhiều. Còn chuyện build cho các phiên bản 32/64 bit thì khỏi phải mất công dùng các thủ thuật, có thể làm ảnh hưởng đến tốc độ xử lý không đáng có. Xây dựng Add-in cho Office thì VSTO là tuyệt vời rồi.
Tôi dùng VB6 để build .dll cất code thôi chứ không học nó để viết ứng dụng. Còn VB.Net là sau khi viết cái chủ đề này tôi mới cài và vọc chơi.
 
Upvote 0
1653309187348.png
1653309216591.png

Nếu Rảnh sẻ vọc thêm C# 1 chút thôi .... mấy dòng trên là tây nó nói -0-0-0-
 
Upvote 0
Web KT

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

Back
Top Bottom