[Thắc mắc] Về thuộc tính CodeName của đối tượng Worksheet

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Mr.hieudoanxd

Thành viên thường trực
Tham gia
25/10/19
Bài viết
322
Được thích
150
Em có một thắc mắc là tại sao em không thấy mọi người trên diễn đàn sử dụng Thuộc tính CodeName của đối tượng Worksheet. Với một số ưu điểm như Không thay đổi nếu thay đổi thuộc tính Name của Worksheet?. Và ứng dụng của thuộc tính này như thế nào?
 
Em có một thắc mắc là tại sao em không thấy mọi người trên diễn đàn sử dụng Thuộc tính CodeName của đối tượng Worksheet. Với một số ưu điểm như Không thay đổi nếu thay đổi thuộc tính Name của Worksheet?. Và ứng dụng của thuộc tính này như thế nào?
Tôi cũng hay dùng code name vì không cần định nghĩa (gán vào biến) mà vẫn được VBA gợi ý đầy đủ phương thức và thuộc tính.
Tuy nhiên trong các trường hợp dính tới Workbook lại bị lỗi vì Workbook không biết được codename của sheet là tên của con nó, VD như Set ws = ThisWorkbook.Sheet1 là không được rồi.

Tôi chỉ biết chừng đó, chờ mọi người bổ túc.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi cũng hay dùng code name vì không cần định nghĩa (gán vào biến) mà vẫn VBA gợi ý đầy đủ phương thức và thuộc tính.
Tuy nhiên trong các trường hợp dính tới Workbook lại bị lỗi vì Workbook không biết được codename của sheet là tên của con nó, VD như Set ws = ThisWorkbook.Sheet1 là không được rồi.

Tôi chỉ biết chừng đó, chờ mọi người bổ túc.
Vâng! Em cũng từng dùng nó với kiểu with thisworkbook.sheet1 và lỗi sau phải sử dụng for each và if then mới được anh ạ
 
Upvote 0
Tôi cũng hay dùng code name vì không cần định nghĩa (gán vào biến) mà vẫn được VBA gợi ý đầy đủ phương thức và thuộc tính.
Tuy nhiên trong các trường hợp dính tới Workbook lại bị lỗi vì Workbook không biết được codename của sheet là tên của con nó, VD như Set ws = ThisWorkbook.Sheet1 là không được rồi.

Tôi chỉ biết chừng đó, chờ mọi người bổ túc.
Workbook chỉ có thuộc tính (đại khái coi như là biến). Codename Sheet1 là giá trị của thuộc tính ấy.
Một đối tượng không thể thay tên thuộc tính của nó.

Khi một workbook chứa code VBA thì nó cũng có cái gọi là VBProject. VBProject có một thuộc tính tên là VBComponents. Cái collection này chứa các sheets của workbook.theo codenames.

Khi bạn dùng codename để truy cập sheet thì bạn dùng qua VBComponents chứ không phải là qua Collection WorkSheets của Workbook.
 
Lần chỉnh sửa cuối:
Upvote 0
Workbook chỉ có thuộc tính (đại khái coi như là biến). Codename Sheet1 là giá trị của thuộc tính ấy.
Một đối tượng không thể thay tên thuộc tính của nó.

Khi một workbook active thì VBA tự động nối codenames cho các sheets của workbook. Sau khi nối xong, các codenames có thể được dùng như biến đối tượng worksheets. Điều này không thuộc về workbook.
Em sử dụng thuộc tính này gần đây có 1 vấn đề thế này:
1) Khi tạo mới sheet thì Codename sẽ được tăng tịnh tiến ví dụ tên trước là Sheet1 thì tạo mới là Sheet2, tên trước là X1 thì tên mới là X2 cái này anh nói rồi.
2) Giả sử có 2 Workbook
-Book1 có 1 Sheet có Codename là NewSh (sau đây em gọi tắt tên của Codename luôn thay cho Codename của Sheet)
-Book2 có 1 Sheet là Sheet1
Ta tiến hành Copy Sheet NewSh từ Book1 sang Book2 lúc này: Book2 sẽ có 2 Sheet là NewSh và Sheet1
Tiếp tục Copy Sheet NewSh từ Book1 sang Book2 lúc này Book2 sẽ có 3 Sheet là NewSh, NewSh1 và Sheet1 (Có nghĩa là Sheet mới sẽ có Codename theo dạng Codename của Sheet được copy)
Tiến hành Tạo Sheet mới lúc này Book2 sẽ có 4 Sheet là NewSh, NewSh1, Sheet1 và Sheet2 (Có nghĩa là Sheet mới tạo sẽ quay về dạng Codename cũ của file Book2)

Em thấy nó khá hay nhưng chưa thấy ai ứng dụng vào việc gì, không biết mọi người đã áp dụng nó có ứng dụng gì không?
 
Upvote 0
...

Em thấy nó khá hay nhưng chưa thấy ai ứng dụng vào việc gì, không biết mọi người đã áp dụng nó có ứng dụng gì không?
Chả thấy gì hay cả.
Codenames được đặt ra để chốt tên đối tượng sheet. Tránh vỡ code khi trong chính code có chỗ đổi tên sheet.

Vì vậy, đùa với codenames là đùa với lửa. Chấm hết.
 
Upvote 0
@Mr.hieudoanxd
Viết mã truy vấn đến một đối tượng trang tính thì sử dụng biến CodeName 99%, một số trường hợp còn lại như lặp qua trang tính tên có thứ tự chẳng hạn,...

Cách truy vấn đối tượng như Sheet1.Range("A1") là cách viết sai lầm nhất mà những coder tập sự gặp phải.
Vì khi xóa trang tính được truy vấn bởi biến CodeName, mã VBA sẽ biên dịch trả lại lỗi.

Vì vậy để viết mã tránh biên dịch lỗi, phải viết mã sâu hơn như sau:

JavaScript:
On Error Resume Next
Dim rg as object
Set rg = [Sheet1].Range("A1")
If Not rg Is Nothing Then
' Something'
End If
Chỉ có thể viết Sheet1.Range("A1") khi Option Explicit không được đặt. Nhưng hiếm có lập trình viên viết mã mà không có cài đặt này.

Hướng dẫn trên sẽ giúp ích cho bạn một phần về codeName.
 
Lần chỉnh sửa cuối:
Upvote 0
@Mr.hieudoanxd
Viết mã truy vấn đến một đối tượng trang tính thì sử dụng biến CodeName 99%, một số trường hợp còn lại như lặp qua trang tính tên có thứ tự chẳng hạn,...

Cách truy vấn đối tượng như Sheet1.Range("A1") là cách viết sai lầm nhất mà những coder tập sự gặp phải.
Vì khi xóa trang tính được truy vấn bởi biến CodeName, mã VBA sẽ biên dịch trả lại lỗi.

Vì vậy để viết mã tránh biên dịch lỗi, phải viết mã sâu hơn như sau:

JavaScript:
On Error Resume Next
Dim rg as object
Set rg = [Sheet1].Range("A1")
If Not rg Is Nothing Then
' Something'
End If
Chỉ có thể viết Sheet1.Range("A1") khi Option Explicit không được đặt. Nhưng hiếm có lập trình viên viết mã mà không có cài đặt này.

Hướng dẫn trên sẽ giúp ích cho bạn một phần về codeName.
Sao mình dùng Option Explicit và dùng codename thì khi chạy không bị lỗi bạn nhỉ? Mình thường dùng codename để tránh trường hợp người dùng đổi tên sheet và cũng gặp lỗi như trên khi làm việc giữa các workbooks như nói ở trên, lúc đó mình mới chuyển sang sheet name vì ít khi phải làm việc giữa nhiều file ah.
Mã:
Option Explicit
Sub aa()
    Sheet1.Range("A1") = "A"
End Sub
 
Upvote 0
Sao mình dùng Option Explicit và dùng codename thì khi chạy không bị lỗi bạn nhỉ? Mình thường dùng codename để tránh trường hợp người dùng đổi tên sheet và cũng gặp lỗi như trên khi làm việc giữa các workbooks như nói ở trên, lúc đó mình mới chuyển sang sheet name vì ít khi phải làm việc giữa nhiều file ah.
Mã:
Option Explicit
Sub aa()
    Sheet1.Range("A1") = "A"
End Sub



"Vì khi xóa trang tính được truy vấn bởi biến CodeName, mã VBA sẽ biên dịch trả lại lỗi."
 
Upvote 0
Upvote 0
Với cùng một mã nhưng chạy ở nhiều Trang tính và Sổ làm việc khác nhau thì các bạn sử dụng Phương thức gọi toàn cục hoặc chỉ định gọi đối tượng.
CodeName là biến cục bộ nên không thể sử dụng cho nhiều Sổ làm việc.

Ví dụ:
Thay vì Sheet1.Range("A1") thì:
hãy gọi Range("A1") khi trang tính hiện hành.
hoặc Workbooks("book2.xlsx").Worksheets("Sheet 1").Range("A1") khi trang tính cần thao tác không hiện hành

Thay vì Sheet1 hoặc ThisWorkbook.Worksheets("Sheet 1") thì:
Worksheets("Sheet 1") khi sổ làm việc hiện hành.
hoặc Workbooks("book2.xlsx").Worksheets("Sheet 1") khi sổ làm việc cần thao tác không hiện hành.
 
Upvote 0
Chỉ một câu hỏi đơn giản bạn lại đi hỏi ChatGPT, bạn đã phí phạm tài nguyên quá lớn. Bạn chỉ thấy cái trước mắt, còn những cái đằng sau nó lại vờ như không thấy.

Một chữ trong câu hỏi của bạn ChatGPT phân tích cũng đã tốn kém tài nguyên rồi.
 
Upvote 0
Web KT

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

Back
Top Bottom