Lỗi Runtime '1004' Method 'Range' of object'_Global' failed

Liên hệ QC

huulochuulocvn

Thành viên mới
Tham gia
17/8/18
Bài viết
1
Được thích
0
Chào mọi người,
Hiện tại em bị giống như tiêu đề, bên dưới là đoạn code của em và file

Worksheets("CFBUDGET").Select
Set rng = Range("I_PRD_IX")
'header row and column
i = rng.Row + 1
j = rng.Column
lastcol = j
Do While Not IsEmpty(Cells(i, lastcol))
lastcol = lastcol + 1
1534517490690.png

Mong được sự giúp đỡ
Cám ơn mọi người nhiều lắm
 

File đính kèm

  • DBL_CFBUDGET.template.xls
    120 KB · Đọc: 15
Mã:
Worksheets("CFBUDGET").Select
Set rng = Range("I_PRD_IX")

Range("I_PRD_IX") có nghĩa là bạn truy cập tới vùng trên active sheet. Nhìn vào dòng 1 thì thấy là bạn đang muốn truy cập tới vùng tên là "I_PRD_IX" trên sheet "CFBUDGET" (là active sheet).
Hãy kiểm tra lại, nếu vùng tên là "I_PRD_IX" không nằm trên sheet "CFBUDGET", vd. nằm ở sheet khác, thì chắc chắn có lỗi.
 
Chào mọi người,
Hiện tại em bị giống như tiêu đề, bên dưới là đoạn code của em và file

Worksheets("CFBUDGET").Select
Set rng = Range("I_PRD_IX")
'header row and column
i = rng.Row + 1
j = rng.Column
lastcol = j
Do While Not IsEmpty(Cells(i, lastcol))
lastcol = lastcol + 1
View attachment 202066

Mong được sự giúp đỡ
Cám ơn mọi người nhiều lắm
cách tốt nhất để không gặp lỗi "Out of range" (Khi đang làm việc với nhiều Workbook, Worksheet) là hễ set cái gì cứ gọi cho đủ cả "tổ tông 3 đời" nhà nó lên (Bắt đầu từ workbooks - worksheet - range\cell .. ) thì chẳng bao giờ bị lẫn vì nó luôn tìm đúng vùng chỉ định
Mã:
Set rng = Workbooks("DBL_CFBUDGET.template (1).xls").Sheets(2).Range("I_PRD_IX")
 
cách tốt nhất để không gặp lỗi "Out of range" (Khi đang làm việc với nhiều Workbook, Worksheet) là hễ set cái gì cứ gọi cho đủ cả "tổ tông 3 đời" nhà nó lên (Bắt đầu từ workbooks - worksheet - range\cell .. ) thì chẳng bao giờ bị lẫn vì nó luôn tìm đúng vùng chỉ định
Mã:
Set rng = Workbooks("DBL_CFBUDGET.template (1).xls").Sheets(2).Range("I_PRD_IX")
Thế tui ngứa tay đổi tên file thì sao, thích hơn thì thay đổi thứ tự các sheet.
 
Thế tui ngứa tay đổi tên file thì sao, thích hơn thì thay đổi thứ tự các sheet.
Anh đặt trường hợp rất hay. vậy thì ta đặt tên workbook và tên sheet thành những biến luôn
Mã:
vName = ThisWorkbook.Name
Hoặc nếu là file quan trọng có thể protect workbook. vậy là hết đổi thứ tự sheet nhé.
 
Anh đặt trường hợp rất hay. vậy thì ta đặt tên workbook và tên sheet thành những biến luôn
Mã:
vName = ThisWorkbook.Name
Hoặc nếu là file quan trọng có thể protect workbook. vậy là hết đổi thứ tự sheet nhé.
Nhưng tại sao lại phải phụ thuộc vào thứ tự sheet khi sheet có tên đàng hoàng?

Còn chuyện viết tường minh thì tôi ủng hộ 200%.
 
Nhưng tại sao lại phải phụ thuộc vào thứ tự sheet khi sheet có tên đàng hoàng?
Nếu thứ tự sheet có thể đổi vậy thì tên sheet cũng có thể đổi đúng không ? vậy cách tốt nhất nếu đưa file cho ai đó xài thì cứ protect WB là khỏi lăn tăn.
còn nếu là file của ta, ta viết ta xài thì tôi nghĩ ai hơi đâu đi đổi linh tinh rồi sửa code cho nó ốm người ra.
 
Nếu thứ tự sheet có thể đổi vậy thì tên sheet cũng có thể đổi đúng không ? vậy cách tốt nhất nếu đưa file cho ai đó xài thì cứ protect WB là khỏi lăn tăn.
còn nếu là file của ta, ta viết ta xài thì tôi nghĩ ai hơi đâu đi đổi linh tinh rồi sửa code cho nó ốm người ra.
Thôi thì bạn muốn viết thế nào cũng được. Thực ra là nên viết tên sheet vì code dễ đọc hơn nhiều. Khi đọc code bạn biết ngay là đang nói tới sheet nào mà không cần kiểm tra. Khi dùng 1, 2, 3 thì người ngoài luôn phải kiểm tra là "chỗ này" đang nói tới sheet nào. Viết như bạn không phải là sai. Nên và không nên thôi. Mà "nên" cũng chỉ là ý kiến chủ quan của mỗi người. Vì thế bạn cứ viết như bạn thích.

Mỗi người có thói quen tốt hoặc không tốt. Nhiều người viết End(...) nhưng tôi luôn viết End(xlUp). Nghỉ chơi 5 năm thì rồi không nhớ ... nó là gì nhưng xlUp thì luôn hiểu

Viết SendMessage hwnd, 16, 0, 0 không sai nhưng đọc code rất khó vì 16 nó chả nói lên cái gì cả. Nhưng code
Mã:
Private Const WM_CLOSE = &H10
...
SendMessage hwnd, WM_CLOSE, 0, 0
thì dễ đọc rất nhiều.
 
Làm sao mà gọi "protect" là tốt nhất được. Lỡ trong code có chỗ "unprotect" thì sao?

1. tên sheet ít khi người ta đổi, nhưng thứ tự sheet đổi là chuyện không hiếm
2. tên sheet bị đổi thì rất hiếm khi bị lộn sheet, chỉ bị code té ngữa thôi. Thứ tự sheet mà đổi thì có thể chạy ra sai, vì truy chiếu trậ chỗ.
 
Làm sao mà gọi "protect" là tốt nhất được. Lỡ trong code có chỗ "unprotect" thì sao?

1. tên sheet ít khi người ta đổi, nhưng thứ tự sheet đổi là chuyện không hiếm
2. tên sheet bị đổi thì rất hiếm khi bị lộn sheet, chỉ bị code té ngữa thôi. Thứ tự sheet mà đổi thì có thể chạy ra sai, vì truy chiếu trậ chỗ.
Ý kiến 2 của anh rất chí lý. Quay trở lại chủ đề thì em cũng đang gợi ý thêm cách cho thớt thôi. mỗi người góp 1 chút ý kiến, còn cách lại cách làm cuối cùng thì thớt vẫn là người quyết định mà :)
Thêm một chút ý kiến: Thông thường khi viết code rất hiếm trường hợp "UnprotectWorkbook", đa số vẫn là Unprotect worksheet nhiều hơn, nếu ai đó viết code UnProtect trộm nghĩ có lẽ họ cũng đã viết code Protect ngay sau khi hoàn thành "cái mục đích" của họ (Vì nếu không thế, họ protect để làm gì khi lại bị Unprotect mỗi khi dùng code ?)
 
Thôi thì bạn muốn viết thế nào cũng được. Thực ra là nên viết tên sheet vì code dễ đọc hơn nhiều. Khi đọc code bạn biết ngay là đang nói tới sheet nào mà không cần kiểm tra. Khi dùng 1, 2, 3 thì người ngoài luôn phải kiểm tra là "chỗ này" đang nói tới sheet nào. Viết như bạn không phải là sai. Nên và không nên thôi. Mà "nên" cũng chỉ là ý kiến chủ quan của mỗi người. Vì thế bạn cứ viết như bạn thích.

Mỗi người có thói quen tốt hoặc không tốt. Nhiều người viết End(...) nhưng tôi luôn viết End(xlUp). Nghỉ chơi 5 năm thì rồi không nhớ ... nó là gì nhưng xlUp thì luôn hiểu

Viết SendMessage hwnd, 16, 0, 0 không sai nhưng đọc code rất khó vì 16 nó chả nói lên cái gì cả. Nhưng code
Mã:
Private Const WM_CLOSE = &H10
...
SendMessage hwnd, WM_CLOSE, 0, 0
thì dễ đọc rất nhiều.
Công nhận với anh luôn về cái xlup. Ai thèm nhớ cái con số ý là gì, lúc code cũng nhanh. Rất là ức chế khi xem code họ dùng hằng số trực tiếp ( các con số thay vì là xlup). Lại phải di dò xem giá trị của nó là gì.
 
.... Rất là ức chế khi xem code họ dùng hằng số trực tiếp ( các con số thay vì là xlup). Lại phải di dò xem giá trị của nó là gì.
VBE (không phải VBA) hồi xưa khác. Thư viện hằng ngày xưa vì cần tiết kiệm bộ nhớ cho nên không đầy đủ. Kỹ thuật intellisense cũng còn thấp vì máy yếu. Người code có một quyển sách cẩm nang, và thường có một bảng hằng số để bên cạnh (*).
Vì vậy có một số người còn giữ thói quen ấy thôi. Hồi xưa, nhiều người viết code ở diễn đàn này cũng dùng Char 10-13 để xuống dòng trong các dialog.
Nhưng đó là châm chế cho code xưa. Thời buổi máy tính hằng Giga Hz, bộ nhớ Giga Byte thì nên đổi mới.

(*) Lúc tôi làm việc với T-SQL và SQL-Plus bên cạnh vẫn có một bảng in sử dụng các hàm, nhất là hàm thuộc dạng date và string của chúng.
 
Web KT

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

Back
Top Bottom