Tìm lỗi khi ghép Cột và dòng trong Range

Liên hệ QC

AnhThu-1976

Thành viên tích cực
Tham gia
17/10/14
Bài viết
1,016
Được thích
163
Em chào các anh chị
Em viết code để ghép cột và dòng trong range như sau
Mã:
Sub TEST()
    If i = 9 Then Range ("D" & i)
    MsgBox Range("D" & i)
End Sub
Nhờ anh chị chỉ giúp chổ sai, em cảm ơn!
 
Em chào các anh chị
Em viết code để ghép cột và dòng trong range như sau
Mã:
Sub TEST()
    If i = 9 Then Range ("D" & i)
    MsgBox Range("D" & i)
End Sub
Nhờ anh chị chỉ giúp chổ sai, em cảm ơn!
Vòng lặp For đâu mà ghép? Biến i có giá trị gì đâu làm sao code chạy?
 
Upvote 0
Sai tại câu Msgbox, dư cụm Range
Sửa lại vầy:
Msgbox "D"& i
Không phải sai tại đó. Bạn nên thử code trước khi quyết đoán.

1653315248789.png

Nếu i = 0 thì sẽ bị lỗi range sai tham số (không có range D0 cho nên không tính được)

1653315081160.png

Chính thức là thớt bị lỗi này. Range là một object, gọi trổng nó ra thì nó khỏng hiểu phải làm gì.

1653315395031.png

@Thớt: là thành viên gần 8 năm, viết gần 1000 bài, chẳng lẽ bạn không biết rằng muốn hỏi về lỗi phải cho biết lỗi baois ra sao và ở dồng nào? Bạn buộc người ta luôn đoán lỗi và đoán dòng giùm bạn thì sẽ gặp trường hợp như hôm nay.
 
Upvote 0
Em chào các anh chị
Em viết code để ghép cột và dòng trong range như sau
Mã:
Sub TEST()
    If i = 9 Then Range ("D" & i)
    MsgBox Range("D" & i)
End Sub
Nhờ anh chị chỉ giúp chổ sai, em cảm ơn!
Nhìn code thì có 2 khả năng: hoặc i không được khai báo tường minh, hoặc i là biến toàn cục - global.

Nhưng thậm chí nếu i là biến toàn cục và trước đó có i = 9 thì code cũng sai ngay ở dòng
Mã:
If i = 9 Then Range ("D" & i)
Làm gì có kiểu Then Range ("D" & i)

Hoặc phải là vd.

Then gia_tri = Range("D" & i)

hoặc

Then Range("D" & i) = gia_tri

hoặc vd.

Then ngay_mai_em_di Range("D" & i), trong đó ngay_mai_em_di là sub / function

Nhìn code là đã biết sai ở đâu.
 
Upvote 0
Lỗi "compile error". Xảy ra trước khi execute/chạy code.

Theo lô gic của IF thì lúc chạy sẽ không qua chỗ này. Nhưng compiler (trình dịch) vẫn compile, và nó không dịch nổi lệnh gọi Range trổng như vậy là cái quái gì.
Loại lỗi compile time này ngưng không cho code chạy. Điển hình là nếu trước đó có những dòng code thay đổi gì trong bảng tính thì chúng vẫn không xảy ra.

Tức là i không đóng vai trò gì trong việc lỗi ở dòng này cả.

Tuy nhiên i lả nguyên nhân của lỗi ở dỏng kế. Và lỗi này là lỗi run-time. Lúc code chạy mới nối D và i, và Range không tính được ô "D0"
Ở dòng này, lệnh là MgsBox nạp tham số là Range, compiler đưa vào thuộc tính mặc định của Range: Value. Lúc chạy, Range sẽ tính địa chỉ và đưa ra Value ở ô đó. Vì địa chỉ dỏm (D0) cho nên Range chịu thua và trả về lỗi. Loại lỗi lúc chạy code này là lỗi run-time.
Loại lỗi run-time này vẫn chạy code cho đến khi mắc lỗi. Điển hình là nếu trước đó có những dòng code thay đổi gì trong bảng tính thì chúng vẫn xảy ra.

Chỉ lô gic #IF mới chỉ định compiler thực hiện hay không nhiệm vụ compile.
 
Upvote 0
Trên cơ sở bài #1 không thể khẳng định chắc nịch là sai ở MsgBox Range("D" & i)

Tác giả không nói là đã biết sai ở đâu, không nói i là biến không khai báo tường minh hay biến toàn cục. Vì nếu là biến toàn cục và trước đó, ở sub khác có i = 9 thì không thể sai ở MsgBox Range("D" & i) được. Khả năng sai ở MsgBox Range("D" & i) là CÓ THỂ NHƯNG KHÔNG AI DÁM CHẮC. Chắc chắn sai chỉ khi i là biến cục bộ không được khai báo tường minh. Trong khi đó dòng If i = 9 Then Range ("D" & i) CHẮC CHẮN 100% SAI. Chả cần thêm thông tin gì cũng biết là SAI.
 
Upvote 0
Web KT
Back
Top Bottom