Phần màu đỏ là phần mới thêm vào:Nhờ các bác viết giùm e hàm tự tạo thay cho công thức trong ô K16 trong file đính kèm. Chân thành cảm ơn trước.
Public Function Linear1dH(x As Double, tb As Range, cl As Long)
Dim i As Long
Dim x1, x2, q1, q2 As Double
If cl > tb.Rows.Count Then
Linear1dH = "OUT"
Exit Function
End If
[COLOR=#ff0000] If x <= tb(1, 1) Then[/COLOR]
[COLOR=#ff0000] Linear1dH = tb(cl, 1)[/COLOR]
[COLOR=#ff0000] ElseIf x >= tb(1, tb.Columns.Count) Then[/COLOR]
[COLOR=#ff0000] Linear1dH = tb(cl, tb.Columns.Count)[/COLOR]
[COLOR=#ff0000] Else[/COLOR]
' tra theo chieu ngang
i = 2
Do While (tb.Cells(1, i) < x) And (i < tb.Columns.Count)
i = i + 1
Loop
i = i - 1
' tinh gia tri cac diem
x1 = tb.Cells(1, i)
x2 = tb.Cells(1, i + 1)
q1 = tb.Cells(cl, i)
q2 = tb.Cells(cl, i + 1)
' noi suy duong ngang
Linear1dH = q1 + (x - x1) * (q2 - q1) / (x2 - x1)
[COLOR=#ff0000]End If[/COLOR]
End Function
Cảm ơn bác nhiều, bác có thể viết riêng một hàm có liên quan tới điều kiện nhỏ hơn 0.35 và lớn hơn 0.8 được không? Do hàm Linear1dH này còn sử dụng để nội suy nhiều bảng khác không có điều kiện ở trên.Phần màu đỏ là phần mới thêm vào:
Mã:Public Function Linear1dH(x As Double, tb As Range, cl As Long) Dim i As Long Dim x1, x2, q1, q2 As Double If cl > tb.Rows.Count Then Linear1dH = "OUT" Exit Function End If [COLOR=#ff0000] If x <= tb(1, 1) Then[/COLOR] [COLOR=#ff0000] Linear1dH = tb(cl, 1)[/COLOR] [COLOR=#ff0000] ElseIf x >= tb(1, tb.Columns.Count) Then[/COLOR] [COLOR=#ff0000] Linear1dH = tb(cl, tb.Columns.Count)[/COLOR] [COLOR=#ff0000] Else[/COLOR] ' tra theo chieu ngang i = 2 Do While (tb.Cells(1, i) < x) And (i < tb.Columns.Count) i = i + 1 Loop i = i - 1 ' tinh gia tri cac diem x1 = tb.Cells(1, i) x2 = tb.Cells(1, i + 1) q1 = tb.Cells(cl, i) q2 = tb.Cells(cl, i + 1) ' noi suy duong ngang Linear1dH = q1 + (x - x1) * (q2 - q1) / (x2 - x1) [COLOR=#ff0000]End If[/COLOR] End Function
Bạn có thể đổi tên Linear1dH trong #2 bằng tên hàm bạn thích.Cảm ơn bác nhiều, bác có thể viết riêng một hàm có liên quan tới điều kiện nhỏ hơn 0.35 và lớn hơn 0.8 được không? Do hàm Linear1dH này còn sử dụng để nội suy nhiều bảng khác không có điều kiện ở trên.
Public Function AAA(xx As Double, tbx As Range, clx As Long)
If xx < tbx(1, 1) Then
xx = tbx(1, 1)
ElseIf xx > tbx(1, tbx.Columns.Count) Then
xx = tbx(1, tbx.Columns.Count)
End If
AAA = Linear1dH(xx, tbx, clx)
End Function
. . .Bác có thể viết riêng một hàm có liên quan tới điều kiện nhỏ hơn 0.35 và lớn hơn 0.8 được không?
Do hàm Linear1dH này còn sử dụng để nội suy nhiều bảng khác không có điều kiện ở trên.
Bác chỉnh lại cho hoàn chỉnh giùm e với. VBA e còn gà lắm. Cảm ơn bác nhiều.Nếu hàm nội suy này còn xài nhiều ở các bảng khác thì bạn cần viết lại hàm theo hướng đã viết của bạn í; Việc này cần thiết để bẫy lỗi vô tình có thể sãy ra do cung cấp các tham biến không chuẩn;
Trong hàm bạn mới bẫy lỗi về số dòng của vùng (Range) khảo sát mà thôi; Như vậy là chưa được toàn diện cho lắm.
Bạn nhất thiết fải ra điều kiện cho tham biến X As Double của bạn nữa mới fải!
Option Explicit
Public Function Linear1dH(X As Double, TB As Range, Cl As Long)
Dim J As Long, Col As Byte
Dim X1 As Double, X2 As Double, Q1 As Double, Q2 As Double
If Cl > TB.Rows.Count Then
Linear1dH = "OUT": Exit Function
End If
If X < TB(1).Value Then X = TB(1).Value
Col = TB.Columns.Count
If X > TB(Col).Value Then X = TB(Col).Value
' Tra Theo Chièu Ngang:'
I = 2
For J = 1 To Col
If TB(1 + J).Value > X Then Exit For
Next J
'Tính Giá Tri Các Diem:'
X1 = TB.Cells(1, J)
X2 = TB.Cells(1, J + 1)
Q1 = TB.Cells(Cl, J)
Q2 = TB.Cells(Cl, J + 1)
'Noi Suy Dụng Ngang:'
Linear1dH = Q1 + (X - X1) * (Q2 - Q1) / (X2 - X1)
End Function
Chỉ dùng một hàm này hay vẫn dùng 2 hàm vậy bác? Lý do hàm nội suy này dùng cho nhiều bảng có điều kiện khác nhau. Chân thành cảm ơn bác.PHP:Option Explicit Public Function Linear1dH(X As Double, TB As Range, Cl As Long) Dim J As Long, Col As Byte Dim X1 As Double, X2 As Double, Q1 As Double, Q2 As Double If Cl > TB.Rows.Count Then Linear1dH = "OUT": Exit Function End If If X < TB(1).Value Then X = TB(1).Value Col = TB.Columns.Count If X > TB(Col).Value Then X = TB(Col).Value ' Tra Theo Chièu Ngang:' I = 2 For J = 1 To Col If TB(1 + J).Value > X Then Exit For Next J 'Tính Giá Tri Các Diem:' X1 = TB.Cells(1, J) X2 = TB.Cells(1, J + 1) Q1 = TB.Cells(Cl, J) Q2 = TB.Cells(Cl, J + 1) 'Noi Suy Dụng Ngang:' Linear1dH = Q1 + (X - X1) * (Q2 - Q1) / (X2 - X1) End Function
Chỉ dùng một hàm này hay vẫn dùng 2 hàm vậy bác? Chân thành cảm ơn bác.
Em hỏi vậy do hàm nội suy này nó phụ thuộc vào nhiều bảng, chẳng hạn như bảng này thì nếu <0.35 thì bằng giá trị của 0.35 và lớn hơn 0.8 thì bằng giá trị của 0.8. Nhưng nếu nội suy cho bảng khác thì nó có thể khác, thí dụ như điều kiện nhỏ hơn giá trị cell đầu thì =0 và lớn hơn giá trị cell cuối thì bằng 0.4 chẳng hạn thì không còn sử dụng được hàm này. Bởi vậy ngay từ đầu e muốn dùng thêm hàm khác để thêm điều kiện. Chân thành cảm ơn bác lần nữa.
Bạn làm về kỹ thuật mà không dám tự mình thử nghiệm ư?
If X < TB(1).Value Then X = TB(1).Value
Col = TB.Columns.Count
If X > TB(Col).Value Then X = TB(Col).Value
Sau khi sử dụng hàm này của bác nó có lỗi, bảng đầu thì ok nhưng bảng 2 bị lỗi bác ah, bác bớt chút thời gian xem file đính kèm của e bên dưới giúp e nhé. Chân thành cảm ơn bác nhiều.PHP:Option Explicit Public Function Linear1dH(X As Double, TB As Range, Cl As Long) Dim J As Long, Col As Byte Dim X1 As Double, X2 As Double, Q1 As Double, Q2 As Double If Cl > TB.Rows.Count Then Linear1dH = "OUT": Exit Function End If If X < TB(1).Value Then X = TB(1).Value Col = TB.Columns.Count If X > TB(Col).Value Then X = TB(Col).Value ' Tra Theo Chièu Ngang:' I = 2 For J = 1 To Col If TB(1 + J).Value > X Then Exit For Next J 'Tính Giá Tri Các Diem:' X1 = TB.Cells(1, J) X2 = TB.Cells(1, J + 1) Q1 = TB.Cells(Cl, J) Q2 = TB.Cells(Cl, J + 1) 'Noi Suy Dụng Ngang:' Linear1dH = Q1 + (X - X1) * (Q2 - Q1) / (X2 - X1) End Function
If X > TB(Col).Value Then X = TB(Col).Value
MsgBox X
Đã sửa theo hướng dẫn của bác nhưng những giá trị lớn hơn hoặc bằng 120 thì hiện giá trị #VALUENếu sau dòng lệnh
Bạn thêm dòng lệnhMã:If X > TB(Col).Value Then X = TB(Col).Value
PHP:MsgBox X
Ta vẫn nhận được giá trị tham biến X vẫn đúng theo iêu cầu của bạn.
Thú thật fía sau dòng lệnh này mình chưa rõ lắm!