Hàm nội suy mình viết, 1 chiều, 2 chiều đều xài được, nếu giá trị nhập nhỏ hơn giá trị nhỏ nhất tự động lấy giá trị nhỏ nhất, lớn hơn giá trị lớn nhất thì tự lấy giá trị lớn nhất.
'Interpolation function v1.0 by TrungHieu
'Function description: =ns(row_value,column_value,array)
Function ns(x As Variant, y As Variant, z As Variant)
Dim i As Integer, j As Integer, bang(1 To 4, 1 To 4) As Variant, x2 As Integer, x4 As Integer, y2 As Integer, y4 As Integer
bang(1, 3) = x
bang(3, 1) = y
Select Case x
Case Is <= z(1, 2)
bang(1, 2) = z(1, 2)
bang(1, 4) = z(1, 2)
x2 = 2
x4 = 2
Case Is >= z(1, z.Columns.Count)
bang(1, 2) = z(1, z.Columns.Count)
bang(1, 4) = z(1, z.Columns.Count)
x2 = z.Columns.Count
x4 = z.Columns.Count
Case Else
i = 2
Do While x > z(1, i)
i = i + 1
Loop
bang(1, 2) = z(1, i - 1)
bang(1, 4) = z(1, i)
x2 = i - 1
x4 = i
End Select
Select Case y
Case Is <= z(2, 1)
bang(2, 1) = z(2, 1)
bang(4, 1) = z(2, 1)
y2 = 2
y4 = 2
Case Is >= z(z.Rows.Count, 1)
bang(2, 1) = z(z.Rows.Count, 1)
bang(4, 1) = z(z.Rows.Count, 1)
y2 = z.Rows.Count
y4 = z.Rows.Count
Case Else
j = 2
Do While y > z(j, 1)
j = j + 1
Loop
bang(2, 1) = z(j - 1, 1)
bang(4, 1) = z(j, 1)
y2 = j - 1
y4 = j
End Select
bang(2, 2) = z(y2, x2)
bang(2, 4) = z(y2, x4)
bang(4, 2) = z(y4, x2)
bang(4, 4) = z(y4, x4)
If bang(2, 2) = bang(2, 4) Then
bang(2, 3) = bang(2, 2)
Else
bang(2, 3) = (bang(2, 4) - bang(2, 2)) / (bang(1, 4) - bang(1, 2)) * (bang(1, 3) - bang(1, 2)) + bang(2, 2)
End If
If bang(4, 2) = bang(4, 4) Then
bang(4, 3) = bang(4, 2)
Else
bang(4, 3) = (bang(4, 4) - bang(4, 2)) / (bang(1, 4) - bang(1, 2)) * (bang(1, 3) - bang(1, 2)) + bang(4, 2)
End If
If bang(2, 3) = bang(4, 3) Then
bang(3, 3) = bang(2, 3)
Else
bang(3, 3) = (bang(4, 3) - bang(2, 3)) / (bang(4, 1) - bang(2, 1)) * (bang(3, 1) - bang(2, 1)) + bang(2, 3)
End If
ns = bang(3, 3)
End Function
[Nhờ sửa] giúp em sửa đoan code VBA về hàm nội suy 1,2 chiều
trong Lập trình khác
Đã đăng · Trả lời báo cáo
Hàm nội suy mình viết, 1 chiều, 2 chiều đều xài được, nếu giá trị nhập nhỏ hơn giá trị nhỏ nhất tự động lấy giá trị nhỏ nhất, lớn hơn giá trị lớn nhất thì tự lấy giá trị lớn nhất.