Viết hàm thay cho lệnh If? (1 người xem)

  • Thread starter Thread starter 790312
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

790312

Thành viên hoạt động
Tham gia
7/4/08
Bài viết
181
Được thích
8
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.
 

File đính kèm

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.
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
 
Upvote 0
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
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.
 
Upvote 0
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.
Bạn có thể đổi tên Linear1dH trong #2 bằng tên hàm bạn thích.
Điều kiện trong hàm không liên quan tới điều kiện nhỏ hơn 0.35 và lớn hơn 0.8
Điều kiện được viết theo ý:
1- Nếu trị dò nhỏ hơn giá trị đầu tiên thì trị dò sẽ bằng giá trị đầu tiên (trong bảng dò này là 0.35 sẽ lấy 0.35, bảng dò khác sẽ lấy gía trị khác)
2- Nếu trị dò lớn hơn giá trị cuôi cùng thì trị dò sẽ bằng giá trị cuối cùng
Hoặc bạn có thể dùng code này:
Mã:
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
 
Upvote 0
. . .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.

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!


 
Upvote 0
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!


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.
File đính kèm em đã làm theo bác phuocam chỉ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể thử nghiệm với hàm sau

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
 
Upvote 0
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? 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.
 
Upvote 0

Bạn làm về kỹ thuật mà không dám tự mình thử nghiệm ư?
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.
 

File đính kèm

Upvote 0
Mình dịch giúp bạn hiểu 2 dòng lệnh này nhé:
PHP:
If X < TB(1).Value Then X = TB(1).Value
 Col = TB.Columns.Count
 If X > TB(Col).Value Then X = TB(Col).Value
D1: Nếu Tham biến X nhỏ hơn giá trị ô đầu của bảng thì lấy giá trị ô đầu này;
D3: Nếu Tham biến lớn hơn giá trị của ô cuối dòng đầu của bảng thì lấy giá trị của ô cuối dòng này.
(D2: Lấy số lượng cột của bảng (tra) đưa vô biến Col đã khai báo)
 
Upvote 0
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
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.
 

File đính kèm

Upvote 0
Nếu sau dòng lệnh
Mã:
If X > TB(Col).Value Then X = TB(Col).Value
Bạn thêm dòng lệnh
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!
 
Upvote 0
Nếu sau dòng lệnh
Mã:
If X > TB(Col).Value Then X = TB(Col).Value
Bạn thêm dòng lệnh
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!
Đã 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ị #VALUE
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom