问题描述
这是我第一次尝试VBA。以下子例程为Sheet1上的两列数据计算t检验。
问题是此子例程返回的值与在工作表上的单元格D1中手动运行“ = T.TEST(A1:A41,B1:B96,2,3)”时得到的值不同。 (表中的数字并不重要。我已经用真实数据以及A1:A41列中的1到41和B1:B96列中的1到96进行了测试。)您能确认吗?代码中是否有错误?谢谢。
Sub dummy_ttest()
Dim rng0 As Range
Dim rng1 As Range
Set rng0 = Sheets("Sheet1").Range("A1:A41")
Set rng1 = Sheets("Sheet1").Range("B1:B96")
Dim td0() As Double
Dim td1() As Double
ReDim td0(rng0.Count) As Double
ReDim td1(rng1.Count) As Double
Dim i As Integer
Dim v As Variant
'copy rng0 to td0
i = 0
For Each v In rng0
td0(i) = v.value
i = i + 1
Next v
'copy rng1 to td1
i = 0
For Each v In rng1
td1(i) = v.value
i = i + 1
Next v
Dim myttest As Double
myttest = Application.WorksheetFunction.T_Test(td0,td1,3)
MsgBox myttest
End Sub
解决方法
使用变量数组并批量加载它们:
Sub dummy_ttest()
Dim rng0 As Range
Dim rng1 As Range
Set rng0 = Sheets("Sheet1").Range("A1:A41")
Set rng1 = Sheets("Sheet1").Range("B1:B96")
Dim td0() As Variant
Dim td1() As Variant
td0 = rng0.Value
td1 = rng1.Value
Dim myttest As Double
myttest = Application.WorksheetFunction.T_Test(td0,td1,2,3)
MsgBox myttest
End Sub
,
Scott有一个很好的答案,但添加了上下文/将我的评论转换为答案:
我能看到的一件事是您的数组比范围大一个元素
问题在于您的数组基于0,但是范围基于1。您的数组等效于
ReDim td0(0 to rng0.Count) As Double
,但范围具有1到rng0.Count
个单元格。这根本不是ReDim的问题。
范围A1:A41
有41个单元格,但是您的数组有 42 个元素; 0 to 41
表示您人数过多。因此,在当前方法中,您实际上从未填充过数组的最后一个元素,因此默认情况下它是0
。
您可以(并且应该)指定数组的下限,即
ReDim td0(0 to rng0.Count - 1) As Double '<~ 0-based
或
ReDim td0(1 to rng0.Count) As Double '<~ 1-based
来自ReDim
文档:
如果未在下面明确说明,则数组的下限由
Option Base
语句控制。如果没有Option Base
语句,则下界为零。