lỗi object doesn't support property or method trong vba

Liên hệ QC

hoasuajp

Thành viên mới
Tham gia
7/4/22
Bài viết
43
Được thích
3
Giới tính
Nữ
Em có đoạn code như sau:

Mã:
Public Sub getpath()
   Dim vls, filepath As String
   dim rngws,rng as range
   vls = ThisWorkbook.Sheets("ds").Range("C4").Value'ten file dat tai o C4
   filepath = ThisWorkbook.Path & "\" & vls
 Application.ScreenUpdating = False

Workbooks.Open (filepath)
  With Workbooks(vls).Sheet9 'de codename cua worksheet thi bi loi giong nhu tieu de, con with sheets("ten sheet") thi khong bi loi
    rngws = .Range("C65536").End(xlUp).Row
    Set rng = .Range("B5:D142")
 End With
End Sub
vậy lý do gì nó bị lỗi ạ?
 
Với các workbook đang mở không phải ThisWorkbook (nghĩa là workbook chứa code đang chạy), thì không được xài sheet codename
 
Upvote 0
vậy là with end with chỉ dùng với thuộc tính của sheet là tên sheet thôi đúng không ạ?
Cái này không dính dáng gì tới WITH. Nếu O là một đối tượng - object thì O.xyz có nghĩa là xyz là phương thức của đối tượng O (gọi phương thức xyz của đối tượng O) hoặc xyz là thuộc tính của đối tượng O (truy cập tới thuộc tính của đối tượng O).

Workbooks(vls) trả về một đối tượng WORKBOOK. Đối tượng này làm gì có thuộc tính Sheet9.

Nếu muốn dùng codename thì chỉ viết TÊN thôi. Nhưng chỉ dùng được khi đó là sheet của tập tin chứa code. Tức khi gặp tên codename thì VBA sẽ tìm trong THISWORKBOOK - tập tin có chứa code đang thực thi. Nếu tìm thấy thì là nó, nếu không tìm thấy thì có lỗi. Vd. code ghi nhầm là Sheet21.Range(...) trong khi không có Sheet21 nào trong tập tin chứa code thì sẽ có lỗi.
 
Lần chỉnh sửa cuối:
Upvote 0
Dim vls, filepath As String
dim rngws,rng as range

Đầu tiên học cách khai báo biến cho chuẩn chỉ đã.
Viết thế kia thì chỉ có biến cuối được khai báo kiểu dữ liệu, còn các biến vls, rngws đều là Variant.

---
Đọc bài này để biết cách gọi, biết cách dùng index, name, codename.
Không thể viết book.codename của sheet được.

 
Upvote 0
Em tạm hiểu rằng, trong trường hợp này muốn gọi sheet của 1 workbook khác phải dùng TÊN, chứ không dùng CODENAME được phải không ạ?
vd:
file chứa code là file .xlsm và file mình muốn lấy dữ liệu là file xlsx kia. thì phải dùng tên, vì trường hợp dùng codename thì chỉ dùng trực tiếp trên file xlsm đó.
 
Upvote 0
Em tạm hiểu rằng, trong trường hợp này muốn gọi sheet của 1 workbook khác phải dùng TÊN, chứ không dùng CODENAME được phải không ạ?
vd:
file chứa code là file .xlsm và file mình muốn lấy dữ liệu là file xlsx kia. thì phải dùng tên, vì trường hợp dùng codename thì chỉ dùng trực tiếp trên file xlsm đó.

Vẫn gọi bình thường, quan trọng là gọi nó lên như thế nào.

Và quan trọng nhất là nắm chắc kiến thức cơ bản đã. Nắm chắc cái cơ bản rồi thì tự nhiên nghĩ ra cách.
 
Upvote 0
Vẫn gọi bình thường, quan trọng là gọi nó lên như thế nào.

Và quan trọng nhất là nắm chắc kiến thức cơ bản đã. Nắm chắc cái cơ bản rồi thì tự nhiên nghĩ ra cách.
dạ vâng, em đang đọc các bài viết về VBA của anh đây ạ. Cám ơn anh rất nhiều.
 
Upvote 0
Khi ta chạy VBA, Project tự động dùng codename để tạo tên tự (alias) cho các Object sheets.
Nếu workbook có 5 sheets codename là { sheet1, sheet2, sheetX, sheetY, sheetEmUt } thì trong Project cũng sẽ có 5 Objects sheet1, sheet2, sheetX, sheetY, sheetEmUt trỏ vào 5 sheet này. Khi cần cứ việc lôi chúng ra.

Project: tức là cái đang chạy code.
 
Upvote 0
Em tạm hiểu rằng, trong trường hợp này muốn gọi sheet của 1 workbook khác phải dùng TÊN, chứ không dùng CODENAME được phải không ạ?
vd:
file chứa code là file .xlsm và file mình muốn lấy dữ liệu là file xlsx kia. thì phải dùng tên, vì trường hợp dùng codename thì chỉ dùng trực tiếp trên file xlsm đó.
Cái này dễ mà.

Giả sử bạn muốn truy cập tới <Workbook_KHÁC>, tới sheet có tên nhìn thấy ngoài sheet là <Tên_ngoài sheet>, và tên codename là <Tên_CODE>. Trong trường hợp này do truy câp tới workbook khác nên chỉ dùng được <Tên_ngoài sheet>:

<Workbook_KHÁC>.WorkSheets("<Tên_ngoài sheet>")...

Nhưng nếu là truy cập tới sheet khác với tên nhìn thấy ngoài sheet là <Tên_ngoài sheet>, và tên codename là <Tên_CODE> trong CÙNG tập tin CHỨA CODE ĐANG THỰC THI thì dùng được cả hai cách:

ThisWorkbook.WorkSheets("<Tên_ngoài sheet>")...

hoặc

<Tên_CODE> ...

Đã dùng <Tên_CODE> thì chỉ có <Tên_CODE> thôi chứ không có kiểu ThisWorkbook.<Tên_CODE> đâu nhé. Bởi như tôi đã giải thích nếu viết
ThisWorkbook.<Tên_CODE> ...
thì dòng đó được hiểu là đang gọi phương thức <Tên_CODE> của đối tượng ThisWorkbook hoặc truy cập tới thuộc tính <Tên_CODE> của đối tượng ThisWorkbook. Sẽ có lỗi do đối tượng ThisWorkbook không có phương thức nào, thuộc tính nào tên là <Tên_CODE>.

Viết đến thế mà bạn vẫn còn phải hỏi lại thì đành bó tay.
 
Upvote 0
Web KT

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

Back
Top Bottom