Bạn nói xem, bạn nhập trị nào & vô ô nào mà nó báo lỗi?
/-)úng là bạn kém trong vấn đề cụ thể hoá vấn đề. Nói suông thế thì giải quyết được vấn đề gì, hử bạn!?
Option Explicit
Function TraBang(Num)
Dim Cent As Long, Mil As Long, Rws As Long, Offs As Byte
Dim Sh As Worksheet, Rng As Range, sRng As Range
Cent = Num \ 10: Mil = Num Mod 10
Set Sh = ThisWorkbook.Worksheets("Barem")
Rws = Sh.[A9999].End(xlUp).Row
Set Rng = Union(Sh.[A4].Resize(Rws), Sh.[c4].Resize(Rws), Sh.[e4].Resize(Rws), Sh.[g4].Resize(Rws))
Set sRng = Rng.Find(Cent, , xlValues, xlWhole)
If Not sRng Is Nothing Then
TraBang = sRng.Offset(, 1).Value
Else
TraBang = "Nothing"
End If
If Mil = 0 Then Exit Function
Set Sh = ThisWorkbook.Worksheets("FanLe")
Offs = Switch(Num <= 1537, 3, Num <= 3037, 7, Num > 3037, 11)
TraBang = TraBang + Application.WorksheetFunction.VLookup(Mil, Sh.Cells(7, Offs).Resize(10, 2), 2, False)
End Function
Sub GPE()
End Sub
Xin hỏi lại bạn.
(1) Trường hợp các giá tị trong bảng còn trải dài và (2) sheet "Fanle" còn nhiều khoảng giá trị ở dưới thì hàm của bạn có cần thay đổi gì không? (mình gửi lại file đính kèm).
(3) Và bạn giúp mình lập hàm để tính tương tự như trên nhưng trong trường hợp không có sheet "Fanle" mà phải nội suy giữa 2 giá trị liên tiếp.
Và đây cg là lần đầu tiên mình động đến cái gọi là marco nên rất nhiều cái thấy lạ lẫm, hôm qua cg ngồi ngâm cứu hàm của bạn cg hiểu sơ sơ đc chút xíu. và còn vài cái thắc mắC mong bạn chỉ giúp.
(4) Nhờ bạn chỉ giúp mình ý nghĩa của một vài con số trong hàm:
Offs = Switch(Num <= 1537, 3, Num <= 3037, 7, Num > 3037, 11)
TraBang = TraBang + Application.WorksheetFunction.VLookup(Mil, Sh.Cells(7, Offs).Resize(10, 2), 2, False)
Set Rng = Union(Sh.[A4].Resize(Rws), Sh.[c4].Resize(Rws), Sh.[e4].Resize(Rws), Sh.[g4].Resize(Rws)) --> cái này có phải là các cột của chiều cao H trong sheet bazem ko?
Mình muốn hỏi để gặp trường hợp khác có thể tự làm đc mà ko phải làm fphiền các bạn.
(1)
Trang Fanle mình ko muốn sắp xếp lại vì nó là cấu trúc để in ra sách tra bazem.
(2)
Mình chỉ muốn lấy giá trị sau dấu phẩy là 3 số thì hàm sẽ ntn bạn nhỉ, ví dụ: bazem có giá trị là: 234.5672, phần lẻ là 0.3454 thì kết quả mong muốn
là 234.567 + .345 = 234.912 chứ ko phải là 234.5672 + 0.3454 = 234.9126 =>> 234.913
Set Sh = ThisWorkbook.Worksheets("FanLe")
[COLOR=#FF0000] [B]If Num < 4537 Then Dg = 7 Else Dg = 18[/B][/COLOR] [COLOR=#0000CD]theo mình hiểu thì dòng này chỉ đúng trong trường hợp có 2 dãy khoảng[/COLOR]
Offs = Switch(Num <= 1537, 3, Num <= 3037, Dg, Num < 4537, 11 _
[COLOR=#FF0000], Num <= 6037, 3, Num <= 7537, 7, Num > 7537, 11)[/COLOR] [COLOR=#0000CD]giả sử các giá trị khoảng tiếp theo là
(bất đầu từ dòng 29) 9037, 1237, 1337 và (bất đầu từ dòng 40) 1537, 1737, 1937 thì dòng này nên ntn cho đúng[/COLOR]
TraBang = TraBang + BaSoLe(WF.VLookup(Mil, Sh.Cells(Dg, Offs).Resize(10, 2), 2, False))
Trong trường hợp 'FanLe' có nhiều khoảng ở phía dưới hơn nữa thì câu lệnh sau viết ntn thì đc bạn nhỉ
Mã:Set Sh = ThisWorkbook.Worksheets("FanLe") [COLOR=#FF0000] [B]If Num < 4537 Then Dg = 7 Else Dg = 18[/B][/COLOR] [COLOR=#0000CD]theo mình hiểu thì dòng này chỉ đúng trong trường hợp có 2 dãy khoảng[/COLOR] Offs = Switch(Num <= 1537, 3, Num <= 3037, Dg, Num < 4537, 11 _ [COLOR=#FF0000], Num <= 6037, 3, Num <= 7537, 7, Num > 7537, 11)[/COLOR] [COLOR=#0000CD]giả sử các giá trị khoảng tiếp theo là (bất đầu từ dòng 29) 9037, 1237, 1337 và (bất đầu từ dòng 40) 1537, 1737, 1937 thì dòng này nên ntn cho đúng[/COLOR] TraBang = TraBang + BaSoLe(WF.VLookup(Mil, Sh.Cells(Dg, Offs).Resize(10, 2), 2, False))
Select Case Num
Case < 4537: Dg = 7
Case <7537: Dg = 18
' . . . . .'
End Select