2016-02-21 1 views
0

J'ai deux rangées de données, la pression de rupture et la profondeur. Je dois coder dans vba pour générer l'équation polynomiale (quadratique dans ce cas), puis afficher les coefficients dans la feuille de calcul. J'utilise Linest et Index. Pour ces deux lignes de données, je ne sais pas combien de jeux de données j'ai parce que j'ai besoin de supprimer d'abord des données bruitées (la définition des données bruitées est aléatoire donc le nombre de jeux de données varie à chaque fois). quelque chose comme "A17: A80" dans la fonction la plus linéaire. Cependant, il semble que la fonction de feuille de calcul dans vba ne peut pas fonctionner pour les tableaux.vba utiliser linest pour calculer les coefficients polynomiaux et l'indice à la sortie

Dim Frac_x, Frac_y As Range 
Dim X 
     Set Frac_x = Range(Cells(17, 1), Cells(e - 1, 1)) 
     Set Frac_y = Range(Cells(17, 7), Cells(e - 1, 7)) 
     X= Application.WorksheetFunction.LinEst(Frac_y,Frac_x,{1,2}) 
     Cells(3, 8).Value = Application.WorksheetFunction.Index(X, 1, 1) 
     Cells(4, 8).Value = Application.WorksheetFunction.Index(X, 1, 2) 
     Cells(5, 8).Value = Application.WorksheetFunction.Index(X, 1, 3) 

Dans ce code, e est défini dans le code précédent, (e-1) représente le nombre total de jeux de données. Cependant, je continue à obtenir { is a invalid character pour la ligne: X= Application.WorksheetFunction.LinEst(Frac_y,Frac_x,{1,2}) Je l'ai fait quelques recherches et a modifié le code:

Dim Frac_x, Frac_y As Range 
Dim X 
     Set Frac_x = Range(Cells(17, 1), Cells(e - 1, 1)) 
     Set Frac_y = Range(Cells(17, 7), Cells(e - 1, 7)) 
     X = Application.Evaluate("=linest(" & Frac_y & "," & Frac_x & "^ {1,2}))") 
     Cells(3, 8).Value = Application.WorksheetFunction.Index(X, 1, 1) 
     Cells(4, 8).Value = Application.WorksheetFunction.Index(X, 1, 2) 
     Cells(5, 8).Value = Application.WorksheetFunction.Index(X, 1, 3) 

Je continue à obtenir l'erreur Type Dismatch pour la ligne: X = Application.Evaluate("=linest(" & Frac_y & "," & Frac_x & "^ {1,2}))") Je suis sûr que les deux gammes frac_y et frac_x leurs correspondances de type. Quelqu'un pourrait-il aider?

+0

Qu'est-ce que '{1,2}' pour exactement? Essayez ceci: 'X = Application.LinEst (Frac_y, Frac_x, array ({1,2}))' –

+0

Essayez de changer Dim Frac_x, Frac_y As Range à Dim Frac_x comme range, Frac_y As Range comme premier sera assombrit Frac_x as une variante plutôt qu'une gamme. –

Répondre

0

Vous avez raison, ce Excel VBA ne peut pas faire des choses comme arrVariable^{1,2}. Cela doit être fait avec des boucles sur les éléments du tableau. L'approche Evaluate devrait fonctionner. Mais votre chaîne de formule n'est pas correcte. Pour détecter et éviter une telle erreur, je vais concaténer ces chaînes de formule au sein d'une variable String en premier. Ensuite, je peux simplement vérifier la valeur de la variable.

exemple, les valeurs sont en A17:A26 et G17:G26:

Sub test() 

Dim Frac_x As Range, Frac_y As Range 
Dim X 

e = 27 

With ActiveSheet 

    Set Frac_x = .Range(.Cells(17, 1), .Cells(e - 1, 1)) 
    Set Frac_y = .Range(.Cells(17, 7), .Cells(e - 1, 7)) 
    arrX = Frac_x 
    ReDim arrX2(1 To UBound(arrX), 1 To 2) As Double 
    For i = LBound(arrX) To UBound(arrX) 
    arrX2(i, 1) = arrX(i, 1) 
    arrX2(i, 2) = arrX(i, 1) * arrX(i, 1) 
    Next 

    X = Application.LinEst(Frac_y, arrX2) 

    'sFormula = "=LINEST(" & Frac_y.Address & "," & Frac_x.Address & "^{1,2})" 
    'X = Application.Evaluate(sFormula) 

    .Range(.Cells(3, 8), .Cells(5, 8)).Value = Application.Transpose(X) 

End With 

End Sub 

Conseils: utilisation Application.LinEst au lieu de Application.WorksheetFunction.LinEst. Ce dernier lancera une erreur si la fonction ne peut pas fonctionner alors que la première retournera une valeur d'erreur à la place. Donc le premier n'interrompra pas le programme comme ce dernier le fera.

+0

Merci, le code fonctionne –