2016-08-17 3 views
1

Ich schreibe eine benutzerdefinierte Funktion in Excel VBA. Also diese neue Funktion:Berechnen des ChiSquare

  1. dauert 4 Eingangswert
  2. eine Berechnung in 8 Zahlen zu erzeugen. (2-Arrays - jedes Array hat 4 Zahlen)
  3. einen Chi-Quadrat-Test

-Code

  • return 1 Ausgangswert tun:

    Sub test() 
        Dim A, B, C, D As Variant 
        A = 33 
        B = 710 
        C = 54 
        D = 656 
    
        'Observed Value 
        Dim O_A As Variant 
        Dim O_B As Variant 
        Dim O_V As Variant 
        Dim O_D As Variant 
    
        'Define Observer Value 
        O_C_A = 'Some Calucation' 
        O_C_B = 'Some Calucation' 
        O_T_C = 'Some Calucation' 
        O_T_C = 'Some Calucation' 
    
        'Expected Value 
        Dim E_C_A As Variant 
        Dim E_C_B As Variant 
        Dim E_T_C As Variant 
        Dim E_T_D As Variant 
    
        'Define Expected Value 
        E_C_A = 'Some Calucation' 
        E_C_B = 'Some Calucation' 
        E_T_C = 'Some Calucation' 
        E_T_D = 'Some Calucation' 
    
        'Create array(2x2) 
        Dim Chi_square_result As Variant 
    
        Dim my_array(1, 1) 
        my_array(0, 0) = O_C_Mesaurement 
        my_array(0, 1) = O_C_Balance 
        my_array(1, 0) = O_T_Measurement 
        my_array(1, 1) = O_T_Balance 
    
        Dim my_array2(1, 1) 
        my_array2(0, 0) = E_C_Mesaurement 
        my_array2(0, 1) = E_C_Balance 
        my_array2(1, 0) = E_T_Measurement 
        my_array2(1, 1) = E_T_Balance 
    
        'Create a chi square test formula' 
        Dim formula(1 To 5) As String 
        formula(1) = "CHITEST(" 
        formula(2) = my_array 
        formula(3) = "," 
        formula(4) = my_array2 
        formula(5) = ")" 
    
        'Chi Square 
        Chi_square_result = evaluate(Join(formula, "")) 
    end sub 
    

    Es gibt einen Laufzeitfehler '13', Speicher Typen Nichtübereinstimmung. Dies liegt an der Verkettung der Formel.

  • +0

    In welcher Zeile erhalten Sie diesen Fehler? – Kyle

    +0

    Versuchen Sie es als 'Chi_square_result = Application.Chitest (my_array1, my_array2)' – Jeeped

    +0

    'Formel (2) = my_array1' sollte' formula (2) = my_array' sein? –

    Antwort

    0

    Die Auswertung erwartet Arbeitsblattzellenbereiche. Verwenden Sie die Excel Application object oder WorksheetFunction object, um die Funktion in VBA zu berechnen.

    Dies beweist.

    Dim dbl As Double 
    Dim my_array1(1, 1) 
    my_array1(0, 0) = 1 
    my_array1(0, 1) = 2 
    my_array1(1, 0) = 3 
    my_array1(1, 1) = 4 
    
    Dim my_array2(1, 1) 
    my_array2(0, 0) = 2 
    my_array2(0, 1) = 3 
    my_array2(1, 0) = 4 
    my_array2(1, 1) = 5 
    
    dbl = Application.ChiTest(my_array1, my_array2) 
    Debug.Print dbl 
    

    Ergebnis aus dem Direkt-Fenster des VBE: 0.257280177154182.

    +0

    Jeeped, danke. Ich benutze dies im unmittelbaren Fenster und es funktioniert. Wenn Sie die selbe Methode verwenden, haben Sie die 'Public Function chi_square_2() As Integer' und haben die 'chi_square_2 = Application.ChiTest (my_array1, my_array2)' Sie gibt 0 zurück. Ich bin nicht vertraut mit VBA, also bin ich mir nicht sicher was Ich habe falsch gemacht –

    +0

    Ich kann nicht vollständig testen, wie Sie keine Beispieldaten noch erwarteten Ergebnisse zur Verfügung gestellt haben, aber '0.257280177154182' ist keine ganze Zahl, es ist ein Doppel. – Jeeped

    +0

    oh, vergiss es. Ich hatte einen Tippfehler. Das ist superlearning etwas neues über Application-Objekt und evaluate :) danke –

    2

    Wenn Sie eine Funktion schreiben, haben Sie Ihr Format falsch.

    Function Chi_square_result(A as Long, B as Long, C as Long, D as Long) as Double 
        'All your manipulations here 
    
        Chi_square_result = (Your math equation) 
    
    End Function 
    

    Sie auch nie my_array1 definiert sind, gehe ich davon aus es sein soll, wo Du my_array 'eingegeben haben. Ich glaube auch nicht, dass Join die beste Wahl ist. Sie versuchen eine Menge Array-Manipulationen durchzuführen, und ich denke, Ihre Dimensionen bringen Sie. Es wäre besser, es geradliniger zu machen.

    +0

    Hallo SandPiper, was wäre einfacher Weg? Ich denke, das Problem, das ich habe, dreht alle meine Werte in Array, weil Chisquare Funktion nur 2 Arrays als Eingabe benötigt. –

    +0

    Ich war nicht damit vertraut, also schaute ich CHITEST() auf. Es handelt sich um eine Arbeitsblattfunktion. Daher ist Application.WorksheetFunction.ChiTest (Range1, Range2) die beste Möglichkeit, in VBA darauf zuzugreifen. Es wird eine Entfernung erwartet, und ich weiß nicht, wie ich diese Funktion mit etwas anderem als einer Entfernung umgehen kann. Das ist wahrscheinlich, warum Sie einen Fehler erhalten. – SandPiper

    +0

    Auch Ihre Zeile, in der Sie Ihre beobachteten Variablen ausblenden, hat andere Variablennamen als die definierten beobachteten Variablen direkt darunter. Dann verwenden Sie in Ihren Arrays keine dieser Variablen, sondern fügen brandneue Variablen in die Elemente ein. – SandPiper

    Verwandte Themen