Uso della funzione VLookup di Excel in VBA

Anonimo
2018-02-17T12:52:22+00:00

Nel range Isin1 di una sola colonna ho alcuni codici hai quali voglio abbinare i valori corrispondenti ad ogni codice che si trovano nel range Isin2 di due colonne.

Ho scritto il seguente codice che funziona senza problemi però vorrei sapere se non esiste un modo più efficente per ottenere lo stesso risultato senza fa ricorso ad una WorksheetFunction come VLookup.

Sub VertLookup()

Dim Vcella As Range

On Error GoTo ERRORE

For Each Vcella In Range("Isin1")

   Vcella.Offset(0, 1).Value = Application.WorksheetFunction.VLookup(Vcella.Value, Range("Isin2"), 2, False)

Next Vcella

Exit Sub

ERRORE:

MsgBox "Isin " & Vcella.Value & " non trovato"

End Sub

Grazie e buona domenica

gildum

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2018-02-17T15:42:30+00:00

ciao gildum,

non che già non sia abbastanza veloce la procedura che hai creato ma, volendo, prova questa che riporta i valori, senza fermarsi nel caso non venga trova una occorrenza (come fa la tua), sfruttando una dictionary:

'---

Sub Associa()

  Dim iTimerAssocia As Double: iTimerAssocia = Timer

  Dim rIsin1 As Range, rIsin2 As Range

  Dim arrIsin1 As Variant

  Dim arrIsin2A As Variant, arrIsin2B As Variant

  Dim arrIsin1Val() As Variant

  Dim dictIsin2 As Object

  Dim i As Variant

  Dim cont As Long

  Set rIsin1 = Range("Isin1")

  Set rIsin2 = Range("Isin2")

  Set dictIsin2 = CreateObject("Scripting.Dictionary")

  With rIsin1

    ReDim arrIsin1Val(1 To .Rows.Count, 1 To 1)

    arrIsin1 = .Value

  End With

  With rIsin2

    arrIsin2A = .Columns(1).Value

    arrIsin2B = .Columns(2).Value

  End With

  For Each i In arrIsin2A

    cont = cont + 1

    dictIsin2(i) = arrIsin2B(cont, 1)

  Next i

  cont = 0

  For Each i In arrIsin1

    cont = cont + 1

    If i <> vbNullString Then

      If dictIsin2.Exists(i) Then

        arrIsin1Val(cont, 1) = dictIsin2(i)

      End If

    End If

  Next i

  With Application

    .Calculation = xlCalculationManual

    .ScreenUpdating = False

  End With

  rIsin1.Offset(0, 1).Value = arrIsin1Val

  With Application

    .Calculation = xlCalculationAutomatic

    .ScreenUpdating = True

  End With

  Debug.Print "iTimerAssocia = " & Timer - iTimerAssocia

End Sub

'---

Su 5.000 righe ho misurato questi tempi (dopo aver inserito anche nella tua procedura i comandi che bloccano il ricoalcolo e "congelano" lo schermo:

iTimerAssocia = 0,0625

iTimerVertLookup = 0,85546875

iTimerAssocia = 0,046875

iTimerVertLookup = 0,875

iTimerAssocia = 0,046875

iTimerVertLookup = 0,875

iTimerAssocia = 0,046875

iTimerVertLookup = 0,91015625

iTimerAssocia = 0,0390625

iTimerVertLookup = 0,875

iTimerAssocia = 0,046875

iTimerVertLookup = 0,87109375

iTimerAssocia = 0,046875

iTimerVertLookup = 0,859375

iTimerAssocia = 0,046875

iTimerVertLookup = 0,859375

iTimerAssocia = 0,046875

iTimerVertLookup = 0,90625

iTimerAssocia = 0,0390625

iTimerVertLookup = 0,87109375

P.s. parto dal presupposto che i codici presenti in Isin2 siano univoci (considerato che in quell'intervallo fai una ricerca con CERCA.VERT che ovviamente troverebbe solo una corrispondenza).

EDIT: qui trovi il link ad un file di esempio  File esempio

La risposta è stata utile?

0 commenti Nessun commento

2 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-02-19T09:28:27+00:00

    Prego e grazie a te per il riscontro :)

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-02-19T08:46:12+00:00

    Grazie per la procedura che mi hai inviato. Molto interessante e velocissima.

    Buona giornata.

    gildum

    La risposta è stata utile?

    0 commenti Nessun commento