Không ổn định khi dùng ThisWorkbook.Save trong Addins (3 người xem)

  • Thread starter Thread starter VMH0307
  • Ngày gửi Ngày gửi
Liên hệ QC

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

VMH0307

Thành viên tiêu biểu
Tham gia
5/8/11
Bài viết
766
Được thích
609
Xin chào các Anh, Chị
Tôi có làm 1 addins bằng vba, có sử dụng luôn sheet trong addins này để lưu các dữ liệu.
Tôi dùng Thisworkbook.... để truy suất và làm việc vs dữ liệu trong sheet của Addins (bao gồm cả Thisworkbook.save để lưu các thay đổi).
Addins tôi dùng nhiều năm và ổn định đến 1 ngày đẹp trời, máy báo lỗi: ví dụ addins là abc.xlam, khi tôi chạy code thì hiển thị thông báo "abc.xlsm already exits in location. Do you want replace it?"
Kiểu như thể excel chuyển đổi/tạo mới lại file .xlsm, đồng thời xuất hiện thông báo debug và bắt lỗi ở ThisWorkbook.Save.
Việc này xuất hiện bất chợt, và tôi chưa giải thích được.
Có một số trang web nước ngoài bảo rằng do mở nhiều hơn 1 file trong đó có file readonly nên khi save gây lỗi, nhưng tôi đã thực hiện cố tình tạo tình huống như vậy nhưng lại không lỗi.
Tôi đăng lên xin hỏi mọi người đã từng gặp vướng mắc với ThisWorkbook.Save trong addins kiểu này chưa? Và xin mọi người hướng dẫn cách khắc phục.
Xin cám ơn.
 
Tại sao add-in lại chỉnh sửa và lấy dữ liệu? Tại sao add-in lại save?
 
Lần chỉnh sửa cuối:
Tại sao add-in lạ chỉnh sửa và lấy dữ liệu? Tại sao add-in lại save?
1646441444714.png
Theo em hiểu là bạn ở trên đang sử dụng add-in để chứa các hàm hoặc thủ tục cá nhân, khi cần thì dùng, và tận dụng 1 vài sheet để lưu dữ liệu tạm, add-in trong đó có sheet hoặc không cũng được mà (em nhớ là tick vào lựa chọn).
Em để code này dưới ThisWorkbook thì thấy vẫn chạy bình thường không báo lỗi gì cả.
PHP:
Sub VBA_SaveWorkBook()
    ThisWorkbook.Save
End Sub
 
Theo em hiểu là bạn ở trên đang sử dụng add-in để chứa các hàm hoặc thủ tục cá nhân, khi cần thì dùng, và tận dụng 1 vài sheet để lưu dữ liệu tạm, add-in trong đó có sheet hoặc không cũng được mà (em nhớ là tick vào lựa chọn).
[/CODE]
Tôi đang hỏi mục đích sử dụng và thay đổi dữ liệu trong file add-in. Thông thường file add-in chứa những hàm người dùng, chứa user form tiện ích, chỉ xài mà không lưu, thậm chí không cho lưu (lưu để mà phá add-in à?). Rồi dữ liệu add-in sửa đi, lưu lại, rồi xài vào việc gì sau này? Đó chính là câu tôi muốn hỏi.
Add-in đương nhiên là có sheet, thậm chí nhiều sheet, nhưng là sheet trắng hoặc sheet chứa thông tin dùng trong hàm của code.
Nếu cần dữ liệu tạm, thì tạo sheet tạm rồi xóa, chứ ai lại dùng dữ liệu add-in!
 
Tôi đang hỏi mục đích sử dụng và thay đổi dữ liệu trong file add-in. Thông thường file add-in chứa những hàm người dùng, chứa user form tiện ích, chỉ xài mà không lưu, thậm chí không cho lưu (lưu để mà phá add-in à?). Rồi dữ liệu add-in sửa đi, lưu lại, rồi xài vào việc gì sau này? Đó chính là câu tôi muốn hỏi.
Add-in đương nhiên là có sheet, thậm chí nhiều sheet, nhưng là sheet trắng hoặc sheet chứa thông tin dùng trong hàm của code.
Nếu cần dữ liệu tạm, thì tạo sheet tạm rồi xóa, chứ ai lại dùng dữ liệu add-in!
Vâng, cám ơn anh đã quan tâm.
Thực ra đây là một công cụ tập hợp các chức năng xử lý dữ liệu. Nôm na là hệ thống công ty không đủ chức năng theo mong muốn nên tôi đã tạo thêm công cụ cho mình và gói nó thành addins cho tiện khi cần ở bất kỳ file excel nào đang mở.
Do dữ liệu xử lý không quá phức tạp nên thay vì lưu ra 1 database riêng hay 1 file excel riêng thì hơi cồng kềnh, tôi đã dùng luôn sheet có trong addins như bạn @huhumalu có đề cập. Tức có công việc lưu ghi dữ liệu vào sheet của addins, lưu lại thông qua Thisworkbook.save (dùng nó thì dữ liệu lưu sheet addins không phải lưu trong activeworkbook).
Thuận tiện ở việc chỉ cần mang file addins sang máy khác và cài addins là dùng bình thường, có luôn database.
Tôi có thử máy trên cơ quan win7, 32 bit, excel 2007 3 năm rồi bình thường.
Máy ở nhà của tôi win 10 64 bit, excel 2010 dùng bình thường, nhưng máy vợ tôi cũng win10 64 bit, và ex 2013 hoặc ex 2010 nhưng thỉnh thoảng hiện lỗi kia.
Tôi đã gỡ và cài các phần mềm nhưng lỗi kia vẫn xuất hiện và tôi thấy rất ngẫu nhiên.
Tôi có tìm trên web nước ngoài và có một số trường hợp tương tự như vậy liên quan đến ThisWorkbook.Save.
Tôi muốn hỏi Anh và mọi người đã từng gặp trường hợp như vậy không, và xin cách khắc phục.
(Nếu không có cách thì có lẽ không dùng addins nữa mà dùng file xlsm, tức khi dùng thì mở chính file đó lên, hoặc phải lưu dữ liệu sang 1 database độc lập)
Bài đã được tự động gộp:

Úp file đó lên đi bạn.
Cám ơn bạn.
Thực ra đó không phải lỗi do thuật toán.
Tôi có mô tả lỗi: Khi lưu dữ liệu, tức chạy lệnh Thisworkbook.save, Excel hiển thị hộp thoại file abc.xlsm đã tồn tại, rồi debug lỗi tại lệnh save đó.
Tôi đã thử nhiều máy và dùng thời gian dài, lỗi rất bất chợt trong quá trình dùng. Vì vậy, tôi nghĩ nó do nguyên tắc gì đó của excel mà tôi chưa biết, tôi xin phép không đưa file lên.
 
Lần chỉnh sửa cuối:
Thực ra có không phải lỗi do thuật toán.
...
tôi nghĩ nó do nguyên tắc gì đó của excel mà tôi chưa biết,

Nếu mình rành vậy thì đâu cần trợ giúp đúng không nào?

Khi lưu dữ liệu, tức chạy lệnh Thisworkbook.save, Excel hiển thị hộp thoại file abc.xlsm đã tồn tại, rồi debug lỗi tại lệnh save đó.

Đang là file add in rồi thêm anh chàng xlsm?
Cái mình thấy, cái mình nhận định có thể đúng, có thể không phải như thế.
Muốn nhanh, gọn -> Úp file.
Hết.
 
Nếu mình rành vậy thì đâu cần trợ giúp đúng không nào?



Đang là file add in rồi thêm anh chàng xlsm?
Cái mình thấy, cái mình nhận định có thể đúng, có thể không phải như thế.
Muốn nhanh, gọn -> Úp file.
Hết.
Tôi đã tham gia vào diễn đàn lâu và hiểu được việc cần thiết up file lên khi hỏi.
Tuy nhiên trong file tôi dùng nhiều ado để xuất báo cáo, selenium để kết nối web, chrome driver.
Việc đưa file lên có thể làm phức tạp hóa vấn đề.
Bạn @huhumalu có nói bên trên về việc bạn đó dùng lệnh không thấy gì cả.
Web nước ngoài có trường hợp sau (tôi xin phép dẫn link)
Cũng bị lỗi
 
Một mớ thòng bong, thisworkbook đã thành thatworkbook rồi. Vậy nên mới có đoạn xlam thành xlsm.

Bệnh nặng lắm rồi, muốn chữa thì đưa file, không file thì thôi. Link này link nọ không liên quan gì cả.
 
Một mớ thòng bong, thisworkbook đã thành thatworkbook rồi. Vậy nên mới có đoạn xlam thành xlsm.

Bệnh nặng lắm rồi, muốn chữa thì đưa file, không file thì thôi. Link này link nọ không liên quan gì cả.
Đúng rồi đó, trên máy hoàn toàn không có file xlsm mà chỉ có addins xlam. Vậy mà khi dùng thisworkbook.save nó lại hỏi về file xlsm.
Qua đây tôi xin hỏi ngắn gọn lại:
Lệnh thisworkbook.save có lưu được dữ liệu (sau khi đã thay đổi, thêm bớt) trên sheet của chính addins hay không? Có khác nhau gì giữa các phiên bản office.
Nếu không được thì có cách nào để lưu kiểu đó bằng vba không?
Cám ơn bạn và mọi người đã quan tâm.
 
Bạn chỉ cần cho đoạn code sự kiện này vào code Workbook của bạn để Lưu không gặp lỗi

JavaScript:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If ThisWorkbook.ReadOnly Then
    Cancel = True: Exit Sub
  End If
  If ThisWorkbook.Name Like "*.[xX][lL][aA]*" Then
    On Error Resume Next
    Application.EnableEvents = False
    Cancel = True
    ThisWorkbook.IsAddin = True
    ThisWorkbook.Save
    Application.EnableEvents = True
  End If
End Sub
 
Lần chỉnh sửa cuối:
Do dữ liệu xử lý không quá phức tạp nên thay vì lưu ra 1 database riêng hay 1 file excel riêng thì hơi cồng kềnh, tôi đã dùng luôn sheet có trong addins như bạn @huhumalu có đề cập. Tức có công việc lưu ghi dữ liệu vào sheet của addins, lưu lại thông qua Thisworkbook.save (dùng nó thì dữ liệu lưu sheet addins không phải lưu trong activeworkbook).
Bạn có đang lưu file này trên cloud hay máy chủ gì kg ? Đại ý nhiều máy đang dùng chung 1 nguồn (thông qua sever hay cloud Google, Onedrive ...) nó cũng có thể là nguyên nhân dẫn đến việc file đang báo Read-only.
 
Bạn chỉ cần cho đoạn code sự kiện này vào code Workbook của bạn để Lưu không gặp lỗi

JavaScript:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If ThisWorkbook.ReadOnly Then
    Cancel = True: Exit Sub
  End If
  If ThisWorkbook.Name Like "*.[xX][lL][aA]*" Then
    On Error Resume Next
    Application.EnableEvents = False
    Cancel = True
    ThisWorkbook.IsAddin = True
    ThisWorkbook.Save
    Application.EnableEvents = True
  End If
End Sub
Cám ơn bạn, tôi cũng hiểu rằng cần xử lý tình trạng Readonly của Addins.
Bài đã được tự động gộp:

Bạn có đang lưu file này trên cloud hay máy chủ gì kg ? Đại ý nhiều máy đang dùng chung 1 nguồn (thông qua sever hay cloud Google, Onedrive ...) nó cũng có thể là nguyên nhân dẫn đến việc file đang báo Read-only.
Hiện tôi chỉ dùng cho máy cục bộ, dùng cho bản thân, chính vì vậy tôi sử dụng luôn Sheet trong Addin để làm Data Base . Do vậy không xảy ra việc chia sẻ file, hay khi mình dùng thì file đang trong trạng thái có người đã dùng trước đó và Readonly.

-----------------
Tôi có mơ hồ hiểu ra rằng như sau, không biết có đúng không, hoặc đây là điều hiển nhiên, nhưng tôi không biết nên trở nên ngờ ngệch như vậy.
- Tôi thấy rằng: Trạng thái ReadOnly/ ReadWrite (tôi gọi tắt là RO/ RW) của file AddIn phụ thuộc vào trạng thái của ActiveWorkbook chúng ta đang sử dụng.
Do vậy:
Trường hợp 1: Khi tôi mở 1 Workbook mới (trạng thái RW) khi đó Addin cũng là RW, tôi sử dụng bình thường, lưu Thisworkbook.save bình thường, không phát sinh lỗi.
Sau đó mở lên 1 file RO, và tiếp tục dùng Addin từ Ribbon của file này, khi đó Addin cũng ở trạng thái RO. Do vậy câu lệnh Thisworkbook.Save gây lỗi do không lưu được với file RO, từ đó xuất hiện yêu cầu Save as sang file mới dạng xlsm.
(File RO có thể là file đã được thiết lập sẵn trong Property là RO hoặc là file lấy trên mạng xuống, lấy qua email, hoặc lấy qua một nguồn lạ khi chế độ Protected View được thiết lập trong Trust Center)

Giải pháp:
Tắt các tùy chọn trong Protected View để giảm các trường hợp ReadOnly, hoặc tạo ra cảnh báo trong trường hợp Thisworkbook.Readonly=true thì cảnh báo nên chọn 1 file khác làm AcctiveWorkbook.

Trường hợp 2: Mở 1 file mới bất kỳ (chưa tiến hành Save) thì trạng thái nó đã sẵn là RO.
Như vậy, phải có một thiết lập mặc định gì đó vào hệ thống ngầm, mới có thể làm cho bất kỳ file mới mở nào cũng ở trạng thái RO.
Giải pháp: Lưu lại file mở mới đó trước khi sử dụng Addin thì lúc đó file đó trở thành RW
Rà soát lại các Addin khác đang bật trên excel, đặc biệt là các Addin dạng COM, thường tạo mặc định Addin là dạng RO. Khi đó cần tắt Addin đó đi để tránh xung đột không mong muốn.
 
Lần chỉnh sửa cuối:
Tôi đang hỏi mục đích sử dụng và thay đổi dữ liệu trong file add-in. Thông thường file add-in chứa những hàm người dùng, chứa user form tiện ích, chỉ xài mà không lưu, thậm chí không cho lưu (lưu để mà phá add-in à?). Rồi dữ liệu add-in sửa đi, lưu lại, rồi xài vào việc gì sau này? Đó chính là câu tôi muốn hỏi.
Add-in đương nhiên là có sheet, thậm chí nhiều sheet, nhưng là sheet trắng hoặc sheet chứa thông tin dùng trong hàm của code.
Nếu cần dữ liệu tạm, thì tạo sheet tạm rồi xóa, chứ ai lại dùng dữ liệu add-in!
Cá nhân em cũng là người sử dụng dữ liệu từ Addin và lưu chỉnh sửa lại Addin như chủ bài đăng em thấy như sau:
1. Về việc sử dụng dữ liệu từ Addin ví dụ Thống kê cốt thép (em làm xây dựng) cần có hình ảnh biểu mẫu của cốt thép tạo bằng Shape Em thấy nếu không lấy dữ liệu từ sheet của addin để lưu sang sheet cần biểu mẫu thì việc tạo ra shape đúng biểu mẫu phức tạp hơn. Hoặc đơn giản hơn biểu mẫu biên bản chẳng hạn, nếu lôi từ biểu mẫu từ Sheet trong Addin ra thì dễ hơn so với lập code tạo biểu mẫu.
2. Về việc lưu dữ liệu từ Sheet vào Addin là để phục vụ mục đích cung cấp biểu mẫu hồ sơ cho các biểu mẫu sẽ phong phú hơn.
Đây là ý kiến chủ quan của em về vấn đề trên, nếu là anh với mong muốn như của em anh sẽ sử dụng phương án nào để giải quyết vấn đề trên ạ?

P/s Gần đây em cũng gặp tình trạng như chủ bài đăng trên. Code ở bài #11 của anh Hesanbi đã đáp ứng được tình trạng lỗi khi addin ở chế độ readonly
 
Cá nhân em cũng là người sử dụng dữ liệu từ Addin và lưu chỉnh sửa lại Addin
Ví dụ bạn đưa ra (và có thể là của cả tác giả bài 1) là lấy template & hình ảnh từ addin ra sheet. Việc lưu add-in của bạn giống như bổ sung thư viện add-in để xài cho lần sau.
Excel có 1 dạng lưu trữ phù hợp hơn đó là template (xltx hoặc xltm). Hay hơn nhiều
 
Excel có 1 dạng lưu trữ phù hợp hơn đó là template (xltx hoặc xltm). Hay hơn nhiều
Lưu dạng Save as để ra file excel có đuôi .xltx hoặc .xltm thì dễ rồi, vậy mình muốn lấy 1 dữ liệu từ file có 2 đuôi trên ra 1 bảng tính thì như thế nào ạ
 
Phải tìm đến file biểu mẫu mở và copy thì em nghĩ nó không tiện dụng bằng ở bất cứ sheet nào cũng lấy được dữ liệu từ Addin hoặc lưu dữ liệu vào addin ạ
 
Vâng! khổ nỗi những khái niệm anh đưa ra như "*.xltm", "*.xltx", "workspace" tìm kiếm trên google để tìm tài liệu ngoài nguồn tiếng anh ra, tiếng việt không có thì với những người "dốt" tiếng anh như em đúng là khó để tiếp cận. Anh có thể hướng dẫn chi tiết hơn được không anh? ví dụ làm cách nào để đưa dữ liệu vào "workspace", thằng "workspace" này nó nằm ở đâu, muốn lấy dữ liệu ở thằng "workspace" này thì lấy như thế nào, có lưu ý gì khi sử dụng nó v.v......
 
Web KT

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

Back
Top Bottom