我在查找有关在子程序中使用Excel的VBA中的Linest的信息时遇到问题。我需要为一列x值(从第17行开始的列A)和一列y值(从第17行开始的列G)返回多项式系数(三阶或四阶)。
我目前使用的代码如下所示,并且有效。
Dim X
X = Application.Evaluate("=linest(g17:g61,A17:A61^{1,2,3})")
Cells(3, 8) = X(1)
Cells(4, 8) = X(2)
Cells(5, 8) = X(3)
Cells(6, 8) = X(4)
基本上,我需要能够使这个子程序适用于任何长度的数据。数据将始终开始在第17行中输入。为此,我一直在尝试使用类似于下面所示的代码。
Range(Cells(i, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)), Range(Cells(i, 2), Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2))
但是,当我使用与上述类似的范围而不是G17:G61
时,我会遇到类型不匹配错误。我不明白为什么一系列细胞与G17:G61
格式的一系列细胞不同。我也尝试使用简单的Range(Cells(17,1),Cells(61,1))
代替A17:A61
。
我也尝试使用"G" & 17:"G" & 61
代替G:17:G61
,因为我看到有人在浏览时做了一些事情,但这似乎也没有解决我的问题。
还有其他功能可能更好吗?
请帮忙!
答案 0 :(得分:1)
对您的问题的第一条评论会让您走上正确的轨道,Application.Evaluate
需要一个字符串(您必须构建对该字符串中范围的引用)。使用Range
和Cells
的第二种方法创建了对Range
的对象引用,如果您想使用对象引用,而不是评估字符串,则将引用传递给Application.WorksheetFunction.LinEst
}。
以下是使用原始问题中的单元格引用的示例。
Public Sub TestLinest()
Dim x
Dim i as long
Dim evalString As String
Dim sheetDisplayName As String
Dim polyOrder as string
' this is whatever the name of your sheet containing data:
sheetDisplayName = "Sheet1"
' this gets the index of the last cell in the data range
i = Range(sheetDisplayName & "!A17").End(xlDown).Row
' Obviously change this depending on how many polynomial terms you need
polyOrder = "{1,2,3}"
evalString = "=linest(" & sheetDisplayName & "!E6:E" & i & ", " & sheetDisplayName & "!D6:D" & i & "^" & polyOrder & ")"
x = Application.Evaluate(evalString)
Cells(3, 8) = x(1)
Cells(4, 8) = x(2)
Cells(5, 8) = x(3)
Cells(6, 8) = x(4)
End Sub
根据范围,工作表名称和多项式顺序,您可以看到要填写几个魔术变量。也许这个例程可以扩展为将那些作为参数传递给函数并返回一个系数数组?
此时可能值得一提的是,您可以在不使用VBA的情况下实现所有这一切,这意味着电子表格逻辑对您和/或您的用户来说更加明显。下面是一些示例函数,使您可以在工作表上执行所有这些操作,这是它的要点:
获取填充单元格的总数(假设这是在A1中)
=COUNT(A17:A10000)
以数组公式输入:
=LINEST(INDIRECT("G17:G"&(A1+16)), INDIRECT("A17:A"&(A1+16))^{1,2,3})
这个公式中的16和{1,2,3}显然可以根据您的情况进行更改。