2014-04-25 6 views
5

Ich versuche, Werte an Zellstandorten mit VBA nachzuschlagen, ich habe google und all over stackoverflow durchsucht, bevor ich das frage, weil ich nicht scheinen kann, es zu bekommen Arbeit.Excel, Trying Index, Match, nach Werten mit VBA suchen

Der folgende Code ist der Code, den ich verwenden möchte. Beachten Sie, dass budgetcode auf eine Zelle verweist, die einen der Codes in der ersten Spalte enthält. Mo verweist auf eine Zelle mit einer Nummer (1-12) oder einem Shortcode (Ytd, 1qtr, 2qtr, 3qtr). Beispiel ist, dass ich CAD-NS für Februar (2) ziehen möchte, und ich sollte 5666.40 bekommen.

Function eBudgetl(budgetcode As String, mo As String) 
eBudgetl = Application.WorksheetFunction.Index(Range("Budget!G1:X5000"), _ 
    Application.WorksheetFunction.Match(budgetcode, Range("Budget!B1:B5000"), 0), _ 
    Application.WorksheetFunction.Match(mo, Range("Budget!G1:X1"), 0)) 
End Function 

Hier ist ein Teil der Daten möchte ich Nachschlag:

         1 2   3  4 
CAD-NS  I Net Sales   5264.0 5666.4 5614.9 5966.6 
COSMAT  E Material   6207.5 3660.0 3661.9 3560.9 
COSDL  E Direct Labor   610.4 105.3 167.1 123.6 
CAD-MOIL E Indirect Labor  671.2 163.4 181.6 161.7 
CAD-MOSAL E Salary Overhead  601.0 106.0 101.0 101.0 

Hier ist der Code in der Zelle ist, die funktioniert, aber ich brauche in VBA zu tun. (Der Grund, warum ich in vba tun muß, ist manchmal die budgetcode enthält 2+ durch ein Komma getrennt Referenzen und ich werde vba verwenden, um sich zu trennen und jedes nachschauen unabhängig.)

=INDEX(Budget!$G$1:$X$5000,MATCH($F12,Budget!$B$1:$B$5000,0),MATCH(AN$1,Budget!$G$1:$X$1,0)) 

schätze ich Hilfe sehr, ich bin jetzt seit 3 ​​Tagen dabei.

Danke,

Enoch

+0

ich Ihr Problem denken sind die 'Typen' Ihrer Funktionsdeklaration.Probieren Sie 'Funktion eBudgetl (Budgetcode als Variante), mo als Variante) ' –

+0

Oh mein Gott! Ich kann nicht glauben, dass das funktioniert hat! Ernsthaft, Chris Neilsen, du hast gerade meinen Tag gemacht! – user3566159

+0

Als Antwort hinzugefügt, mit ein wenig Erklärung und ein paar Tipps –

Antwort

4

Das Problem ist die Function Parametertypen.

Wenn Sie Ihre Funktion aufrufen mit mo = Zelle AN1, enthält die Nummer1, der Typ Funktion wirft es auf den String"1", die im Bereich exisit doen't Budget!$G$1:$X$1, da diese auch Zahlen.

Die Lösung besteht darin, Variant als den Typ der Funktionsparameter zu verwenden.

Um das Debuggen dieser Art von Fehlern zu vereinfachen, versuchen Sie, nicht zu viel in einer einzelnen Codezeile zu tun. Wenn Sie die Zeile in 2 x Match Funktionen und eine Index aufteilen, können Sie sehen, dass die zweite Übereinstimmung einen Fehler zurückgibt.

paar andere Punkte:

  • Wenn diese Funktion als UDF fordern (dh aus einer Arbeitsblatt-Zelle genannt), ist es besser, nicht zu hart Code die Bereiche. Wie beschrieben, werden die Aufrufe an eBudgetl nicht automatisch neu berechnet, wenn sich ihre Daten ändern.
  • die Application Objekt hat eine Version von Index und Match so die WorksheetFunction Anrufe werden nicht

Überarbeitete Version, die zu belegen:

Function eBudgetl(rData As Range, rBudCode As Range, rMo As Range, budgetcode As Variant, mo As Variant) 
    Dim rw As Variant 
    Dim col As Variant 

    With Application 
     col = .Match(budgetcode, rBudCode, 0) 
     rw = .Match(mo, rMo, 0) 
     eBudgetl = .Index(rData, col, rw) 
    End With 
End Function 

Genannt als

=eBudgetl(Budget!$G$1:$X$5000,Budget!$B$1:$B$5000,Budget!$G$1:$X$1,$F12,AN$1) 
+0

Vielen Dank! Die Tipps sind großartig! – user3566159

Verwandte Themen