首页 > 解决方案 > VBA函数中的排序范围而不影响工作表中的数据

问题描述

我正在 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按升序排序,然后Y根据排序X来保留它们之间的关系。我怎样才能用 VBA 做到这一点?

标签: excelvbasortinglinear-interpolation

解决方案


保存XY作为表格(它甚至可以是没有格式的表格)。然后只需对表格进行排序,表格的其余部分将保持不变。


推荐阅读