Xin mọi người giúp đỡ về Sheet code name

Liên hệ QC

FungoChan79

Thành viên mới
Tham gia
24/8/18
Bài viết
14
Được thích
1
Chào mọi người.
Mình là dân mới tập tành mò mẫm học và viết code vba nên có vài chổ cần mọi người tư vấn, chỉ bảo giúp cho ạ.

Chuyện là vầy. Mình làm theo 1 thầy hướng dẫn code import dữ liệu từ trên mạng rồi lấy về tự áp dụng cho công việc của mình.
mình có 1 file tổng là "phieukqht.xlsx" - file này sẽ chạy lệnh để lấy dữ liệu từ file phụ "Thong Tin Chuyen Can - Diem Danh.xlsx"
Tình hình là mình code lấy dữ liệu vào file tổng được rồi, ko có vấn đề gì hết.

Chỉ là trên mạng hướng dẫn code thì có viết code như ở dưới.
Mã:
Dim master as Worksheet
set master = PhieuKQHT.sheets("Chuyen Can")

Nhưng khi mình đổi sheets("Chuyen Can") thành sheet code name là sheet7 thì lại báo lỗi như hình.

received_328123521113996.png

Mình thắc mắc không biết có cách nào khai báo bằng tên code của sheet không. vì mình sợ bị lỗi code khi ai đó đổi tab name ở ngoài ko?
Mong mọi người giúp đỡ ạ.

À, mình xin nói thêm vì mình sợ có bác lại hỏi sao ko lấy code nào dễ hơn, thì mình xin thưa là mình cũng có tìm trên mạng chỉ rất nhiều code import dữ liệu đơn giản hơn như này rồi. Nhưng vì tính chất theo công việc của mình, có rất nhiều lớp học và nhiều thông tin cần nhập (như chuyên cần, điểm danh, rèn luyện, bảng điểm....) vào file tổng, nên mình lựa code import 1 lần như vầy ạ :)

Chân thành cảm ơn mọi người trước.
 

File đính kèm

  • phieukqht.xlsm
    424.5 KB · Đọc: 3
  • Thong Tin Chuyen Can - Diem Danh.xlsx
    57.6 KB · Đọc: 2
Lần chỉnh sửa cuối:
Mới mò mẫm tự học thì cố tránh tật xấu.
1. Lúc hỏi bài thì tránh viết tắt. Cái tật viết tắt cho người đọc thấy rằng người hỏi sẵn sàng trao đổi sự trong sáng rõ rệt nđể lấy sự nhanh gọn
2. dùng từ chuyên môn, tên đối tượng cho chính xác. Điển hình là codename mà sửa lại thành namecode thì sai biết dâu mà mò.

Mọi người cho mình thắc mắc với ạ. Minhg mới tập tành tự mò mẫm tự học và code vba thôi nên mong m.n chỉ giáo giúp với ạ.
Tình hình là vầy, Khi mình khai báo như code dưới thì ko bị lỗi.
...
PhieuKQHT là tên namecode của thisworkbook.
...
 
Upvote 0
Mới mò mẫm tự học thì cố tránh tật xấu.
1. Lúc hỏi bài thì tránh viết tắt. Cái tật viết tắt cho người đọc thấy rằng người hỏi sẵn sàng trao đổi sự trong sáng rõ rệt nđể lấy sự nhanh gọn
2. dùng từ chuyên môn, tên đối tượng cho chính xác. Điển hình là codename mà sửa lại thành namecode thì sai biết dâu mà mò.
Thì thật mình cũng mới tự học lấy nên có nhiều cái căn bản mình hơi bỏ sót. Mong các bạn thông cảm bỏ qua cho người mới.
Cảm ơn bạn đã nhắc nhở. Mình mới sữa rồi. Mình sẽ rút kinh nghiệm với những cái nhỏ nhặt chi tiết như vậy để ko phiền lòng tới ai nữa.
 
Upvote 0
Thì thật mình cũng mới tự học lấy nên có nhiều cái căn bản mình hơi bỏ sót. Mong các bạn thông cảm bỏ qua cho người mới.
Cảm ơn bạn đã nhắc nhở. Mình mới sữa rồi. Mình sẽ rút kinh nghiệm với những cái nhỏ nhặt chi tiết như vậy để ko phiền lòng tới ai nữa.
bạn gửi file lên nhé.file lỗi đấy.không thì bạn sửa thế này xem
set master = PhieuKQHT.sheets(7)
 
Upvote 0
Mọi người cho mình thắc mắc với ạ. Mình mới tập tành tự mò mẫm tự học và code vba thôi nên mong mọi người chỉ giáo giúp với ạ.
Tình hình là vầy, Khi mình khai báo như code dưới thì ko bị lỗi.
Mã:
Dim master as Worksheet
set master = PhieuKQHT.sheets("Mon Hoc")

Nhưng khi đổi sheets("Mon Hoc") thanh sheet code name là sheet7 thì lại báo lỗi như hình.

PhieuKQHT là tên codename của thisworkbook.
Còn Sheet7 là sheets(Mon Hoc).
View attachment 207483
Viết vầy luôn Set master = Sheet7 là được. Không cần tên workbook (mà bắt buộc phải vậy)
 
Upvote 0
Viết vầy luôn Set master = Sheet7 là được. Không cần tên workbook (mà bắt buộc phải vậy)
bạn gửi file lên nhé.file lỗi đấy.không thì bạn sửa thế này xem
set master = PhieuKQHT.sheets(7)
dạ tại em cũng mới tự học code nên làm theo trên mạng chỉ rồi tự code lại... nên thấy người ta set như vậy em cũng để vậy luôn.
mà giờ em muốn đổi xíu sang code name để ko bị thay tên ở ngoài tab sheet.
để em up file với diễn giải 1 số ý định trong đó lên đầu post cho mọi người dễ hình dung ạ.
 
Upvote 0
dạ tại em cũng mới tự học code nên làm theo trên mạng chỉ rồi tự code lại... nên thấy người ta set như vậy em cũng để vậy luôn.
mà giờ em muốn đổi xíu sang code name để ko bị thay tên ở ngoài tab sheet.
để em up file với diễn giải 1 số ý định trong đó lên đầu post cho mọi người dễ hình dung ạ.
Bạn không phải đính kèm tập tin gì cả.

Ý định của bạn là thế này:

Set master = sheet mà có sheet name là "Chuyen Can", và code name là Sheet7

Bạn có 2 cách:
1. Dùng sheet name
Mã:
set master = PhieuKQHT.sheets("Chuyen Can")

2. Dùng code name
Mã:
set master = Sheet7

Mọi kiểu như
Mã:
set master = PhieuKQHT.Sheet7
sẽ có lỗi. Vì sao? Nếu A là đối tượng (Object) thì A.hichic có nghĩa là truy cập tới thuộc tính hichic hoặc phương thức hichic của đối tượng A. PhieuKQHT là đối tượng, cụ thể đó là đối tượng Workbook. Nó không có thuộc tính nào là Sheet7, cũng không có phương thức nào có tên là Sheet7. Vì thế có lỗi.

Tất nhiên Sheet7 "nằm trong, thuộc về" workbook PhieuKQHT nhưng Sheet7 không là thuộc tính cũng không là phương thức của PhieuKQHT. 2 cái này "nằm trong, thuộc về" và "thuộc tính" là 2 cái khác, khái niệm khác nhau.

Dùng
Mã:
set master = PhieuKQHT.sheets(7)
không bị lỗi nhưng là trò chơi may rủi. Vì sheet thứ 7 không nhất thiết là sheet "Chuyen Can" - Sheet7
 
Upvote 0
Chắc ăn thì chủ topic nên đặt lệnh là
set master = Sheet_Master

Sheet_Master là nameCode mà chủ topic nên tự đặt tay nameCode này cho sheet dữ liệu
 
Upvote 0
Bạn không phải đính kèm tập tin gì cả.

Ý định của bạn là thế này:

Set master = sheet mà có sheet name là "Chuyen Can", và code name là Sheet7

Bạn có 2 cách:
1. Dùng sheet name
Mã:
set master = PhieuKQHT.sheets("Chuyen Can")

2. Dùng code name
Mã:
set master = Sheet7

Mọi kiểu như
Mã:
set master = PhieuKQHT.Sheet7
sẽ có lỗi. Vì sao? Nếu A là đối tượng (Object) thì A.hichic có nghĩa là truy cập tới thuộc tính hichic hoặc phương thức hichic của đối tượng A. PhieuKQHT là đối tượng, cụ thể đó là đối tượng Workbook. Nó không có thuộc tính nào là Sheet7, cũng không có phương thức nào có tên là Sheet7. Vì thế có lỗi.

Tất nhiên Sheet7 "nằm trong, thuộc về" workbook PhieuKQHT nhưng Sheet7 không là thuộc tính cũng không là phương thức của PhieuKQHT. 2 cái này "nằm trong, thuộc về" và "thuộc tính" là 2 cái khác, khái niệm khác nhau.

Dùng
Mã:
set master = PhieuKQHT.sheets(7)
không bị lỗi nhưng là trò chơi may rủi. Vì sheet thứ 7 không nhất thiết là sheet "Chuyen Can" - Sheet7
Dạ, Cảm ơn bác. E hiểu rồi.

Bác cho e hỏi sâu thêm 1 tý nếu không là PhieuKQHT mà nó là ThisWorkbook thì cũng như thế luôn đúng ko bác?
Và như em Set master = sheet7
Thì những đối tượng ở dưới khi chạy macro nó có hiểu là phải thực thi ở workbook PhieuKQHT ko bác.
Vì theo như em đọc hiểu trong cái code của em đang làm thì nếu em ko khai workbook ở trước sheet, nó sẽ ko hiểu là lấy sheet trong PhieuKQHT mà em sợ nó lại lấy sheet7 của workbook phụ.
Ko biết em có hiểu đúng ko nữa.

Chắc ăn thì chủ topic nên đặt lệnh là
set master = Sheet_Master

Sheet_Master là nameCode mà chủ topic nên tự đặt tay nameCode này cho sheet dữ liệu
E lại sợ nếu ko có đối tượng workbook ở đầu nó ko hiểu là lất sheet7 ở đâu @@
 
Upvote 0
Dạ, Cảm ơn bác. E hiểu rồi.

Bác cho e hỏi sâu thêm 1 tý nếu không là PhieuKQHT mà nó là ThisWorkbook thì cũng như thế luôn đúng ko bác?
Và như em Set master = sheet7
Thì những đối tượng ở dưới khi chạy macro nó có hiểu là phải thực thi ở workbook PhieuKQHT ko bác.
Nếu bạn có code trong workbook PhieuKQHT
Mã:
Set master = sheet7
thì master là đối tượng xác định cho dù ngoài tập tin hiện hành còn có 100 tập tin khác đang mở cũng có 100 sheet với code name là Sheet 7.

Sau câu lệnh ở trên thì master đã được xác định cụ thể. Nó đại diên cho sheet cụ thể trong workbook cụ thể là PhieuKQHT. Không phải là: sheet có code name là Sheet7 trong ActiveBook, mà là: sheet có code name là Sheet7 trong workbook cụ thể là PhieuKQHT
---------------
Bạn hãy làm một ví dụ.
1. Mở tấp tin mới -> đổi tên Sheet1 thành "Chuyen_can" -> đổi code name của Chuyen_can thành Sheet7 -> thêm module với code
Mã:
Sub test1()
    Set master = Sheets("Chuyen_can")
    MsgBox master.Parent.Name
End Sub

Sub test2()
    Set master = Sheet7
    MsgBox master.Parent.Name
End Sub
-> lưu lại với tên Book1.xlsm

2. Mở tiếp tập tin mới -> đổi tên Sheet1 thành "Chuyen_can" -> đổi code name của Chuyen_can thành Sheet7 -> lưu lại với tên Book2.xlsm

3.
- Kích hoạt Book1.xlsm -> Alt + F11 (vào VBE) -> chạy test1 -> có kết quả là "Book1.xlsm" -> chạy test2 -> có kết quả là "Book1.xlsm"

- Kích hoạt Book2.xlsm -> Alt + F11 (vào VBE) -> chạy test1 -> có kết quả là "Book2.xlsm" -> chạy test2 -> có kết quả là "Book1.xlsm"

Tại sao?

Code
Mã:
Set master = Sheet7
nằm trong workbook Book1.xlsm nên xác định master là sheet Chuyen_can (Sheet7) của Book1.xlsm.

Code
Mã:
Set master = Sheets("Chuyen_can")
là cách viết không tường minh. Viết tường minh thì là
Code
Mã:
Set master = ActiveBook.Sheets("Chuyen_can")
Tức luôn xác định sheet Chuyen_can của book hiện hành. Vì thế khi bạn kích hoạt Book2.xlsm trước khi chạy test1 thì kết quả là Book2.xlsm. Vì
Mã:
Set master = ActiveBook.Sheets("Chuyen_can")
sẽ là
Mã:
Set master = Workboks("Book2.xlsm").Sheets("Chuyen_can")

Tức master là sheet Chuyen_can nằm trong Book2.xlsm

Kết luận:
- Nếu dùng code name thì sheet luôn là sheet của book mà trong đó có code.
- Nếu dùng sheet name kiểu viết không tường minh thì tùy theo sheet nào đang active khi chạy code mà sheet đang xét có thể là sheet nằm ở book có code đó hay nằm ở book khác. Chính vì thế để chắc chắn thì nên viết tường minh.

Mã:
Set master = Workboks("Book100.xlsm").Sheets("Chuyen_can")
luôn xác định sheet chuyen_can thuộc Book100.xlsm.

Nếu code trên lại nằm đúng trong Book100.xlsm thì thay vì Workboks("Book100.xlsm") có thể dùng ThisWorkbook. Tức
Mã:
Set master = ThisWorkbook.Sheets("Chuyen_can")

Bản thân tôi rấy hay viết tường minh.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn có code trong workbook PhieuKQHT
Mã:
Set master = sheet7
thì master là đối tượng xác định cho dù ngoài tập tin hiện hành còn có 100 tập tin khác đang mở cũng có 100 sheet với code name là Sheet 7.

Sau câu lệnh ở trên thì master đã được xác định cụ thể. Nó đại diên cho sheet cụ thể trong workbook cụ thể là PhieuKQHT. Không phải là: sheet có code name là Sheet7 trong ActiveBook, mà là: sheet có code name là Sheet7 trong workbook cụ thể là PhieuKQHT
---------------
Bạn hãy làm một ví dụ.
1. Mở tấp tin mới -> đổi tên Sheet1 thành "Chuyen_can" -> đổi code name của Chuyen_can thành Sheet7 -> thêm module với code
Mã:
Sub test1()
    Set master = Sheets("Chuyen_can")
    MsgBox master.Parent.Name
End Sub

Sub test2()
    Set master = Sheet7
    MsgBox master.Parent.Name
End Sub
-> lưu lại với tên Book1.xlsm

2. Mở tiếp tập tin mới -> đổi tên Sheet1 thành "Chuyen_can" -> đổi code name của Chuyen_can thành Sheet7 -> lưu lại với tên Book2.xlsm

3.
- Kích hoạt Book1.xlsm -> Alt + F11 (vào VBE) -> chạy test1 -> có kết quả là "Book1.xlsm" -> chạy test2 -> có kết quả là "Book1.xlsm"

- Kích hoạt Book2.xlsm -> Alt + F11 (vào VBE) -> chạy test1 -> có kết quả là "Book2.xlsm" -> chạy test2 -> có kết quả là "Book1.xlsm"

Tại sao?

Code
Mã:
Set master = Sheet7
nằm trong workbook Book1.xlsm nên xác định master là sheet Chuyen_can (Sheet7) của Book1.xlsm.

Code
Mã:
Set master = Sheets("Chuyen_can")
là cách viết không tường minh. Viết tường minh thì là
Code
Mã:
Set master = ActiveBook.Sheets("Chuyen_can")
Tức luôn xác định sheet Chuyen_can của book hiện hành. Vì thế khi bạn kích hoạt Book2.xlsm trước khi chạy test1 thì kết quả là Book2.xlsm. Vì
Mã:
Set master = ActiveBook.Sheets("Chuyen_can")
sẽ là
Mã:
Set master = Workboks("Book2.xlsm").Sheets("Chuyen_can")

Tức master là sheet Chuyen_can nằm trong Book2.xlsm

Kết luận:
- Nếu dùng code name thì sheet luôn là sheet của book mà trong đó có code.
- Nếu dùng sheet name kiểu viết không tường minh thì tùy theo sheet nào đang active khi chạy code mà sheet đang xét có thể là sheet nằm ở book có code đó hay nằm ở book khác. Chính vì thế để chắc chắn thì nên viết tường minh.

Mã:
Set master = Workboks("Book100.xlsm").Sheets("Chuyen_can")
luôn xác định sheet chuyen_can thuộc Book100.xlsm.

Nếu code trên lại nằm đúng trong Book100.xlsm thì thay vì Workboks("Book100.xlsm") có thể dùng ThisWorkbook. Tức
Mã:
Set master = ThisWorkbook.Sheets("Chuyen_can")

Bản thân tôi rấy hay viết tường minh.
wow!!! hay quá trời luôn... ko biết nói sao cho hết lời cảm ơn nữa, bác nhiệt tình diễn giải làm em thấu đáo tận ruột gan ^^!. đa tạ bác nhiều lắm.
vậy là em có thể chốt chặt lại vấn đề của em mấy bữa rài được rồi :D
 
Upvote 0
Nếu bạn có code trong workbook PhieuKQHT
Mã:
Set master = sheet7
thì master là đối tượng xác định cho dù ngoài tập tin hiện hành còn có 100 tập tin khác đang mở cũng có 100 sheet với code name là Sheet 7.

Sau câu lệnh ở trên thì master đã được xác định cụ thể. Nó đại diên cho sheet cụ thể trong workbook cụ thể là PhieuKQHT. Không phải là: sheet có code name là Sheet7 trong ActiveBook, mà là: sheet có code name là Sheet7 trong workbook cụ thể là PhieuKQHT
---------------
Bạn hãy làm một ví dụ.
1. Mở tấp tin mới -> đổi tên Sheet1 thành "Chuyen_can" -> đổi code name của Chuyen_can thành Sheet7 -> thêm module với code
Mã:
Sub test1()
    Set master = Sheets("Chuyen_can")
    MsgBox master.Parent.Name
End Sub

Sub test2()
    Set master = Sheet7
    MsgBox master.Parent.Name
End Sub
-> lưu lại với tên Book1.xlsm

2. Mở tiếp tập tin mới -> đổi tên Sheet1 thành "Chuyen_can" -> đổi code name của Chuyen_can thành Sheet7 -> lưu lại với tên Book2.xlsm

3.
- Kích hoạt Book1.xlsm -> Alt + F11 (vào VBE) -> chạy test1 -> có kết quả là "Book1.xlsm" -> chạy test2 -> có kết quả là "Book1.xlsm"

- Kích hoạt Book2.xlsm -> Alt + F11 (vào VBE) -> chạy test1 -> có kết quả là "Book2.xlsm" -> chạy test2 -> có kết quả là "Book1.xlsm"

Tại sao?

Code
Mã:
Set master = Sheet7
nằm trong workbook Book1.xlsm nên xác định master là sheet Chuyen_can (Sheet7) của Book1.xlsm.

Code
Mã:
Set master = Sheets("Chuyen_can")
là cách viết không tường minh. Viết tường minh thì là
Code
Mã:
Set master = ActiveBook.Sheets("Chuyen_can")
Tức luôn xác định sheet Chuyen_can của book hiện hành. Vì thế khi bạn kích hoạt Book2.xlsm trước khi chạy test1 thì kết quả là Book2.xlsm. Vì
Mã:
Set master = ActiveBook.Sheets("Chuyen_can")
sẽ là
Mã:
Set master = Workboks("Book2.xlsm").Sheets("Chuyen_can")

Tức master là sheet Chuyen_can nằm trong Book2.xlsm

Kết luận:
- Nếu dùng code name thì sheet luôn là sheet của book mà trong đó có code.
- Nếu dùng sheet name kiểu viết không tường minh thì tùy theo sheet nào đang active khi chạy code mà sheet đang xét có thể là sheet nằm ở book có code đó hay nằm ở book khác. Chính vì thế để chắc chắn thì nên viết tường minh.

Mã:
Set master = Workboks("Book100.xlsm").Sheets("Chuyen_can")
luôn xác định sheet chuyen_can thuộc Book100.xlsm.

Nếu code trên lại nằm đúng trong Book100.xlsm thì thay vì Workboks("Book100.xlsm") có thể dùng ThisWorkbook. Tức
Mã:
Set master = ThisWorkbook.Sheets("Chuyen_can")

Bản thân tôi rấy hay viết tường minh.
Vậy anh cho em hỏi codename nó chỉ sử dụng cho các sheet trong workbook hiện tại, nếu muốn tham chiếu đến sheet của wookbook khác mà sử dụng codename thì làm cách nào ạ?
 
Upvote 0
... nếu muốn tham chiếu đến sheet của wookbook khác mà sử dụng codename thì làm cách nào ạ?
Mục đích là gì?
Nếu quan trọng thì tính tiếp. Nếu chỉ tò mò hoặc để làm dáng thì thôi quên đi, không bỏ công làm vì cách thực hiện khá rắc rối.
 
Upvote 0
Tò mò thì chỉ cần biết rằng CodeName là Components của Project chứ không phải là Properties của đối tượng WorkBook. Vì vậy nó chỉ đi một mình chứ không thể truy cứu qua không gian định danh của WorkBook - tức là không thể dùng tiền tố: WorkBook_A.Sheet1

Code thì chỉ cần dùng loại đơn giản (có cách khác hữu hiệu hơn nhưng rắc rối hơn)

Function GetSheetByCodeName(WB As Workbook, CName As String) As WorkSheet
For Each ws In WB.WorkSheets
If ws.CodeName = CName Then
Set GetSheetByCodeName = ws
Exit Function
End If
Next ws
End Function

' lấy sheet
Set sheet_A = GetSheetByCodeName(WorkBooks("workbook A"), "sheet_A")

Chú thích: người ta dùng codename khi cần đối phó trường hợp người dùng đổi tên sheet (tránh bị hẫng)
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom