Xoá dòng dữ liệu theo 2 điều kiện

Liên hệ QC

HOACOMAY2010

Thành viên mới
Tham gia
1/7/10
Bài viết
18
Được thích
0
Em muốn so sánh từng phần tử trong bảng dữ liệu với nhau và xoá những dòng có giá trị không thoả mãn 2 điều kiện cho trước, em có file kèm theo nhờ các huynh viết code giúp em.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
xoá dòng theo 2 điều kiện

Cảm ơn bác Thunghi đã xem câu hỏi của em. Cụ thể em đã viết trong file Xoa 2. Nhờ bác xem giúp em.​
 

File đính kèm

Upvote 0
Cảm ơn bác Thunghi đã xem câu hỏi của em. Cụ thể em đã viết trong file Xoa 2. Nhờ bác xem giúp em.​
Nếu so sánh điểm 1 với những điểm còn lại, từ 2 -> end
- S1-2 -> S1-end < 8

- H1-2 -> H1-end < 2
Thì xóa hết từ dòng 2 -> end.
Vậy có cần xét nữa không.
Và nếu Bi or Ci or Di = 0 hay blank thì có xét không.
Qua yêu cầu trên thì chắc chắn là điểm 1 (dòng 2) luôn kg bị xóa.
 
Upvote 0
Qua yêu cầu trên thì chắc chắn là điểm 1 (dòng 2) luôn kg bị xóa.
Cái này cũng còn tùy.
Nếu khoảng cách Si-n < 8 và Hi-n <2 thì xoá một trong 2 điểm đó
Khi so điểm 1 với điểm 2, nếu thỏa điều kiện thì có thể xóa điểm 1 hoặc điểm 2.
Tùy vào cách xóa mà sẽ có những kết quả khác nhau. Và bài toán này sẽ có rất nhiều nghiệm.
Đây là một cách nhưng sẽ có những cách khác ra kết quả khác.
PHP:
Sub Test()
Dim ArrX, ArrY, ArrH, DelRng As Range
Const StartRow = 2
With Range([A2], [A65536].End(xlUp))
    ArrX = .Offset(, 1).Value
    ArrY = .Offset(, 2).Value
    ArrH = .Offset(, 3).Value
End With
For i = UBound(ArrX) To 2 Step -1
    For j = i - 1 To 1 Step -1
        If ((ArrX(i, 1) - ArrX(j, 1)) ^ 2 + (ArrY(i, 1) - ArrY(j, 1)) ^ 2) ^ (1 / 2) >= 8 Then GoTo Next_j
        If Abs(ArrH(i, 1) - ArrH(j, 1)) >= 2 Then GoTo Next_j
        If DelRng Is Nothing Then
            Set DelRng = Cells(StartRow - 1 + i, 1)
        Else
            Set DelRng = Union(DelRng, Cells(StartRow - 1 + i, 1))
        End If
        GoTo Next_i
Next_j:
    Next
Next_i:
Next
 DelRng.EntireRow.Delete
End Sub
 

File đính kèm

Upvote 0
Cái này cũng còn tùy.

Khi so điểm 1 với điểm 2, nếu thỏa điều kiện thì có thể xóa điểm 1 hoặc điểm 2.
Tùy vào cách xóa mà sẽ có những kết quả khác nhau. Và bài toán này sẽ có rất nhiều nghiệm.
Đây là một cách nhưng sẽ có những cách khác ra kết quả khác.
Cám ơn Thắng, nhưng hình như code này chưa OK lắm.
Sau khi run test thì
- Các dòng có số TT là 8, 17, 25 ... có H < 2
- Các dòng có số TT là 21... có S < 8
Vẫn còn tồn tại.
Cám ơn nhiều.
Sorry Thắng, do chưa xem kỹ or hay and.
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Thắng, nhưng hình như code này chưa OK lắm.
Sau khi run test thì
- Các dòng có số TT là 8, 17, 25 ... có H < 2
- Các dòng có số TT là 21... có S < 8
Vẫn còn tồn tại.
Cám ơn nhiều.
Bạn xem lại điều kiện trong file của tác giả. Nếu thỏa cả 2 điều kiện H < 2 S < 8 thì mới xóa. Những trường hợp bạn nêu chỉ thỏa mãn một điều kiện.
 
Upvote 0
Cảm ơn tất cả các bác nhé. Bài toán này có nhiều nghiệm các bác ạ, vì nếu 2 dòng bất kỳ thoả mãn 2 điều kiện trên thì chọn xoá dòng nào cũng được. Thực chất các dòng dữ liệu này là toạ độ của các điểm. nếu vị trí của các điểm này nằm gần nhau thì xoá đi. các bác có cách nào hay để giải bài này giúp em với.
 
Upvote 0
Cảm ơn tất cả các bác nhé. Bài toán này có nhiều nghiệm các bác ạ, vì nếu 2 dòng bất kỳ thoả mãn 2 điều kiện trên thì chọn xoá dòng nào cũng được. Thực chất các dòng dữ liệu này là toạ độ của các điểm. nếu vị trí của các điểm này nằm gần nhau thì xoá đi. các bác có cách nào hay để giải bài này giúp em với.
Bạn đã xem bài #5 chưa?
 
Upvote 0
Em đã xem code của bác Huu_thang rùi, code chạy tốt. Bác giúp em vấn đề sau:
- Nếu em bỏ dòng tiêu đề (dòng 1 = STT, X, Y, H) đi code như thế nào?.
- Nếu một ô dữ liệu nào đó không phải là số thực (là ký tự, ...) thì code bị lỗi
 
Upvote 0
Nếu dòng 3 cũng thỏa điều kiện so với dòng 1 thì ta xóa được 2 dòng trong chúng?

Em muốn so sánh từng phần tử trong bảng dữ liệu với nhau và xoá những dòng có giá trị không thoả mãn 2 điều kiện cho trước, em có file kèm theo nhờ các huynh viết code giúp em.
STT|X|Y|H|DeltaXY|DeltaH
1|2335896.427|574269.122|12.827||
2|2335897.056|574265.843|13.095|3.3387845092975|0.268000000000001
3|2335902.062|574274.288|12.141|7.64465702285942|-0.686
4|2335904.002|574276.36|12.871|10.4770830385152|0.044


(Tại [E3] ta đang có công thức: =SQRT((B3-B$2)^2+(C3-C$2)^2)
& tại [F3] là: =D3-D$2
& công thức các ô dưới nó được chép từ 2 công thức này bằng filldown

Như vậy ta thấy 3 dòng từ 1 đến 3 ta có thể xóa hai dòng, đúng không?
Nếu là như vậy thì vấn đề sẽ trở nên fức tạp rồi. . . .

[*] Lúc đó nếu tôi xóa dòng 1 & 2 sẽ khác với việc xóa 2 & 3; & càng khác hơn nữa nếu tôi xóa 1 & 3. . . .

Rất mong các bạn thảo luận thêm về vấn đề này.

Chúc cuối tuần vui vẽ!
 
Upvote 0
Em đã xem code của bác Huu_thang rùi, code chạy tốt. Bác giúp em vấn đề sau:
- Nếu em bỏ dòng tiêu đề (dòng 1 = STT, X, Y, H) đi code như thế nào?.
- Nếu một ô dữ liệu nào đó không phải là số thực (là ký tự, ...) thì code bị lỗi
Bạn sửa lại như thế này:
PHP:
Sub Test()
Dim ArrX, ArrY, ArrH, DelRng As Range
Const StartRow = 1
With Range([A1], [A65536].End(xlUp))
    ArrX = .Offset(, 1).Value
    ArrY = .Offset(, 2).Value
    ArrH = .Offset(, 3).Value
End With
For i = UBound(ArrX) To 2 Step -1
    For j = i - 1 To 1 Step -1
        On Error GoTo Next_j:
        If ((ArrX(i, 1) - ArrX(j, 1)) ^ 2 + (ArrY(i, 1) - ArrY(j, 1)) ^ 2) ^ (1 / 2) >= 8 Then GoTo Next_j
        If Abs(ArrH(i, 1) - ArrH(j, 1)) >= 2 Then GoTo Next_j
        If DelRng Is Nothing Then
            Set DelRng = Cells(StartRow - 1 + i, 1)
        Else
            Set DelRng = Union(DelRng, Cells(StartRow - 1 + i, 1))
        End If
        GoTo Next_i
Next_j:
    Next
Next_i:
Next
 DelRng.EntireRow.Delete
End Sub
To: HYen17
Bài toán có nhiều nghiệm và tác giả chấp nhận điều đó. Bạn xem lại bài #8
 
Upvote 0
bác Huuthang_bd giúp em xử lý nốt câu hỏi 2 của bài #10. Nếu 1 ô dữ liệu nào đó không phải là số thì báo lỗi dữ liệu ô đó và thoát sub
 
Upvote 0
Web KT

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

Back
Top Bottom