Code xác định dòng cuối chạy không chính xác do đâu (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

hunglam123

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
31/3/20
Bài viết
180
Được thích
43
Chào cả nhà em có dùng đoạn code để xác định dòng cuối như sau
Lưu ý: Dữ liệu này em copy từ 1 phần mềm khác
Mã:
Sub dongucoi()
Dim i As Long, a As Long
i = Range("a22").End(xlUp).Row
a = Range("b22").End(xlUp).Row
MsgBox (a & "    " & i)
End Sub

mà rõ ràng theo hình bên dưới thì i = 6 , và a = 6 , mà tạo sao nó = 3. mong mọi người xem giúp. em cảm ơn nhiều

1586595597045.png
 

File đính kèm

Lần chỉnh sửa cuối:
Chào cả nhà em có dùng đoạn code để xác định dòng cuối như sau
Mã:
Sub dongucoi()
Dim i As Long, a As Long
i = Range("a22").End(xlUp).Row
a = Range("b22").End(xlUp).Row
MsgBox (a & "    " & i)
End Sub

mà rõ ràng theo hình bên dưới thì i = 6 , và a = 6 , mà tạo sao nó = 3. mong mọi người xem giúp. em cảm ơn nhiều
1586596076973.png
Hình như trong file của bạn từ A7-B22 nó có khoảng trắng sao ấy. Tức là không trống. nên nó mới dòng cuối là 3
 
Upvote 0
Lý do tại sao lại bắt đầu tìm từ dòng 22?
Hỏi bài thì phải trình bày hoàn cảnh cho rõ, chớ có chơi trò giấu giấu diếm diếm, chứng nào tật nấy ngựa quen đường cũ.
 
Upvote 0
Chào cả nhà em có dùng đoạn code để xác định dòng cuối như sau
Mã:
Sub dongucoi()
Dim i As Long, a As Long
i = Range("a22").End(xlUp).Row
a = Range("b22").End(xlUp).Row
MsgBox (a & "    " & i)
End Sub
mà rõ ràng theo hình bên dưới thì i = 6 , và a = 6 , mà tạo sao nó = 3. mong mọi người xem giúp. em cảm ơn nhiều
Góp ý cho bạn:
1/ Nếu dữ liệu tôi trên 22 dòng thì làm thế nào để lấy hoặc dữ liệu là bất kỳ có thể là 5000 dòng hoặc 10000 ngàn dòng thì làm sao xác định.
2/ Bạn nên hỏi thực tế hơn là làm thế nào để xác định vùng chứa dữ liệu để thực hiện việc copy hoặc lọc.
3/ Hoặc là làm thế nào để xác địng Cell trống cuối cùng để nhập liệu.

Bạn hỏi một câu chung chung chẳng ai hiểu bạn muốn làm cái gì?
 
Lần chỉnh sửa cuối:
Upvote 0
Thực ra theo định nghĩa thì không phải là END trả về dòng cuối có dữ liệu. Chỉ là trong trường hợp "bình thường" nó là vậy nên ta lợi dụng để tìm dòng cuối có dữ liệu.

Help
Returns a Range object that represents the cell at the end of the region that contains the source range. Equivalent to pressing END+UP ARROW, END+DOWN ARROW, END+LEFT ARROW, or END+RIGHT ARROW. Read-only Range object.
Nếu bạn chọn ô A22 rồi nhấn tổ hợp phím END+UP ARROW thì bạn sẽ thấy ô A3 được chọn chứ không phải là A6.

Bây giờ bạn tự nhập tay dữ liệu vào Sheet2 ở dòng và cột y như ở sheet1. Tiếp theo bạn chọn Sheet2!A22 rồi nhấn tổ hợp END+UP ARROW thì bạn có A6. Vậy ở sheet2 bạn có trường hợp "bình thường". Ở sheet1 chắc chắn đã có một số thao tác nào đấy làm nảy sinh trường hợp "không bình thường".

Bạn thử nghiệm như sau
Mã:
Sub test()
    MsgBox Sheet1.Range("A22").CurrentRegion.Address
    MsgBox Sheet2.Range("A22").CurrentRegion.Address
End Sub
Sẽ có kết quả
- $A$3:$B$22
- $A$22

Như thế 2 sheet đã có "gì đó" khác nhau.

Tóm lại code END trả về kết quả y như tổ hợp END+UP ARROW trên sheet. Nếu trên sheet1 ta chọn vd. A100 rồi nhấn tổ hợp END+UP ARROW thì ta có A22 chứ không có A3 hay A6. Và code END cũng trả về 22. Sheet1 đã hơi bị "không bình thường" rồi. Nếu chọn dòng 4-22 rồi nhấn DELETE, sau đó nhập lại dữ liệu dòng 4, 5, 6 thì có A6 cả với tổ hợp END+UP ARROW và với code END.
 
Upvote 0
Nếu trên sheet1 ta chọn vd. A100 rồi nhấn tổ hợp END+UP ARROW thì ta có A22 chứ không có A3 hay A6. Và code END cũng trả về 22. Sheet1 đã hơi bị "không bình thường" rồi.
Không chỉ không bình thường, mà là bất thường gần như là cố ý. Tôi kiểm tra bằng hàm Len thì thấy Len =0 tất cả ô từ 7 đến 22. Tôi chỉ có thể tạo ra bằng cách gán công thức ="" sau đó copy paste value vào đúng chỗ cũ.
Tôi nói cố ý là vì thông thường việc này cũng xảy ra nếu như công thức If iếc gì đó trả về chuỗi rỗng, nhưng đây là hành động copy paste value
 
Upvote 0
Không chỉ không bình thường, mà là bất thường gần như là cố ý. Tôi kiểm tra bằng hàm Len thì thấy Len =0 tất cả ô từ 7 đến 22. Tôi chỉ có thể tạo ra bằng cách gán công thức ="" sau đó copy paste value vào đúng chỗ cũ.
Tôi nói cố ý là vì thông thường việc này cũng xảy ra nếu như công thức If iếc gì đó trả về chuỗi rỗng, nhưng đây là hành động copy paste value
Đúng rồi, anh. Nếu có công thức mà trả về chuỗi rỗng thì dễ hiểu. Vì COUNTA đếm cả chuỗi rỗng do công thức trả về. Và ô chứa chuỗi rỗng vẫn là ô có dữ liệu. Đằng này công thức chả có, và ô cũng có độ lớn bằng 0. Tức ô rỗng nhưng không BLANK. Đó là trường hợp "không bình thường" - "bất thường"
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub DongCuoi()
Dim I As Long, A As Long
[A7:B22].Clear
I = Range("a22").End(xlUp).Row
A = Range("b22").End(xlUp).Row
MsgBox (A & Space(9) & I)
End Sub
 
Upvote 0
PHP:
Sub DongCuoi()
Dim I As Long, A As Long
[A7:B22].Clear
I = Range("a22").End(xlUp).Row
A = Range("b22").End(xlUp).Row
MsgBox (A & Space(9) & I)
End Sub
Êêê, ý người ta là tại sao lại thế. Chứ nếu đã biết cần phải xóa dòng 7-22 - [A7:B22].Clear, tức biết dữ liệu đến và chỉ đến dòng 6, thì code chỉ nhiêu thôi.
Mã:
Sub DongCuoi()
Dim I As Long, A As Long
I = 6
A = 6
MsgBox (A & Space(9) & I)
End Sub

Nếu là xóa để dữ liệu gốc luôn chuẩn thì: chọn A7:B22 -> nhấn Delete. Clear cũng được nhưng nếu có 5 sub đều cần xác định dòng cuối, trong khi không biết khi nào sub nào chạy trước, thì chỉ còn nước thêm Clear vào 5 sub. Xóa tay chỉ 1 lần.
 
Upvote 0
Góp ý cho bạn:
1/ Nếu dữ liệu tôi trên 22 dòng thì làm thế nào để lấy hoặc dữ liệu là bất kỳ có thể là 5000 dòng hoặc 10000 ngàn dòng thì làm sao xác định.
2/ Bạn nên hỏi thực tế hơn là làm thế nào để xác định vùng chứa dữ liệu để thực hiện việc copy hoặc lọc.
3/ Hoặc là làm thế nào để xác địng Cell trống cuối cùng để nhập liệu.

Bạn hỏi một câu chung chung chẳng ai hiểu bạn muốn làm cái gì?
Ý em không hiểu là nó bị vì sao. tại dữ liệu này em copy ra từ 1 file khác
Bài đã được tự động gộp:

Lý do tại sao lại bắt đầu tìm từ dòng 22?
Hỏi bài thì phải trình bày hoàn cảnh cho rõ, chớ có chơi trò giấu giấu diếm diếm, chứng nào tật nấy ngựa quen đường cũ.
bác nói gì em không hiểu. Ý em không hiểu là nó bị vì sao. tại dữ liệu này em copy ra từ 1 file khác
Bài đã được tự động gộp:

PHP:
Sub DongCuoi()
Dim I As Long, A As Long
[A7:B22].Clear
I = Range("a22").End(xlUp).Row
A = Range("b22").End(xlUp).Row
MsgBox (A & Space(9) & I)
End Sub
dạ cái này em copy ra từ 1 phần mềm khác ạ. ý em hỏi nó bị sao để em khắc phục
Bài đã được tự động gộp:

Thực ra theo định nghĩa thì không phải là END trả về dòng cuối có dữ liệu. Chỉ là trong trường hợp "bình thường" nó là vậy nên ta lợi dụng để tìm dòng cuối có dữ liệu.

Help

Nếu bạn chọn ô A22 rồi nhấn tổ hợp phím END+UP ARROW thì bạn sẽ thấy ô A3 được chọn chứ không phải là A6.

Bây giờ bạn tự nhập tay dữ liệu vào Sheet2 ở dòng và cột y như ở sheet1. Tiếp theo bạn chọn Sheet2!A22 rồi nhấn tổ hợp END+UP ARROW thì bạn có A6. Vậy ở sheet2 bạn có trường hợp "bình thường". Ở sheet1 chắc chắn đã có một số thao tác nào đấy làm nảy sinh trường hợp "không bình thường".

Bạn thử nghiệm như sau
Mã:
Sub test()
    MsgBox Sheet1.Range("A22").CurrentRegion.Address
    MsgBox Sheet2.Range("A22").CurrentRegion.Address
End Sub
Sẽ có kết quả
- $A$3:$B$22
- $A$22

Như thế 2 sheet đã có "gì đó" khác nhau.

Tóm lại code END trả về kết quả y như tổ hợp END+UP ARROW trên sheet. Nếu trên sheet1 ta chọn vd. A100 rồi nhấn tổ hợp END+UP ARROW thì ta có A22 chứ không có A3 hay A6. Và code END cũng trả về 22. Sheet1 đã hơi bị "không bình thường" rồi. Nếu chọn dòng 4-22 rồi nhấn DELETE, sau đó nhập lại dữ liệu dòng 4, 5, 6 thì có A6 cả với tổ hợp END+UP ARROW và với code END.
dã em cảm ơn anh. Tãi em thử em nhập thủ công thì code chạy đúng. còn cái dữ liệu này em copy từ phần mềm khác, nên em thấy nó bắt dòng cuối không đúng em mới hỏi thôi anh ạ
Bài đã được tự động gộp:

Không chỉ không bình thường, mà là bất thường gần như là cố ý. Tôi kiểm tra bằng hàm Len thì thấy Len =0 tất cả ô từ 7 đến 22. Tôi chỉ có thể tạo ra bằng cách gán công thức ="" sau đó copy paste value vào đúng chỗ cũ.
Tôi nói cố ý là vì thông thường việc này cũng xảy ra nếu như công thức If iếc gì đó trả về chuỗi rỗng, nhưng đây là hành động copy paste value
dạ em cũng thấy nó sao sao. cái này em copy từ 1 phần mềm khác qua. Em đã thử xóa dòng trống thì ok. Em không hiểu em mới hỏi thôi anh oi. chứ không cố ý để làm gì
Bài đã được tự động gộp:

Êêê, ý người ta là tại sao lại thế. Chứ nếu đã biết cần phải xóa dòng 7-22 - [A7:B22].Clear, tức biết dữ liệu đến và chỉ đến dòng 6, thì code chỉ nhiêu thôi.
Mã:
Sub DongCuoi()
Dim I As Long, A As Long
I = 6
A = 6
MsgBox (A & Space(9) & I)
End Sub

Nếu là xóa để dữ liệu gốc luôn chuẩn thì: chọn A7:B22 -> nhấn Delete. Clear cũng được nhưng nếu có 5 sub đều cần xác định dòng cuối, trong khi không biết khi nào sub nào chạy trước, thì chỉ còn nước thêm Clear vào 5 sub. Xóa tay chỉ 1 lần.
Có cách nào xóa các ô có dữ liệu trống trống không bác. tại em copy từ 1 phần khác qua file này
Bài đã được tự động gộp:

Không chỉ không bình thường, mà là bất thường gần như là cố ý. Tôi kiểm tra bằng hàm Len thì thấy Len =0 tất cả ô từ 7 đến 22. Tôi chỉ có thể tạo ra bằng cách gán công thức ="" sau đó copy paste value vào đúng chỗ cũ.
Tôi nói cố ý là vì thông thường việc này cũng xảy ra nếu như công thức If iếc gì đó trả về chuỗi rỗng, nhưng đây là hành động copy paste value
Có cách nào xóa các ô có dữ liệu trống trống không bác. tại em copy từ 1 phần khác qua file này
 
Lần chỉnh sửa cuối:
Upvote 0
Trong file của bạn dòng 7 đến 22 có ký tự đặc biệt, bạn vào Option - Advanced - Lotus compatibility - đánh dấu vào Transition navigation keys. Vào các ô dòng 7 đến 22 sẽ thấy các ký tự ' ^ hiện lên.
 
Upvote 0
Trong file của bạn dòng 7 đến 22 có ký tự đặc biệt, bạn vào Option - Advanced - Lotus compatibility - đánh dấu vào Transition navigation keys. Vào các ô dòng 7 đến 22 sẽ thấy các ký tự ' ^ hiện lên.
Tôi nghĩ đó không phải ký tự đặc biệt, vì ký tự không nhìn thấy cũng phải có chiều dài (len). Tôi dùng cả len excel lẫn len VBA đều ra kết quả 0, và tôi kết luận là chuỗi rỗng.
Bạn dùng Lotus để kiểm tra thì có vẻ không đúng với Excel hiện đại. Tôi suy luận thế này: Ký tự đặc biệt bao gồm ký tự điều khiển như xuống dòng cũng phải tạo ra được nếu biết mã ASCII của nó. Bạn cho biết mã (code, unicode) của ký tự mà bạn tìm ra?
 
Upvote 0
Ký tự đó là PrefixCharacter, nó không phải là thành phần của chuỗi nên không thể kiểm tra bằng LEN. Ví dụ khi ta nhập '1 vào ô A1 thì LEN(A1)=1. Ký tự này chỉ hiện ra khi bật Lotus lên và chọn ô.
 
Upvote 0
PHP:
Sub DongCuoi()
Dim I As Long, A As Long
[A7:B22].Clear
I = Range("a22").End(xlUp).Row
A = Range("b22").End(xlUp).Row
MsgBox (A & Space(9) & I)
End Sub
Tặng bác
Mã:
Sub covid19()
Dim i%, j%
    i = Range("b23").End(xlUp).Row
    For j = 4 To i
        If Range("B" & j).Value = "" Then Exit For
    Next j
    Range("a" & j & ":B" & i).ClearContents
End Sub
 
Upvote 0
Tặng bác
Mã:
Sub covid19()
Dim i%, j%
    i = Range("b23").End(xlUp).Row
    For j = 4 To i
        If Range("B" & j).Value = "" Then Exit For
    Next j
    Range("a" & j & ":B" & i).ClearContents
End Sub
Code viết theo kiểu nầy có ngày phải đưa file tới bệnh viện máy tính, cứu dữ liệu bị xóa nhầm
 
Upvote 0
Web KT

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

Back
Top Bottom