2014-04-25 11 views
5

sto cercando di ricercare i valori in punti delle celle utilizzando google VBA, ho cercato e tutto StackOverflow prima di chiedere questo perché io non riesco a farlo lavoro.Excel, Cercando Index, Partita, di ricercare i valori con VBA

Il seguente è il codice che sto tentando di utilizzare, notare che il codice di budget fa riferimento a una cella contenente uno dei codici nella prima colonna e fa riferimento a una cella che contiene un numero (1-12) o contiene un codice breve (ytd, 1qtr, 2qtr, 3qtr). Esempio è che voglio tirare CAD-NS per (2) febbraio e mi dovrebbe ottenere 5.666,40.

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 

Ecco una parte dei dati desidero occhiata:

         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 

ecco il codice nella cella che funziona, ma ho bisogno di fare in VBA. (Il motivo per cui ho bisogno di fare in VBA è a volte il budgetcode conterrà 2+ riferimenti separati da una virgola e ho intenzione di utilizzare VBA per separarli e guardarsi in modo indipendente.)

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

Apprezzo tutto l'aiuto molto, sono stato a questo per 3 giorni ora.

Grazie,

Enoch

+0

Credo che il problema è il 'Tipi' della dichiarazione della funzione.Prova 'Funzione eBudgetl (budgetcode As Variant), mo As Variant) ' –

+0

Oh mio Dio! Non posso credere che abbia funzionato! Davvero, Chris Neilsen, hai appena fatto la mia giornata! – user3566159

+0

Aggiunto come risposta, con un po 'di spiegazione e alcuni suggerimenti –

risposta

4

Il problema è i tipi di parametri Function.

Quando si chiama la funzione con mo = cellule AN1, che contiene il numero di 1, il tipo di funzione getta al String"1", che doen't exisit nella gamma Budget!$G$1:$X$1, dal momento che questi sono anche i numeri .

La soluzione è quella di utilizzare Variant come tipo di parametri della funzione.

Per rendere più facile il debug di questo tipo di errore, provare a non fare troppo in una singola riga di codice. La suddivisione della linea in 2 x Match funzioni e un Index, permetterebbe di vedere la seconda partita di ritorno un errore.

paio di altri punti:

  • Se la chiamano questa funzione come UDF (cioè chiamato da una cella del foglio di lavoro), è meglio non codificare le gamme. Come scritto, le chiamate a eBudgetl non si ricalcolano automaticamente quando uno dei loro dati cambia.
  • l'oggetto Application ha una versione di Index e Match così le WorksheetFunction chiamate non sono tenuti

versione riscritta per dimostrare:

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 

chiamato come

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

Grazie mille! I consigli sono fantastici! – user3566159