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!
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!
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.
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
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é...
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
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
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
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