任何人都可以建议为什么excel趋势函数(在VBA中)在使用类型变体数组时没有给出结果,以及为什么在使用时它会给出错误的结果Dim arr()as Integer 类型的数组?
我尝试将带有y和x值的两个数组提供给Excel趋势函数,以获得新x值的新y值。但是,结果值是错误的。它与将变量/整数数组传递给excel函数有关。
我通过sql检索一个矩阵,它在一列中保存日值,在另一列中保存数值(有多个列有数字值,但这不是问题,所以我只使用一列数值作为示例)。
FMV_Day FMV_10000
365 65
548 63
730 61
913 59
1095 57
1278 55
1460 53
1643 51
1825 49
365 65
548 63
我使用VBA将sql查询中的值存储在一个数组中。这一天是一个数组,一个是数字值的数组。数组声明为" Dim percentages()As Integer Dim days()As Integer"。这会产生结果,但它们已经过时了。当我将数组声明为" Dim值As Variant"等脚本不会运行并导致错误消息: "无法获得Worksheet函数类的Trend属性。"该脚本的关键部分如下所示......
For Each element In columns
If element = "Day" Then
If Not lrs1.EOF Then
lrs1.MoveFirst 'Ensure we begin on the first row
iCounter = 0
ReDim days(intArraySize) 'Need to size the array
Do Until lrs1.EOF
days(iCounter) = lrs1.Fields("FMV_" & mileage_element)
'Debug.Print "Item: "; iCounter & " " & days(iCounter)
iCounter = iCounter + 1
lrs1.MoveNext
Loop
End If
lrs1.MoveFirst
ElseIf element = element_given Then
If Not lrs1.EOF Then
lrs1.MoveFirst 'Ensure we begin on the first row
iCounter = 0
ReDim values(intArraySize) 'Need to size the array
Do Until lrs1.EOF
values(iCounter) = lrs1.Fields("FMV_" & element)
'Debug.Print "Item: "; iCounter & " " & values(iCounter)
iCounter = iCounter + 1
lrs1.MoveNext
Loop
End If
End If
Next element
fnc_FMV = Excel.Application.WorksheetFunction.Trend(values, days, Array(liAge))(1)
以下是使用定义为Integer数组的数组时得到的错误结果的一个示例:
Days-Array: 365, 548, 730, 913, 1095, 1278, 1460, 1643, 1825
Values-Array: 65, 63, 61, 58, 56, 54, 52, 50, 48
Age 126
Result from Trend_fnc 41.7662243865297
上述示例的正确结果将为 67.75165 。这是我通过简单地使用Excel电子表格中的days和values数组中的相同值并应用趋势函数而得出的。
EDITEDITEDIT
我没有使用Excel。我只使用访问来解决这个问题,因为这个相当大的脚本的其他所有内容都在访问中,我正在查询数据库。
好的,我尝试了你的建议,并在上面的两个Do循环中更改了以下内容:
ReDim days(1 To intArraySize, 1 To 1)
和
ReDim value(1 To intArraySize, 1 To 1)
我为数组添加了另一个维度。不知道这应该有什么帮助...无论如何,现在我得到一个超出范围错误的子脚本
days(iCounter) = lrs1.Fields("FMV_" & mileage_element)
EDIT2 我用了
Debug.Print days(0) & ", " & days(1) & ", " & days(2) & ", " & days(3) & ", " & days(4) & ", " & days(5) & ", " & days(6) & ", " & days(7) & ", " & days(8)
Debug.Print values(0) & ", " & values(1) & ", " & values(2) & ", " & values(3) & ", " & values(4) & ", " & values(5) & ", " & values(6) & ", " & values(7) & ", " & values(8)
确保通过sql检索的值是正确的并正确放入数组中。所有输入都是正确的,但趋势函数会影响结果。我相信它与进入趋势函数的数组的数据类型有关。我相信,如果我使用Variant数据类型,则不会发生此错误,但当我尝试在趋势函数中输入Variant数组时,我会收到另一个错误。 "无法获得Worksheet函数类的Trend属性。"
答案 0 :(得分:1)
所以,在一些外部帮助下,我找到了解决方案。 我Redim的阵列是一个太大的插槽。我需要9个插槽,并且需要9个调暗,但由于数组从0开始,它实际上有10个插槽。空槽自动填充零,随后改变计算。在上面的代码中,需要更改以下内容:
ReDim days(intArraySize-1) 'Need to size the array
ReDim percentages(intArraySize-1) 'Need to size the array
减号是解决方案。 这花了我两天半的时间。 WTF。 谢谢大家!
答案 1 :(得分:0)
根据您的数据,我发现趋势线为y = -0.01178x + 69.23604
这意味着在x = 126时,y = 67.75164 ......
Option Explicit
Sub TrendAnalysis()
Dim vDays As Variant
Dim vValues As Variant
Dim newX As Variant
newX = Array(126)
vDays = Array(365, 548, 730, 913, 1095, 1278, 1460, 1643, 1825)
vValues = Array(65, 63, 61, 58, 56, 54, 52, 50, 48)
Dim Test As Variant
Test = WorksheetFunction.Trend(vValues, vDays, newX, True)
End Sub
答案 2 :(得分:0)
如上所述,我的Trend
结果也是 67.75 ,并且我得到了整数数组和变量数组相同的结果。
问题是,您必须为前三个参数(Known_ys,Known_xs,New_xs)提供数组。结果也是一个Variant数组,其项目数与New_xs数组相同(或者如果没有提供Known_xs数组)。
这显示了Integer和Variant提供的数组结果:
Sub useTrend()
Dim x As Variant
Dim y As Variant
Dim r As Variant
Dim xi(8) As Integer
Dim yi(8) As Integer
Dim ri As Variant
Dim i As Integer
x = Array(365, 548, 730, 913, 1095, 1278, 1460, 1643, 1825)
For i = 0 To UBound(x)
xi(i) = x(i)
Next
y = Array(65, 63, 61, 58, 56, 54, 52, 50, 48)
For i = 0 To UBound(y)
yi(i) = y(i)
Next
r = WorksheetFunction.Trend(y, x, Array(126))
ri = WorksheetFunction.Trend(yi, xi, Array(126))
End Sub
结果r
和ri
都是(1到1)的变体数组,其中包含双项r(1) = 67.7516453919795