2013-03-20 20 views
9

devo Colonna A:Perché ricevo l'errore 2042 nell'associazione VBA?

+--+--------+ 
| | A  | 
+--+--------+ 
| 1|123456 | 
|--+--------+ 
| 2|Order_No| 
|--+--------+ 
| 3| 7 | 
+--+--------+ 

Ora, se io entro:

=Match(7,A1:A5,0) 

in una cella sul foglio ottengo

3 

Come risultato. (Questo è desiderata)

Ma quando entro in questa linea:

Dim CurrentShipment As Integer 
CurrentShipment = 7 
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0) 

CurrentRow ottiene un valore di "Errore 2042"

Il mio primo istinto è stato quello di fare in modo che il valore di 7 è stato infatti nell'intervallo, ed era.

Il mio prossimo era forse la funzione Partita richiesto una stringa così ho provato

Dim CurrentShipment As Integer 
CurrentShipment = 7 
CurrentRow = Application.Match(Cstr(CurrentShipment), Range("A1:A5"), 0) 

inutilmente.

+0

Il tuo codice funziona per me così com'è. Il messaggio di errore che ricevi è l'equivalente di '# N/A'. Forse si sta concentrando sul foglio sbagliato a volte?Potresti provare a selezionare attivamente il foglio giusto prima di eseguire il codice. – techturtle

risposta

6

Prova questo:

CurrentRow = Application.Match(CLng(CurrentShipment), Range("A1:A5"), 0) 
+1

Questo ha funzionato, ma perché? – user2140261

+1

E funzionerà per numeri interi, ma non per i decimali e non per la stringa, quindi sembra un po 'dubbia ... –

+0

Questo funziona anche per i miei dati in cui sono le date di corrispondenza. Non so davvero perché questo è il caso poiché il CLng sta convertendo un valore in un intero lungo. Un'ulteriore spiegazione è apprezzata. –

0

È interessante notare, ho digitato i dati in un foglio di Excel vuoto e poi corse snippet di originale di codice. Restituito 3, come previsto, senza dover eseguire il cast di CurrentShipment come String o Long.

Not DIM'ing CurrentRow lo rende di default Variant, ma anche impostando entrambi come Integer o CurrentRow come Byte non genera un errore, quindi utilizzando Double come tipo di ritorno è ridondante.

Sub Match() 

Dim CurrentShipment As Integer 
Dim CurrentRow As Byte '<--- NOTE 

CurrentShipment = 7 
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0) 

MsgBox CurrentRow 

End Sub 
0

Per me ha funzionato bene senza digitare nulla. Ho usato entrambi:

Application.WorksheetFunction.Match(CurrentShipment, Range("A1:A5"), 0)

e

Application.Match(CurrentShipment, Range("A1:A5"), 0)

quotato CurrentShipment as Integer, Double, Long o variante, tutto ha funzionato bene ...

1

Se cercate funzione match nel browser degli oggetti restituisce il doppio quindi ho dichiarato la variabile CurrentRow come double e mentre accetta il parametro 3 variant. Prova sotto il codice se funziona per te.

enter image description here

enter image description here

Sub sample() 

    Dim CurrentShipment As Variant 
    CurrentShipment = 7 

    Dim CurrentRow As Double 
    CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0) 
    End Sub 
10

Come nota a margine a questo e per tutti coloro che ottiene questo errore in futuro, con qualsiasi funzione che restituisce un possibile errore, il tipo di variante funziona abbastanza bene:

Dim vreturn as variant 

vreturn = Application.Match(CurrentShipment, Range("A1:A5"), 0) ' this could be any function like a vlookup for example as well 

If IsError(vreturn) Then 
    ' handle error 
Else 
    CurrentRow = cint(vreturn) 
End If 
+1

+1 migliore risposta. – brettdj

Problemi correlati