Một số hàm tự tạo liên quan đến kỹ thuật (6 người xem)

Liên hệ QC

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

Nội Suy

Rất cảm ơn anh vì sự chia xẻ này!
Tôi muốn dùng các hàm nội suy 1, 2 chiều của anh mỗi khi mở Excel lên thì tôi phải làm sao?
Mong anh chỉ bảo.
Nếu không phiền anh có thể gửi vào mail cho tôi được không: bktec84@yahoo.com
Thank you very much!
 
cám ơn bạn nhiều.file của bạn giúp dc mình rất nhiều.
 
Rất cảm ơn anh vì sự chia xẻ này!
Tôi muốn dùng các hàm nội suy 1, 2 chiều của anh mỗi khi mở Excel lên thì tôi phải làm sao?
Mong anh chỉ bảo.
Nếu không phiền anh có thể gửi vào mail cho tôi được không: bktec84@yahoo.com
Thank you very much!

Bạn tìm hiểu thêm phần AddIns (hoặc tìm kiếm trong diễn đàn) để các hàm này cập nhật vào trong thư viện, giống như các hàm sẵn có trong excel.
 
Tôi xin giới thiệu một số hàm đơn giản liên quan đến kỹ thuật, một số hàm đó có thể có sẵn hoặc chưa có trong Excel.
1. Hàm tính giá trị trung bình:

Mã:
Function Trungbinh(Arr) As Single
  Dim Tong As Single
  Dim i As Integer
  i = 0
  Tong = 0
  For Each Cell In Arr
    If Cell.Value > 0 Then
       Tong = Tong + Cell.Value
       i = i + 1
    Else
       i = i
    End If
  Next Cell
    Trungbinh = Tong / i
End Function
2. Hàm nội suy 1 chiều:
Ví dụ có 2 dãy số liệu A và B. Hàm Vlookup chỉ tìm kiếm những giá trị B(i) tương ứng với A(i). Còn những giá trị ở giữa thì ta phải nội suy. Ví dụ đơn giản dưới đây, để hoàn thiện thì bạn bổ sung code trong Elseif nhé:

Mã:
Function MangB(SoA, Arr1, Arr2) As Single
  Dim A1, A2, B1, B2 As Single
 
  For Each Cell In Arr1
     A1 = Cell.Offset(-1, 0)
     A2 = Cell.Offset(0, 0)
     B1 = Cell.Offset(-1, 1)
     B2 = Cell.Offset(0, 1)
 
     If Cell.Value > SoA Then
       MangB = (SoA - A1) * (B2 - B1) / (A2 - A1) + B1
       Exit For
     End If
  Next Cell
End Function


Cảm ơn anh vì chia sẻ của mình. Lần trước tôi đã hỏi ảnh về cách làm sao để có thể sử dụng công thức này cho mọi file Excel mỗi khi mở ra, nhưng nhận được câu trả lời của anh không mấy rõ ràng. Mong anh chỉ bảo tôi để chúng ta cùng tiến bộ. Cảm ơn anh!
Ah tôi đã làm như sau nhưng không sao sử dụng được mong anh giải thích dùm:
Tools/Macro/Visual Basic Editor: Insert/ Modul; Insert Procedure; sau đó viết:
Function MangB(SoA, Arr1, Arr2) As Single
Dim A1, A2, B1, B2 As Single

For Each Cell In Arr1
A1 = Cell.Offset(-1, 0)
A2 = Cell.Offset(0, 0)
B1 = Cell.Offset(-1, 1)
B2 = Cell.Offset(0, 1)

If Cell.Value > SoA Then
MangB = (SoA - A1) * (B2 - B1) / (A2 - A1) + B1
Exit For
End If
Next Cell
End Function
Nhưng không sử dụng được và nó báo nối: #NAME?
xin anh giúp tôi. Chân thành cảm ơn.
 
Bạn tìm hiểu thêm phần AddIns (hoặc tìm kiếm trong diễn đàn) để các hàm này cập nhật vào trong thư viện, giống như các hàm sẵn có trong excel.
Tôi làm theo hướng dẫn của phần AddIns nhưng vẫn không được thì làm thế nào? Anh chỉ giúp tôi với. tôi tìm trên diễn đàn cũng không thấy nói về phần này. Thank you!

Toi da dowload file zip cua anh ve nhu cho chay tren excel 2007 thi no báo #NAME là làm sao? Mong anh giải thích rùm.
Cảm ơn anh
 
Chỉnh sửa lần cuối bởi điều hành viên:
Trong vấn đề nội suy 1 và 2 chiều nếu anh (chị) nào không rành về VBA thì vẫn làm được mà không qúa khó. Giải quyết được 2 vấn đề nêu trên chỉ thông qua 1 hàm if và 1 hàm max mà thôi tuy hơi dài 1 chút nhưng rất dễ hiểu và chân phương (cách giải quyết rất nông dân). Sẵn đây tôi gợi ý luôn, đối với bảng nối suy 2 chiều: trước tiên trên sheet có bảng tra, bạn cần tạo ra một bảng mẫu mới giống như bảng cần tra đã có dữ liệu và các ô bên trong để trống. Khi một số liệu bất kỳ nằm trong khoảng kẹp của hai cột hoặc hai hàng của bảng tra thì gõ công thức tại vị trí ô trống trong bảng tra mới như sau: If(cột1(hoặc hàng1 của bảng tra)<số liệu đầu vào<cột2(hoặc hàng2 của bảng tra);"cho kết qủa nội suy bằng cách dùng công thức tam suất toán học (cái này ai cũng biết)";còn không đúng thì gán bằng =0")....tương tự cho các ô còn lại trong bảng mới. Kết qủa có được trong bảng mới sẽ có một trị số được lộ ra còn các ô khác đều bằng không. Lúc này anh chị sẽ làm một động tác nhẹ nhàng là dùng hàm max---->sẽ được kết qủa cần tìm. Lưu ý hàm if ở trên tôi chỉ diễn giải cho dễ hiểu nên không đúng qui tắc và bảng tra 2 chiều ở đây là số lớn >=0, nếu <0 thì dủng hàm min. Chúc anh chị làm thành công nhé...@#!^%@$@!^%-=09=
cach nay rat thu cong. Chỉ dành để tra 1 lần một giá trị. nếu vấn đề là cần tra một dãy giá trị trong 1 cột và cột bên là kết quả nội suy tương ứng thì cách này bó tay
 
Tôi xin giới thiệu một số hàm đơn giản liên quan đến kỹ thuật, một số hàm đó có thể có sẵn hoặc chưa có trong Excel.
1. Hàm tính giá trị trung bình:

Mã:
Function Trungbinh(Arr) As Single
  Dim Tong As Single
  Dim i As Integer
  i = 0
  Tong = 0
  For Each Cell In Arr
    If Cell.Value > 0 Then
       Tong = Tong + Cell.Value
       i = i + 1
    Else
       i = i
    End If
  Next Cell
    Trungbinh = Tong / i
End Function
2. Hàm nội suy 1 chiều:
Ví dụ có 2 dãy số liệu A và B. Hàm Vlookup chỉ tìm kiếm những giá trị B(i) tương ứng với A(i). Còn những giá trị ở giữa thì ta phải nội suy. Ví dụ đơn giản dưới đây, để hoàn thiện thì bạn bổ sung code trong Elseif nhé:

Mã:
Function MangB(SoA, Arr1, Arr2) As Single
  Dim A1, A2, B1, B2 As Single
 
  For Each Cell In Arr1
     A1 = Cell.Offset(-1, 0)
     A2 = Cell.Offset(0, 0)
     B1 = Cell.Offset(-1, 1)
     B2 = Cell.Offset(0, 1)
 
     If Cell.Value > SoA Then
       MangB = (SoA - A1) * (B2 - B1) / (A2 - A1) + B1
       Exit For
     End If
  Next Cell
End Function


mời các bạn tải file kèm theo


Bạn có thể tham khảo Đoạn Code Của Mình như sau
Mã:
Function NS(SoX, X, Y) As Double
Dim i As Integer
Dim n, cao As Integer
cao = X.Rows.Count   'So hang cua bang gia tri cho truoc
i = 1
For i = 1 To cao
If X(i) <= SoX And SoX <= X(i + 1) Then
n = i
NS = Y(n) + (SoX - X(n)) * (Y(n + 1) - Y(n)) / (X(n + 1) - X(n))
Exit For
End If
Next i
End Function
Theo cách này nội suy đúng cho những giá trị biên
 

File đính kèm

Lần chỉnh sửa cuối:
Sửa lại mã nguồn của bạn đây

5. Hàm nội suy 2 chiều: (Tiếp tục)

Tôi xin giới thiệu tiếp hàm nội suy 2 chiều do tôi lập ra, đọc dễ hiểu hơn anh PMXD nhưng hạn chế về chiều tăng hay giảm. Để hoàn thiện phải bổ sung thêm 1 số điều kiện biên nữa.

Function Noisuy2chieu(SoX, SoY, X) As Single
Dim i, j As Integer
Cao = X.Rows.Count 'Xác định số hàng
Rong = X.Columns.Count 'Xác định số cột
Dim A1, A2, B1, B2, Y1, Y2, Tim As Single 'Các điểm chặn xung quanh để tính nội suy
For i = 2 To Cao + 1
If X(i, 1) > SoX Then
n = i
For j = 2 To Rong + 1
If X(1, j) > SoY Then
m = j
B1 = X(n - 1, m)
B2 = X(n, m)
A1 = X(n - 1, m - 1)
A2 = X(n, m - 1)
Y1 = (SoY - X(1, m - 1)) * (B1 - A1) / (X(1, m) - X(1, m - 1)) + A1
Y2 = (SoY - X(1, m - 1)) * (B2 - A2) / (X(1, m) - X(1, m - 1)) + A2
Tim = (SoX - X(n - 1, 1)) * (Y2 - Y1) / (X(n, 1) - X(n - 1, 1)) + Y1
Exit For
End If
Next j
Exit For
End If
Next i
Noisuy2chieu = Tim
End Function

Bạn nào quan tâm có thể tải file kèm theo.
Mình đã viết hoàn chỉnh đây Đúng cho những giá trị ở biên.
Mã:
Function NSZ(Xo, Yo, Z) As Single
Dim i, j As Integer
        Cao = Z.Rows.Count 'Xac dinh so hang
        Rong = Z.Columns.Count 'Xac dinh so cot
    Dim A1, A2, B1, B2, Y, X As Single 'Cac diem goc va khoang delta X,Y
    For i = 2 To Cao
         If Z(i, 1) <= Xo And Xo <= Z(i + 1, 1) Then
                n = i
                    For j = 2 To Rong
                        If Z(1, j) <= Yo And Yo <= Z(1, j + 1) Then
                            m = j
                            Y = Z(1, m + 1) - Z(1, m)
                            X = Z(n + 1, 1) - Z(n, 1)
                            B1 = Z(n, m + 1)
                            B2 = Z(n + 1, m + 1)
                            A1 = Z(n, m)
                            A2 = Z(n + 1, m)
                            [COLOR=magenta]NSZ = (A1 * (Z(1, m + 1) - Yo) * (Z(n + 1, 1) - Xo) + A2 * (Xo - Z(n, 1)) * (Z(1, m + 1) - Yo) + B1 * (Yo - Z(1, m)) * (Z(n + 1, 1) - Xo) + B2 * (Xo - Z(n, 1)) * (Yo - Z(1, m))) / (X * Y)[/COLOR] 'Nho viet tren 1 dong
                        End If
                    Next j
    Exit For
        End If
    Next i
 
End Function
 
Lần chỉnh sửa cuối:
em cám ơn rất nhiều vì đã cho em có được tập tài liệu này! chúc Anh(Chị) sức khỏe và công tác tốt.
 
Web KT

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

Back
Top Bottom