2016-05-03 7 views
0

Kann jemand raten, warum die Excel-Trend-Funktion (in VBA) gibt kein Ergebnis, wenn mit einem Array der Variante arbeiten und warum gibt es ein falsches Ergebnis beim Arbeiten mit einem Dim arr() als Integer Art von Array?Feed Arrays in Trend-Funktion in VBA, Ergebnisse falsch

Ich versuche, zwei Arrays mit y und x Werte in die Excel-Trend-Funktion zu füttern, um einen neuen y-Wert für einen neuen x-Wert zu erhalten. Die resultierenden Werte sind jedoch falsch. Es hat etwas damit zu tun, ein variant/integer-Array in die Excel-Funktion zu übergeben.

Ich erhalte eine Matrix über SQL, die Tag Werte in einer Spalte enthält und Zahlenwerte in einer anderen Spalte (es gibt mehrere Spalten mit Zahlenwerten, aber das ist hier nicht das Problem, also habe ich nur eine Spalte mit Zahlenwerten als ein Beispiel).

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 

Ich verwende VBA, um die Werte aus der SQL-Abfrage in einem Array zu speichern. Ein Array für die Tage, ein Array für die Zahlenwerte. Die Arrays werden als "Dim Prozents() As Integer Dim Tage() As Integer" deklariert. Dies führt zu Ergebnissen, aber sie sind weit entfernt. Wenn ich die Arrays als "Dim-Werte als Variante" usw. deklariere, wird das Skript nicht ausgeführt und die folgende Fehlermeldung wird ausgegeben: "Die Trend-Eigenschaft der Worksheet-Funktionsklasse konnte nicht abgerufen werden." Der wichtigste Teil des Skripts sieht wie folgt aus ...

Hier ist ein Beispiel für die fehlerhaften Ergebnisse, die ich bekomme, wenn sie mit einem Array arbeiten, definiert als eine Integer-Array war:

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 

Das korrekte Ergebnis für das obige Beispiel wäre 67,75165. Dies wird von mir abgeleitet, indem ich einfach die gleichen Werte aus dem Array Tage und Werte in einem Excel-Tabellenblatt verwende und die Trendfunktion anwende.

EDITEDITEDIT

ich nicht Excel bin. Ich benutze ausschließlich Zugriff, um dieses Problem zu lösen, da alles andere von diesem ziemlich großen Skript im Zugriff ist und ich eine Datenbank abfrage.

Ok habe ich versucht, die Vorschläge und verändern die folgend in den beiden Do von oben Schleifen:

ReDim days(1 To intArraySize, 1 To 1) 

und

ReDim value(1 To intArraySize, 1 To 1) 

ich eine neue Dimension für das Array hinzugefügt. außerhalb des zulässigen Bereichs Fehler nicht wissen, was diese ... wie auch immer helfen sollte, jetzt bin ich ein Sub-Skript für Zeile verwendet

days(iCounter) = lrs1.Fields("FMV_" & mileage_element) 

EDIT2 I

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) 

sicher, dass ich die Werte machen bekommen retrieve via sql sind korrekt und korrekt in das Array eingefügt. Alle Eingaben sind korrekt, aber die Trendfunktion vermasselt das Ergebnis. Ich glaube, es hat etwas mit dem Datentyp der Arrays zu tun, die in die Trendfunktion eingehen. Ich glaube, wenn ich einen Variant-Datentyp verwenden würde, würde dieser Fehler nicht passieren, aber ich bekomme einen weiteren Fehler, wenn ich versuche, ein Variant-Array in die Trend-Funktion einzugeben. "Die Trend-Eigenschaft der Worksheet-Funktionsklasse konnte nicht abgerufen werden."

+1

Ich kann das nicht replizieren (obwohl ich denke, dass Ihr Ergebnis 67.75165 basierend auf diesen Werten sein sollte) - ich bekomme das gleiche Ergebnis in VBA wie in der Zelle. Welche Version von Excel verwenden Sie? – Rory

+0

Ich baue diesen Code in Access, ich bin nicht mit Excel, ich benutze nur die Excel-Funktion .. Sowohl Excel und Access sind Version 2010 – jonas778

+0

Sie haben Recht, ich verrechnet das Beispiel. Der wahre Wert sollte 67.75165 – jonas778

Antwort

0

Auf der Grundlage Ihrer Daten, fand ich die Trendlinie y sein = -0.01178x + 69,23604

Das bedeutet, dass bei 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 
+0

sein Du hast recht, ich habe das Beispiel verrechnet. Der wahre Wert sollte 67.75165 sein. Ich werde versuchen, die Arrays zu definieren. – jonas778

+0

Nachdem ich dePatinkins Antwort angeschaut habe, habe ich festgestellt, dass die Daten nicht in dem von mir vorgeschlagenen Format sein müssen. –

0

Wie bereits erwähnt , das Trend Ergebnis für mich als auch 67.75 ist und ich das gleiche Ergebnis mit integer-Arrays und Variante diejenigen bekommen.

die Sache ist, haben Sie Arrays für die ersten drei Parameter zur Verfügung zu stellen (Known_ys, Known_xs, New_xs). Das Das Ergebnis ist auch ein Variant-Array mit denselben Elementen wie das New_xs-Array (oder das Array "Known_xs").

Dies zeigt sowohl Integer und Variant-Arrays Ergebnisse geliefert:

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 

Beide Ergebnisse r und ri sind Variant-Arrays (1 bis 1), mit einem Doppelpunkt r(1) = 67.7516453919795

+0

Soweit ich weiß, die Deklaration von Dim-Wert() As Integer produziert ein Array, nicht wahr? Wenn ich die Datentyp-Variante für das Array verwende und das obige Skript verwende, um die Arrays mit Werten aus der Tabelle zu füllen, die ich über SQL abgerufen habe, bekomme ich auch einen Fehler. "Die Trend-Eigenschaft der Worksheet-Funktionsklasse konnte nicht abgerufen werden." on line fnc_FMV = Excel.Application.WorksheetFunction.Trend (Werte, Tage, Array (liAge)) (1) – jonas778

+0

Die Daten, die Sie von Ihrer Datenbank erhalten, werden wahrscheinlich nicht als Zahl interpretiert. Versuchen Sie, eine Konvertierung wie 'CInt()' in Ihren 'lrs1.Fields()' Anweisungen zu verwenden. – dePatinkin

+0

Tage (iCounter) = CInt (lrs1.Fields ("FMV_" & Element)) ist, was ich für Tage und Werte verwendet habe. Immer noch dieselben falschen Ergebnisse – jonas778

0

Also, mit einem externen Hilfe ich fand die Lösung. Die Arrays I Redim'ed waren einen Steckplatz zu groß. Ich brauchte neun Slots und dimed für 9, aber da Arrays bei 0 beginnen, hatte es tatsächlich 10 Slots. Der leere Slot wurde automatisch mit einer Null gefüllt, die später die Berechnung veränderte. Im obigen Code muss Folgendes geändert werden:

  ReDim days(intArraySize-1) 'Need to size the array 

      ReDim percentages(intArraySize-1) 'Need to size the array 

Der Minus ist die Lösung. Das dauerte zweieinhalb Tage. WTF. Danke allen!

+0

Moral der Geschichte: Geben Sie sowohl die untere als auch die obere Grenze an, wenn Sie zB "ReDim days (1 bis intArraySize)" oder "ReDim days (0 bis intArraySize - 1)" redimieren –