VBA t_test和本机excel t_test之间的结果不同

问题描述

这是我第一次尝试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

enter image description here

,

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语句,则下界为零。