Lỗi 1004 method range of object '_worksheet' failed

Liên hệ QC

tanhuy12

Thành viên mới
Tham gia
30/6/22
Bài viết
1
Được thích
0
Mình đang tập tành tự học VBA có viết đoạn code sau mà cứ báo lỗi dòng
"If cotB = 2 And HangB > 7 And BILL.Range("B" & temp).Value <> 0 And BILL.Range("F" & temp).Value <> 1 Then"
mong mn giúp đỡ :<

CODE:
Dim temp As Long
Dim HangB As Variant

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim BILL As Worksheet
Set BILL = Sheet5

cotB = ActiveCell.Column
Select Case cotB
Case Is = 6
GoTo ketthuc
Case Is = 2
temp = HangB
HangB = ActiveCell.Row
If cotB = 2 And HangB > 7 And BILL.Range("B" & temp).Value <> 0 And BILL.Range("F" & temp).Value <> 1 Then
BILL.Range("F" & temp).Value = 1
End If
End Select
ketthuc:

End Sub
 

bebo021999

Thành viên gạo cội
Tham gia
26/1/11
Bài viết
4,541
Được thích
6,979
Giới tính
Nam
Nghề nghiệp
GPE
Code này hơi lạ:
1- SelectionChange event, mà không thấy dùng Target. Như vậy là code chạy trên toàn bộ bảng tính, làm chậm tốc độ xử lý
2- "Set BILL = Sheet5"
phải là
Set BILL = Worksheets("Sheet5")
Sao không báo lỗi dòng này?
3-
temp = HangB
HangB = ActiveCell.Row

Trước đó HangB chưa có giá trị, phải set giá trị HangB trước, rồi temp mới có giá trị.
Tức là phải đảo dòng dưới lên trước.
 

VetMini

Ăn cùng góc phố
Tham gia
21/12/12
Bài viết
14,079
Được thích
18,574
Code này hơi lạ:
1- SelectionChange event, mà không thấy dùng Target. Như vậy là code chạy trên toàn bộ bảng tính, làm chậm tốc độ xử lý
...
Code chỉ cần xét ActiveCell thì cũng đâu khác Target mấy.

...
2- "Set BILL = Sheet5"
phải là
Set BILL = Worksheets("Sheet5")
Sao không báo lỗi dòng này?
...
Tại sao phải báo lỗi? Chúng ta có thấy cái file đâu mà biết Sheet5 không phải là một worksheet object?
 

bebo021999

Thành viên gạo cội
Tham gia
26/1/11
Bài viết
4,541
Được thích
6,979
Giới tính
Nam
Nghề nghiệp
GPE
Code chỉ cần xét ActiveCell thì cũng đâu khác Target mấy.
Nếu chỉ xét việc chọn trong cột A chẳng hạn, mà xét activeCell thì mọi thao tác click trên các ô ngoài cột A đều kích hoạt code thì thật vô ích.
Viết code chặt chẽ thì vẫn tốt hơn.
 

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
13,333
Được thích
17,345
Nếu chỉ xét việc chọn trong cột A chẳng hạn, mà xét activeCell thì mọi thao tác click trên các ô ngoài cột A đều kích hoạt code thì thật vô ích.
Viết code chặt chẽ thì vẫn tốt hơn.

Target chính là ActiveCell rồi.

Bảng tính của người ta khóa hết, chỉ chừa 2 cột - cột 2 và cột 6 - để chỏ chuột, nhập dữ liệu.

Code viết trên mô hình đã thiết kế hoàn toàn chính xác rồi còn gì.

1656572643107.png
 

VetMini

Ăn cùng góc phố
Tham gia
21/12/12
Bài viết
14,079
Được thích
18,574
Nếu chỉ xét việc chọn trong cột A chẳng hạn, mà xét activeCell thì mọi thao tác click trên các ô ngoài cột A đều kích hoạt code thì thật vô ích.
Viết code chặt chẽ thì vẫn tốt hơn.
Đối với SelectionChange thì ActiveCell và Target như nhau
1656579926880.png
 

bebo021999

Thành viên gạo cội
Tham gia
26/1/11
Bài viết
4,541
Được thích
6,979
Giới tính
Nam
Nghề nghiệp
GPE
Target chính là ActiveCell rồi.
Bảng tính của người ta khóa hết, chỉ chừa 2 cột - cột 2 và cột 6 - để chỏ chuột, nhập dữ liệu.
Code viết trên mô hình đã thiết kế hoàn toàn chính xác rồi còn gì.
Select Case cotB
Case Is = 6
GoTo ketthuc
Case Is = 2
temp = HangB
HangB = ActiveCell.Row
If cotB = 2 And HangB > 7 And BILL.Range("B" & temp).Value <> 0 And BILL.Range("F" & temp).Value <> 1 Then
BILL.Range("F" & temp).Value = 1
End If
End Select
Ở đây OP chỉ xét cột 2 thôi
Còn cột 6 thì exit
Vậy các cột khác: 1,3,4,5... thì sao?
Đúng ra phải là
select case
case is 2
{main code]
case else
exit sub
Hoặc ngay từ đâu:

if intersect(target, range("B:B") is nothing then exit sub

nếu chỉ xét cột 2 là gọn nhất.
 

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
13,333
Được thích
17,345
Ở đây OP chỉ xét cột 2 thôi
Còn cột 6 thì exit
Vậy các cột khác: 1,3,4,5... thì sao?
Đúng ra phải là

Hoặc ngay từ đâu:

if intersect(target, range("B:B") is nothing then exit sub

nếu chỉ xét cột 2 là gọn nhất.

Bác đã đọc kỹ hay chạy thử code của thớt chưa?

Code đó không hề
1656583143683.png
Và tốc độ y chang cách của bác (thiếu 1 dấu đóng ngoặc).

1656583178867.png

Bởi cái select case đó không có cái cần thì thoát thôi, chứ có làm gì đâu.

---
Còn khúc này:
1656583244941.png

Người ta khai báo biến toàn cục
Dim temp As Long
Dim HangB As Variant

nhằm mục đích đối chiếu anh old_activeCell.

Vậy phải sửa dòng:
temp = HangB

thành:

If temp = 0 then temp = activeCell.Row else temp = HangB


Chứ không phải đảo dòng gì cả.
 

VetMini

Ăn cùng góc phố
Tham gia
21/12/12
Bài viết
14,079
Được thích
18,574
Chuyện nào rõ ra chuyện nấy.
Cái code Select Case ấy là do thớt viết quá dở, không kiên quan đến vấn đề Target và ActiveCell.

Lý do duy nhất trong trường hợp này để nên dùng Target thay vì ActiveCell là:
- Target là biến nội. ActiveCell là biến toàn cục.
Nếu bên trong hàm gọi một hàm khác. Hàm khác ấy thay đổi ActiveCell sang một cell khác thì code có thể cho kết quả bất ngờ.
 
Web KT

Group

DIỄN ĐÀN GIẢI PHÁP EXCEL
Top Bottom