Cách lưu dữ liệu đi theo add-in (2 người xem)

Liên hệ QC

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

minhtungph

None
Tham gia
18/9/13
Bài viết
198
Được thích
78
- Chào các bạn, trong quá trình làm việc với add-in mình có một số thắc mắc về add-in, như hình bên dưới thì theo cùng với add-in là object sheet1, mình muốn tận dụng các cell trên sheet1 để lưu trữ các text, các text này có thể là nội dung thông báo tiếng việt hoặc là lưu trữ header dùng cho việc copy header sang workbook mà add-in cần thao tác .... , nhưng hiện tại vẫn chưa thông về vấn đề này, không biết có sử dụng được không, mong các bạn và các anh chị giúp đỡ, gợi hướng cho việc lưu trữ dữ liệu kèm theo add-in, Chân thành cảm ơn.

upload_2018-2-5_8-41-39.png
 
- Chào các bạn, trong quá trình làm việc với add-in mình có một số thắc mắc về add-in, như hình bên dưới thì theo cùng với add-in là object sheet1, mình muốn tận dụng các cell trên sheet1 để lưu trữ các text, các text này có thể là nội dung thông báo tiếng việt hoặc là lưu trữ header dùng cho việc copy header sang workbook mà add-in cần thao tác .... , nhưng hiện tại vẫn chưa thông về vấn đề này, không biết có sử dụng được không, mong các bạn và các anh chị giúp đỡ, gợi hướng cho việc lưu trữ dữ liệu kèm theo add-in, Chân thành cảm ơn.

View attachment 191275
Bạn thử thay .Sheet1 bởi .Sheets(1) xem có được không.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
ThisWorkbook là codename của Workbook, Sheet1 là codename của Worksheet chứ không phải thuộc tính của nó.
Bạn có thể viết ngắn gọn
With ThisWorkbook
MsgBox Sheet1.Range("A1").Value
End With

Đọc thêm bài của anh Befaint
http://www.giaiphapexcel.com/diendan/threads/bài-5-workbook-worksheet.130566/

Cách bạn làm không khác gì người hỏi, chỉ khác là dùng khối With. Và cách này không lưu được trong Add-in.

Bạn Tùng làm như sau:

ThisWorkbook.Sheets("Tên sheet người dùng HOẶC chỉ mục/Index của sheet").Range("A1").Value="Cái gì đó"
 
Upvote 0
cám ơn các anh, thấy lỗi đó em tưởng add-in nó không truy xuất được sheet đi theo, không ngờ là gọi sai.
 
Upvote 0
Cách bạn làm không khác gì người hỏi, chỉ khác là dùng khối With. Và cách này không lưu được trong Add-in.
Ý em là bạn ấy đang hiểu nhầm giữa Object và Codename. Còn khác nhau sao thì bạn ấy tự tìm hiểu. Đôi khi có mỗi dấu chấm mà thay đổi ít nhiều.
 
Upvote 0
Hai bác trên nói đều đúng nhưng dài. chỉ cần sheet1.range("a1") là đủ
 
Upvote 0
Hai bác trên nói đều đúng nhưng dài. chỉ cần sheet1.range("a1") là đủ

Cách viết code của bạn là sai đó. Khi không có đối tượng workbook đứng trước Sheets thì nó hiểu Sheets là của file đanh hiển thị (ActiveWorkbook). Đây là sai lần rất lớn với những người mới mò mẫm VBA bằng cách record macro.
 
Upvote 0
Cũng không đủ!
Vì người ta muốn cái sheet1.range("a1") ở trong Thisworkbook kìa (chứ không phải trong ActiveWorkbook đâu)
Cách viết code của bạn là sai đó. Khi không có đối tượng workbook đứng trước Sheets thì nó hiểu Sheets là của file đanh hiển thị (ActiveWorkbook). Đây là sai lần rất lớn với những người mới mò mẫm VBA bằng cách record macro.
Định ăn hiếp em!

Cài add in kia, sau đó click chuột phải vào một ô bất kỳ trên một file khác xem.
 

File đính kèm

Upvote 0
Mã:
Dim WithEvents App As Application

Private Sub App_NewWorkbook(ByVal Wb As Workbook)

End Sub

Private Sub App_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    MsgBox "Day la noi dung cua toi: " & Sheet1.Range("A1")
    ThisWorkbook.Save
End Sub

Private Sub Workbook_Open()
    Set App = Application
    MsgBox Sheet1.Range("a1")
    
End Sub

Ô a1 của sheet1 trong addin có dòng chữ "Truong vu317"
 
Upvote 0
Mã:
Dim WithEvents App As Application

Private Sub App_NewWorkbook(ByVal Wb As Workbook)

End Sub

Private Sub App_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    MsgBox "Day la noi dung cua toi: " & Sheet1.Range("A1")
    ThisWorkbook.Save
End Sub

Private Sub Workbook_Open()
    Set App = Application
    MsgBox Sheet1.Range("a1")
   
End Sub

Ô a1 của sheet1 trong addin có dòng chữ "Truong vu317"
Đã thí nghiệm và kết luận: Bạn đúng trong trường hợp này
Có điều tôi vẫn cảm thấy cách dùng này tiềm ẩn sự bất ổn sao ấy. Nói chung nếu tôi viết một Addin, chắc chắn tôi sẽ không dám dùng cách này
 
Upvote 0
Đã thí nghiệm và kết luận: Bạn đúng trong trường hợp này
Có điều tôi vẫn cảm thấy cách dùng này tiềm ẩn sự bất ổn sao ấy. Nói chung nếu tôi viết một Addin, chắc chắn tôi sẽ không dám dùng cách này
Tùy anh thôi, mỗi người có phong cách đổ " bê tông cốt thép" khác nhau. add in em cũng chả thích, chỉ thích " yêu người chưa kịp nói, chung vách thi...."

Chúc anh có ngày làm việc mát mẻ, ở Bắc đang lạnh quá.
 
Upvote 0
Có lẽ là thế này: Trong câu lệnh không chỉ đích danh Workbook:
- Nếu gọi Sheet1 thì VBA sẽ hiểu là đối tượng Sheet1 của file chứa code (tức là anh chàng ThisWorkbook). Nếu file chứa code không có sheet nào có CodeName là Sheet1 thì sẽ phát sinh lỗi.
- Nếu gọi Sheets(1) thì VBA sẽ hiểu là sheet đầu tiên của file hiện hành (tức là anh chàng ActiveWorkbook).
Mọi người thử kiểm tra lại xem có đúng như vậy không nhé.
 
Upvote 0
Trên này toàn mấy anh chị giàu kinh nghiệm nên em cũng chỉ biết gì nói nấy, mấy anh chỉ thấy không phải cứ chém thỏa mái, tiếp thu được em tiếp thu, không được em cũng chỉ cười thôi.
Object.png
 
Upvote 0
Trên này toàn mấy anh chị giàu kinh nghiệm nên em cũng chỉ biết gì nói nấy, mấy anh chỉ thấy không phải cứ chém thỏa mái, tiếp thu được em tiếp thu, không được em cũng chỉ cười thôi.
View attachment 191332
Chả hiểu bạn muốn nhắn nhủ cái gì nữa. Cái gì mà strack, cái gì mà headp. Thì cũng phải nói ý tưởng ra thì mọi người mới hình dung được. Được cái là chụp ảnh đẹp, dùng nokia hay ip vậy.

"Nhìn theo ảnh ai cũng bảo đẹp nhưng đâu hay có người đang nghe xót thương".
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu file chứa code không có sheet nào có CodeName là Sheet1 thì sẽ phát sinh lỗi
Của bạn ý là add in, thì đương nhiên sẽ không bao giờ có chuyện là không có.
Nếu gọi Sheets(1) thì VBA sẽ hiểu là sheet đầu tiên của file hiện hành (tức là anh chàng ActiveWorkbook).
Cái này thì không chắc lắm vì tớ chưa thử được.
 
Upvote 0
Mình nghĩ nguyên lý của VBA như sau:

TH1. CodeName (Sheet1) đó là class/object mà VBA tạo ra, đó là một đối tượng tạo bởi lớp Class Worksheet/Dealog Sheet, Macro Sheet,... nó như việc chứng ta tạo một biến đối tượng nằm trong phạm vi Class mẹ là ThisWorkbook. Chính vì lý do nay chúng ta nếu dùng CodeName thì phải gọi theo 2 cách: ThisWorkbook.Sheet1 hoặc Sheet1. Trường hợp này nếu dùng ActiveWorkBook.Sheet1 hoặc Workbooks("Ten file").Sheet1 thì sẽ lỗi vì Sheet1 không thuộc thành phần Class của Workbook. Sheet1 chỉ là đối tượng được tạo thêm trên Class mà thôi

TH2. Nếu sử dụng tên sheet ngoài bảng tính của người dùng thì phải gọi bằng cách: ThisWorkbook.Sheets("Tên sheet1"), ActiveWorkbook.Sheets("Tên sheet1") , Workbooks(Tên file").Sheets("Tên sheet1") hoặc Sheets("Tên sheet1"). Nếu không có workbook đứng trước thì nó là của ActiveWorkbook (file đang nhìn thấy).

(*) Vậy tại sao TH1, gọi Sheet1 thì VBA luôn hiểu của ThisWorkbook mà không phải là ActiveWorkbook theo nguyên lý VBA? Có thể trường hợp ta cọi CodeName - Sheet1 thì VBA sẽ lấy workbook của mà nó chứa lệnh gọi Sheet1 mà không phải ActiveWorkbook. Còn nếu chỉ dùng Sheets("Tên sheet1") thì luôn là ActiveWorkbook.

Đây là suy luận của mình và chưa tự test hết, các bạn test nhé.
 
Upvote 0
Bài trước mình nhầm . ThisWorkbook.Sheet1 cũng lỗi vì ThisWorkbook là kiểu Workbook, class này không có property Sheet1 nên lỗi. Vậy nên nếu dùng CodeName thì không được dùng Wotkbook đứng trước.
Muốn chỉ định Sheet thuộc Workbook nào tùy ý thì phải dùng tên sheet chứ không dùng CodeName. Tức là chúng ta có cách gọi sheet theo tên người dùng với ActiveWorkbook, ThisWorkbook, Workbooks(i)
 
Upvote 0
Web KT

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

Back
Top Bottom