HOACOMAY2010
Thành viên mới
- Tham gia
- 1/7/10
- Bài viết
- 18
- Được thích
- 0
Hơi khó hiểu với yêu cầuEm 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.
Cụ thể hơn nữa n?Nếu khoảng cách Si-n < 8 và Hi-n <2 thì xoá một trong 2 điểm đó
Nếu so sánh điểm 1 với những điểm còn lại, từ 2 -> endCả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.
Cái này cũng còn tùy.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.
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.Nếu khoảng cách Si-n < 8 và Hi-n <2 thì xoá một trong 2 điểm đó
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
Cám ơn Thắng, nhưng hình như code này chưa OK lắm.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.
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 và 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.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 bài #5 chưa?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.
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.
Bạn sửa lại như thế này: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
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