Bạn cần đăng nhập để thấy hình ảnh
Tôi giúp bạn với tư cách thành viên thông thường.
Đầu tiên ta thống nhất với nhau là dữ liệu cột A,B và D,E đều bắt đầu từ dòng số 2. Vì vậy nếu kiểm tra mà từ dòng thứ 2 trở đi không có dữ liệu ở cột A hoặc cột D thì cho kết thúc.
Từ nội dung đã thảo luận trong topic này cho đến giờ: thì bạn ưu tiên vào các khoảng phía bên phải.
Bạn cần đăng nhập để thấy hình ảnh
Tức là trong trường hợp, nó rơi vào điểm đầu mút thì ưu tiên cho nó rơi vào khoảng bên tay phải. (trong ảnh trên tôi ví dụ 11.5 thì sẽ cho nó rơi vào khoảng 11.5~21.5 thay vì 6.5~11.5).
Và vì dữ liệu trên cột E đang xếp theo thứ tự tăng dần (
trường hợp bạn để dữ liệu cột E loạn xạ thì hãy báo lại), cho nên logic của nó là:
chạy từ trái sang phải nếu phát hiện ra x<a thì cho nó rơi vào khoảng đó luôn và kết thúc không xét nữa.
Ví dụ tôi có 6<6.5 thì tôi cho 6 rơi vào khoảng 0~6.5 và không xét gì nữa.
Nhưng bây giờ ta xét tình huống đặc biệt, tôi có giới hạn 33.5 là giới hạn cuối cùng. (Tương tự như dữ liệu demo bạn đưa lên 73.0 là giới hạn cuối cùng).
Bạn cần đăng nhập để thấy hình ảnh
Mong muốn của chúng ta là nó rơi vào khoảng 21.5~33.5
Nhưng khi xét bất đẳng thức x<a chạy từ trái qua phải thì 33.5<33.5 là bất đẳng thức sai. Do đó 33.5 không rơi vào khoảng 21.5~33.5 được nữa.
Nhưng phía sau 33.5 cũng không còn khoảng nào để xét nữa. Vì vậy trong trường hợp đầu mút cuối cùng rất đặc biệt này, ta phải xét đẳng thức x=a có xảy ra hay không, nếu có thì phải cho nó rơi vào khoảng cuối cùng, mà ở đây là 21.5~33.5.
Tất nhiên, xét tới mức đó rồi mà cũng không ra thì kết quả là rỗng.
Ta ví dụ:
Bạn cần đăng nhập để thấy hình ảnh
Trường hợp này thì 35 chẳng rơi vào khoảng nào được cả.
Như vậy code sẽ là:
Sub tuhocvba0930()
Dim i As Long
Dim rend As Long 'Dong cuoi cung cua cot A
Dim rend2 As Long 'Dong cuoi cung cua cot D
Dim arr As Variant 'Du lieu cot A,B
Dim brr As Variant 'Du lieu cot D,E
Const rstart As Long = 2
rend = Cells(Rows.Count, 1).End(xlUp).Row
'1-Kiem tra xem co du lieu tren cot A hay khong
If rend < rstart Then
MsgBox "Khong co du lieu tren cot A"
Exit Sub 'Ket thuc chuong trinh
End If
'Gan gia tri cot A,B cho arr
arr = Range(Cells(rstart, 1), Cells(rend, 2)).Value
rend2 = Cells(Rows.Count, 4).End(xlUp).Row
'2-Kiem tra xem co du lieu tren cot D hay khong
If rend2 < rstart Then
MsgBox "Khong co du lieu tren cot D"
Exit Sub 'Ket thuc chuong trinh
End If
'Gan gia tri cot D,E cho brr
brr = Range(Cells(rstart, 4), Cells(rend2, 5)).Value
'Mac dinh cot E da duoc sap xep theo thu tu tang dan
'3-1: Tim gia tri cho cot B
'Chay tu dong 2 toi dong cuoi cung
For i = LBound(arr, 1) To UBound(arr, 1) Step 1
arr(i, 2) = timgiatri(Val(CStr(arr(i, 1))), brr)
Next i
'3-2: Ghi ket qua:
Range(Cells(rstart, 1), Cells(rend, 2)).Value = arr
End Sub
Private Function timgiatri(ByVal x As Double, brrtem As Variant) As String
Dim j As Long
For j = LBound(brrtem, 1) To UBound(brrtem, 1) Step 1
If x < Val(CStr(brrtem(j, 2))) Then
timgiatri = CStr(brrtem(j, 1))
Exit Function
ElseIf j = UBound(brrtem, 1) Then
If x = Val(CStr(brrtem(j, 2))) Then
timgiatri = CStr(brrtem(j, 1)) 'Diem dau mut cuoi cung
End If
End If
Next j
End Function
Tóm lại, ta thống nhất với nhau những điều trên,
đặc biệt là dữ liệu cột E phải được sắp xếp theo thứ tự tăng dần, và macro bạn có thể download ở đây:
Bạn cần đăng nhập để thấy link