【发布时间】:2019-06-28 16:46:08
【问题描述】:
我正在 VBA 中创建一个线性插值函数。这是它的样子:
Function INTERP(X0 As Variant, ByVal X As Range, ByVal Y As Range) As Variant
Dim i As Long
Dim N As Long
Dim X1 As Double
Dim X2 As Double
Dim Y1 As Double
Dim Y2 As Double
N = X.Rows.Count
If X0 <= Application.Min(X) Then
X2 = X.Cells(2, 1)
Y2 = Y.Cells(2, 1)
X1 = X.Cells(1, 1)
Y1 = Y.Cells(1, 1)
ElseIf X0 >= Application.Max(X) Then
X2 = X.Cells(N, 1)
Y2 = Y.Cells(N, 1)
X1 = X.Cells(N - 1, 1)
Y1 = Y.Cells(N - 1, 1)
Else
For i = 1 To N - 1
If X0 >= X.Cells(1, 1) And X0 < X.Cells(i + 1, 1) Then
X2 = X.Cells(i + 1, 1)
Y2 = Y.Cells(i + 1, 1)
X1 = X.Cells(i, 1)
Y1 = Y.Cells(i, 1)
Exit For
End If
Next i
End If
INTERP = Y1 + (Y2 - Y1) / (X2 - X1) * (X0 - X1)
End Function
为了执行插值,X 范围应按升序排序。我见过的与 Excel VBA 中的排序相关的大多数其他答案都涉及进行某种排序,该排序返回并对工作表中的数据进行排序。
在这种情况下我根本不想更改工作表中的数据,但我需要按升序对X 进行排序,然后根据X 将Y 排序为维护他们之间的关系。如何使用 VBA 做到这一点?
【问题讨论】:
-
将其加载到一个数组中,然后使用任意排序算法(如快速排序、冒泡排序等)对其进行排序。
-
@Rory 我看到 Ranges 已经实现了一个用于排序的
Range.sort方法。 VBA中是否有排序功能?我似乎只能找到实现排序方法的代码。我可以将其包含在我的项目中,但必须重新实现这些似乎令人头疼。 -
不,你必须自己写,或者只是将数据复制到另一个范围,对其进行排序,然后将其加载回来。
标签: excel vba sorting linear-interpolation