Nhờ lập hàm để tra bazem nhiều hàng, nhiều cột của bể chứa.

Liên hệ QC

ohlexus

Thành viên mới
Tham gia
13/3/12
Bài viết
27
Được thích
6
Mình có 1 dữ liệu gồm chiều cao H và thể tích V (nhiều hàng vs cột).
Giờ mình muốn lập một hàm để tra tự động: khi nhập vào chiều cao nó sẽ cho kết quả thể tích.
Nhờ các bạn giúp đỡ.
Mình gửi file đính kém
 

File đính kèm

  • Tao bazem tra bang.xls
    31.5 KB · Đọc: 14
Bạn xem trong file kèm theo

& kiểm tra lại các kết quả xem sao, nha.
 

File đính kèm

  • gpeUDF.rar
    15 KB · Đọc: 18
Lần chỉnh sửa cuối:
Khi mình nhập 1 giá trị khác vao ô Chiều cao thì bên ô Thể tích lỗi bạn ak.
ý mình là làm sao để nhập giá trị bất kỳ ở ô chiều cao thì đều cho kq V ở ô thể tích
Mình hơi kém món này :D

P/S: mình biết vì sao rùi, thank bạn nhìu
 
Lần chỉnh sửa cuối:
/(/ếu bạn nhập ngoài trị bên trang 'Barem', sẽ báo lỗi là tất nhiên!

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!?
 
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!?

Mình bít mình sai j rùi. do macro j đó, vừa enable và đc rùi.
 
Xin lỗi bạn SA-DQ vì hôm qua đã ko đưa đầy đủ thông tin nên hôm nay phải hỏi lại bạn.
Trường hợp các giá tị trong bảng còn trải dài và 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).
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.
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
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.
Mã:
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

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.
 

File đính kèm

  • BaremSA-DQ.xls
    53.5 KB · Đọc: 8
Lần chỉnh sửa cuối:
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) Nếu các bảng trên 'Barem' còn dài fía dưới, thì cột 'A' của trang này thuộc loại dài nhất là được (Dòng tối đa sử dụng trùng với dòng lớn nhất tại 'A')

(2) Tại 'FanLe' bạn nên sắp tăng dữ liệu về fía fải, (theo cột) (Xem thêm (4));

(3) Bạn nên tìm các bài về nội suy có trên diễn đàn, sau đó ta thảo luận tiếp;

(4) Các số trong Offs = Switch(Num <= 1537, 3, Num <= 3037, 7, Num > 3037, 11): Là chỉ số cột tại trang 'FanLe';
Hàm SWITCH() giống na ná như IF() nối nhiều lại với nhau;

TraBang = TraBang + Application.WorksheetFunction.VLookup(Mil, Sh.Cells(7, Offs).Resize(10, 2), 2, False)
Số 7 chỉ ra dòng 7 của trang tính đang gán vô biến Sh; Offs là chỉ số cột (xem trên);
Số 10 & 2 - Cái này bạn fải biết fương thức Resize() mới hiểu được (Tìm trên diễn đàn theo từ khoá này)
Số 2 cuối tô đậm là tham số thứ 3 trong hàm VLOOKUP() đó bạn!
 
thank bạn nhiều, mình đang ngâm cứu tiếp có gì ko hiểu mình sẽ nhờ các bạn chỉ giúp.

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.

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
 
Lần chỉnh sửa cuối:
Thoả luôn 2 iêu cầu của bạn nè, mại zô!

(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

Xem file nha ===>>===>>===>>+-+-+-+
 

File đính kèm

  • gpeUDF.rar
    16.2 KB · Đọc: 6
Cám ơn bạn Chanh nhiều, đúng như mình ,mong muốn rồi,

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))
 
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))

Với biến Num, lúc đó ta chuyển sang xài Select Case tiện hơn
Mã:
 Select Case Num
Case  < 4537:          Dg = 7
Case <7537:            Dg = 18
' . . . . .'
End Select

Còn với hàm SWITCH() thì bạn cứ việc nối dài thêm mút chỉ 100 tham biến có hơn cũng OK (Có lần rỗi mình đã thử với 120 tham biến rồi!)
 
có phải là thay dòng

If Num < 4537 Then Dg = 7 Else Dg = 18
thành:

Select Case Num
Case < 4537: Dg = 7
Case <7537: Dg = 18
Case <1337: Dg= 29
End Select



đúng không bạn
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom