Cercare il valore di un foglio e incollare i risultati tramite vba

Anonimo
2013-10-03T12:55:21+00:00

Ciao a tutti

ho questo problema ho un foglio con 35000 righe formatato nel seguente modo

sheet1

A      |   B          |  C       |

1|nome   | cognome | chave |

2|aaaaaa | belllo       | xxxxxx|

3|fffffffff  |  brutto      | aaaaa|

4|fffffffff  |  brutto2    | aaaaa|

5|fffffffff  |  brutto2    | WWW|

e lo sheet2

A      |   B           |  C       |   D   |   E  |

nome   | cognome | chave | m1  | m2 |

aaaaaa | belllo       | xxxxxx| 01   |  03|

fffffffff  |  brutto      | aaaaa| 01   |  04|

il mio obiettivo è quello di cercare il valore presente nello sheet1 c2 (xxxxx) all'interno dello sheet2 colonna C e nel momento in cui trova il valore copiare le colonne D ed E dello sheet2 all'interno dello sheet1 nel vaso non trova nulla deve inserire 0 o lasciarlo in bianco

come posso fare ?

ho provato con un find ma non funziona.

Grazie a tutti.

Vito

PS: ho fatto con una vlookup ma è Troppo lenta.

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
2013-10-04T10:54:19+00:00

Ciao AndyCap64,

ti ringrazio per il tuo supporto è proprio quello che cercavo ti do conferma che non è velocissimo ma è quello che volevo fare.

Ti volevo chiedere solo una cosa potresti descrivermi brevemente come funzionano le variabili create sempre se hai tempo.

grazie mille

vito

Ciao Vito,

non sapendo di preciso quello che vuoi sapere, ti riallego lo stesso codice opportunamente commentato, se, invece, c'è qualcosa di specifico che vuoi sapere chiedi.

Nel codice allegato ho utilizzato Find, con il quale ti eri cimentato senza successo, per spiegarne l'utilizzo.

Come hai tu stesso rilevato, però, non rappresenta la soluzione migliore dal punto di vista della velocità di esecuzione. Dovendo lavorare su grandi quantità di dati, sarebbe opportuno che i campi utilizzati nelle ricerche fossero ordinati così da ottimizzare la procedura.

Ti allego una seconda macro, che utilizza un approccio diverso e che di sicuro ti darà soddisfazioni maggiori.

Un saluto,

Andrea.


Sub cercaFind()

Dim rValue As Range, rTable As Range, cel As Range, rFound As Range

Dim lLastRow1 As Long, lLastRow2 As Long

Application.ScreenUpdating = False

'---------- valori da ricercare

With Worksheets("Foglio1")

'---------- determina ultima riga non vuota in colonna C

lLastRow1 = .Cells(Rows.Count, "c").End(xlUp).Row

'---------- assegna il range contenente i valori da ricercare

Set rValue = .Range("c2:c" & lLastRow1)

End With

'---------- intervallo di ricerca

With Worksheets("Foglio2")

'---------- determina ultima riga non vuota in colonna C

lLastRow2 = .Cells(Rows.Count, "c").End(xlUp).Row

'---------- assegna il range contenente i valori sui quali effettuare la ricerca

Set rTable = .Range("c2:c" & lLastRow2)

End With

'---------- legge un valore alla volta dai valori da ricercare

For Each cel In rValue

'---------- se non è vuoto

If Len(cel.Value) Then

'---------- assegna a rFound la cella di colonna C del Foglio2 che contiene il valore

Set rFound = rTable.Find(cel.Value, rTable.Cells(lLastRow2 - 1, 1), xlValues, xlWhole)

'---------- se ha trovato il valore, copia corrispondente colonna D:E

If Not rFound Is Nothing Then

rFound.Offset(, 1).Resize(, 2).Copy cel.Offset(, 1)

End If

End If

Next

'---------- clen up

Set rTable = Nothing: Set rValue = Nothing

Set rFound = Nothing: Set cel = Nothing

End Sub


Sub cercaMatch()

Dim rTable As Range

Dim vbValue As Variant, vbResult As Variant

Dim i As Long, j As Long, n As Long

On Error Resume Next

Application.ScreenUpdating = False

'---------- copia valori da ricercare in un array in memoria

vbValue = Worksheets("Foglio1").UsedRange.Columns("c").Value

n = UBound(vbValue)

ReDim vbResult(1 To n - 1, 1 To 2)

'---------- asegna intervallo di ricerca

With Worksheets("Foglio2")

'---------- assegna il range contenente i valori sui quali effettuare la ricerca

Set rTable = .Range("c2:c" & .Cells(Rows.Count, "c").End(xlUp).Row)

End With

For i = 2 To n

If Len(vbValue(i, 1)) Then

'---------- utilizza la funzione Confronta(), che restituisce error per trovare il valore

'---------- ma se non lo trova

j = WorksheetFunction.Match(vbValue(i, 1), rTable, 0)

If Err Then

Err.Clear

Else

vbResult(i - 1, 1) = rTable(j, 2)

vbResult(i - 1, 2) = rTable(j, 3)

End If

End If

Next

'---------- incolla i valori trovati sul foglio di lavoro

Worksheets("Foglio1").Cells(2, 4).Resize(n, 2).Value = vbResult

Set rTable = Nothing

End Sub


La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2013-10-03T19:00:48+00:00

...

ho provato con un find ma non funziona.

Ciao Vito,

questa, invece, dovrebbe funzionare, anche se non è una scheggia.

Andrea.


Sub cercaFind()

Dim rValue As Range, rTable As Range, cel As Range, rFound As Range

Dim lLastRow1 As Long, lLastRow2 As Long

'---------- valori da ricercare

With Worksheets("Foglio1")

lLastRow1 = .Cells(Rows.Count, "c").End(xlUp).Row

Set rValue = .Range("c2:c" & lLastRow1)

End With

'---------- intervallo di ricerca

With Worksheets("Foglio2")

lLastRow2 = .Cells(Rows.Count, "c").End(xlUp).Row

Set rTable = .Range("c2:c" & lLastRow2)

End With

For Each cel In rValue

If Len(cel.Value) Then

Set rFound = rTable.Find(cel.Value, rTable.Cells(lLastRow2 - 1, 1), xlValues, xlWhole)

If Not rFound Is Nothing Then

rFound.Offset(, 1).Resize(, 2).Copy cel.Offset(, 1)

End If

End If

Next

Set rTable = Nothing: Set rValue = Nothing

Set rFound = Nothing: Set cel = Nothing

End Sub


La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2013-10-10T13:38:08+00:00

    Ciao AndyCap64,

    ti ringrazio per la soluzione proposta, molto utile e rapida grazie mille.

    vito

    Grazie anche a te per il riscontro.

    Andrea.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-10-10T13:20:02+00:00

    Ciao AndyCap64,

    ti ringrazio per la soluzione proposta, molto utile e rapida grazie mille.

    vito

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-10-04T08:46:07+00:00

    Ciao AndyCap64,

    ti ringrazio per il tuo supporto è proprio quello che cercavo ti do conferma che non è velocissimo ma è quello che volevo fare.

    Ti volevo chiedere solo una cosa potresti descrivermi brevemente come funzionano le variabili create sempre se hai tempo.

    grazie mille

    vito

    La risposta è stata utile?

    0 commenti Nessun commento