Excel Forum Per condividere esperienze su Microsoft Excel

verifica corrispondenza codici e cerca un numero

  • Messaggi
  • OFFLINE
    raimea
    Post: 7
    Registrato il: 22/10/2021
    Città: ISEO
    Età: 56
    Utente Junior
    office 2010
    00 24/10/2021 10:21
    ciao
    tramite macro vorrei prelevare dei numeri
    rispettando una " matrice"

    provo a descrivere:
    in fgl ritardatari col BA2:BA56
    ho 55 codici che rimarranno fissi cosi

    in col A2 ho gli stessi codici ma disposti in maniera "confusa"

    in col I1 ho dei numei che sono quelli da riportare poi in col B2
    con la seguente procedura.

    Es
    col A3 ho la scritta PA3 indica il 3zo numero di palermo
    che controllando col I corrisponde al num 90

    col A5 ho la scritta BA2 indica la ruota di bari il 2do estratto
    che controllando col I corrisponde al num 73

    e cosi via , le righe da controllare di col A sono 4950
    quindi devo arrivare fino alla riga 4951

    vi allego il file

    ciao


  • OFFLINE
    dodo47
    Post: 3.231
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 24/10/2021 11:26
    ciao
    Prima di tutto in col. J, al posto delle ruote per esteso, metti le sigle:
    BA-CA-FI...etc etc

    Poi prova:
    Sub Corrispondenza()
    Dim ur As Long, rp As String, rt As String, ps As Integer, rng As Range, riga As Integer
    ur = Range("A" & Rows.Count).End(xlUp).Row
    Set rng = Range("J1:J51")
    Application.Calculation = xlCalculationManual
    For j = 2 To ur
        rp = Cells(j, 1)
        rt = Left(rp, 2)
        ps = Right(rp, 1)
        riga = Application.WorksheetFunction.Match(rt, rng, 0)
        For i = riga To riga + 4
            If Cells(i, 8) = ps Then
                Cells(j, 2) = Cells(i, 9)
                Exit For
            End If
        Next i
    Next j
    Application.Calculation = xlCalculationAutomatic
    msgbox "Done!"
    End Sub


    NB: é opportuno che ti inserisca una gestione di errori

    Non si capisce a che serva la col. BA....

    saluti




    [Modificato da dodo47 24/10/2021 11:29]
    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    raimea
    Post: 7
    Registrato il: 22/10/2021
    Città: ISEO
    Età: 56
    Utente Junior
    office 2010
    00 24/10/2021 11:33
    ciao

    si blocca con questa scritta da immagine

    -----
    >> Non si capisce a che serva la col. BA.... <<

    pensavo servisse x avere i riferimenti

    ciao
  • OFFLINE
    dodo47
    Post: 3.232
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 24/10/2021 11:44
    ciao
    manda il file con quanto hai fatto

    saluti




    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    raimea
    Post: 8
    Registrato il: 22/10/2021
    Città: ISEO
    Età: 56
    Utente Junior
    office 2010
    00 24/10/2021 11:47
    ciao

    tutto ok

    chiedo "venia " colpa mia....😥

    non avevo letto dove mni dicevi di rinominare la col J


    cosa intendi x gestione errori ?


    grazie

    [Modificato da raimea 24/10/2021 11:47]
  • OFFLINE
    by sal
    Post: 6.565
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 24/10/2021 11:51
    Ciao Ecco la mia soluzione, ti allego il file

    Sub RicPos() 'ricerca Posizione
    Dim r, c, d, p, n, x, y, rn1, rn2, arr1, Fine As Double, Inizio As Double
    
    r = Cells(Rows.Count, 1).End(xlUp).Row
    Range("B2:B" & r).ClearContents
    rn1 = Range("A2:A" & r)
    Application.ScreenUpdating = False
    Inizio = Timer
    arr1 = Range("BA2:BA56")
    r = Cells(Rows.Count, 9).End(xlUp).Row
    rn2 = Range("I1:I" & r)
    For y = 1 To UBound(rn2)
      n = rn2(y, 1)
      p = arr1(y, 1)
      For x = 1 To UBound(rn1)
        If rn1(x, 1) = p Then
          Cells(x + 1, 2) = n
        End If
      Next x
    Next y
    Cells(1, 1).Select
    Application.ScreenUpdating = True
    Fine = Timer
    MsgBox ("Tempo impiegato " & Round((Fine - Inizio), 2) & " secondi")
    End Sub


    ci mette circa 11 secondi

    Ciao By Sal (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    raimea
    Post: 9
    Registrato il: 22/10/2021
    Città: ISEO
    Età: 56
    Utente Junior
    office 2010
    00 24/10/2021 12:25
    ottimo
    tutto ok

    grazie ad entrabi

    ciao
  • OFFLINE
    raimea
    Post: 10
    Registrato il: 22/10/2021
    Città: ISEO
    Età: 56
    Utente Junior
    office 2010
    00 24/10/2021 17:46
    ciao
    ho letto i post successivi al mio riguardo a colora numeri ecc...

    sono d accordo che nel forum si debba tentare poi di imparare.
    ma vi assicuroi x me non e' facile !

    quindi sono a chiedere se potete commentarmi questa macro
    la parte centrale, che non so tradurre/ leggere:

    [TESTO vb::Sub Riportainumei() 'ricerca Posizione Dim ur As Long, rp As String, rt As String, ps As Integer, rng As Range, riga As Integer inizio = Timer ur = Range("A" & Rows.Count).End(xlUp).Row Set rng = Range("J1:J51") ' ok Application.Calculation = xlCalculationManual For J = 2 To ur ' parti dalla 2da riga '-------poi qui non la so leggere ------- rp = Cells(J, 1) rt = Left(rp, 2) ps = Right(rp, 1) riga = Application.WorksheetFunction.Match(rt, rng, 0) For I = riga To riga + 4 If Cells(I, 8) = ps Then Cells(J, 2) = Cells(I, 9) Exit For End If Next I Next J Application.Calculation = xlCalculationAutomatic fine = Timer MsgBox ("Tempo impiegato " & Round((fine - inizio), 2) & " secondi") End Sub]



    non riesco a caricare il formato codice ! 🙄

    ciao


    [Modificato da raimea 24/10/2021 17:52]
  • OFFLINE
    by sal
    Post: 6.567
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 25/10/2021 08:34
    Ciao Raimea, ti passo la mia macro commentata, ho aggiunto il blocco delle formule ed il tempo è sceso da circa 11 secondi a circa mezzo secondo 0,34.

    Domenico che saluto ti commenterà la sua

    questa la macro

    Sub RicPos() 'ricerca Posizione
    Dim r, c, d, p, n, x, y, rn1, rn2, arr1, Fine As Double, Inizio As Double
    
    Application.Calculation = xlCalculationManual 'blocca le formule
    r = Cells(Rows.Count, 1).End(xlUp).Row 'ultima riga colonna A
    Range("B2:B" & r).ClearContents 'pulisce dati in colonna B
    rn1 = Range("A2:A" & r) 'prende tutti i dati della colonna A
    Application.ScreenUpdating = False 'blocca lo scermo
    Inizio = Timer 'inizializza cronometro
    arr1 = Range("BA2:BA56") 'prende le sigle delle ruote
    r = Cells(Rows.Count, 9).End(xlUp).Row 'ultima riga colonna H
    rn2 = Range("I1:I" & r) 'prende estrazione colonna H
    For y = 1 To UBound(rn2) '1° ciclo scorre i numeri dell'estrazione
      n = rn2(y, 1) 'numero dell'estrazione
      p = arr1(y, 1) 'sigla dell'estrazione "Ba1-2-3-etc" Array colonna BA
      For x = 1 To UBound(rn1) '2° ciclo scorre la colonna A
        If rn1(x, 1) = p Then 'confronta la sigla colonna A con la sigla dell'estrazione
          Cells(x + 1, 2) = n 'ogni volta che la trova scrive il numero in colonna B
        End If
      Next x
    Next y
    'chiusura seleziona la cella A1 e rispristina lo schermo e il calcolo delle formule
    'riportando il tempo impiegato
    Cells(1, 1).Select
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Fine = Timer
    MsgBox ("Tempo impiegato " & Round((Fine - Inizio), 2) & " secondi")
    End Sub


    ti allego anche 2 funzioni che ti saranno molto utili, le userai come Formule come se fosse una funzione normale.

    sono il "Fuori90()" e "Vert90()", esempio nel tuo foglio che usi questa formula

    =SE(RESTO(B2+D2;90);RESTO(B2+D2;90);90)

    la sostituisci con

    =Fuori90(B2+D2)

    oppure il vertibile con del 61 che è il Fuori90 di prima

    =Vert90(B2+D2) che è uguale a 16

    queste le 2 funzioni, basta copiarle in un modulo e dimenticarle, poi applicare la funzione

    Function Fuori90(ff) 'questa la funzione per il fuori90
    
    While ff > 90
        ff = ff - 90
    Wend
    If ff = 0 Then ff = 90
    Fuori90 = ff
    End Function
    
    Function Vert90(n) 'questa per i vertibili con il fuori90
    Dim vv
    While n > 90
        n = n - 90
    Wend
    If n = 0 Then n = 90
    vv = Array(10, 20, 30, 40, 50, 60, 70, 80, 90, 1, 19, 21, 31, 41, 51, 61, 71, 81, 11, 2, 12, 29, 32, 42, 52, 62, 72, 82, 22, 3 _
                , 13, 23, 39, 43, 53, 63, 73, 83, 33, 4, 14, 24, 34, 49, 54, 64, 74, 84, 44, 5, 15, 25, 35, 45, 59, 65, 75, 85, 55 _
                , 6, 16, 26, 36, 46, 56, 69, 76, 86, 66, 7, 17, 27, 37, 47, 57, 67, 79, 87, 77, 8, 18, 28, 38, 48, 58, 68, 78, 89 _
                , 88, 9)
    Vert90 = vv(n - 1)
    End Function


    allego anche il file.

    Ciao By Sal (8-D
    [Modificato da by sal 25/10/2021 08:46]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    raimea
    Post: 11
    Registrato il: 22/10/2021
    Città: ISEO
    Età: 56
    Utente Junior
    office 2010
    00 25/10/2021 16:58
    ok
    cosi posso imparare a leggerle

    grazie
  • OFFLINE
    by sal
    Post: 6.568
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    10 25/10/2021 17:43
    Ciao se ti piace il VBA, allora incomincia ad imparare l'uso dell'editor, quello da imparare sono solo alcuni comandi, i principali sono 3

    F5 fa partire la macro
    F9 mette un punto di interruzione
    F8 scorre la macro riga per riga

    ce ne sono altri, ma questi sono necessari per vedere il funzionamento della macro, rilevare gli errori e correggerli nel caso ce ne sia bisogno

    procedi piano piano.

    le macro hanno un inizio ed una fine, iniziano con

    Sub NomeMacro()

    finiscono con

    End Sub

    tutto quello che si trova in mezzo sono i codici per il funzionamento

    metti il cursore sulla riga Sub NomeMacro() e premi F9

    vedrai la riga cambiare colore di norma Marrone con scritte bianche, premendo ancora F9 ritorna Normale

    questo comporta un punto di blocco, cioè quando lanci la macro si fermerà in quel punto, quindi puoi decidere tu mettendo più punti di blocco quale parte della macro deve essere eseguita

    adesso con il blocco posizionato su Sub NomeMacro() premi F5

    questo farà partire la macro, ma logicamente si fermerà sulla prima riga diventando gialla, il cambio di colore Giallo significa che verrà eseguita l'istruzione di quella riga, per farla eseguire a questo punto premi F8

    vedrai spostarsi la riga gialla alla riga successiva di comando, la riga delle variabile la legge ma non si ferma passa alla riga successiva.

    a questo punto premendo ripetutamente F8 esegui la macro riga per riga controllando mano a mano cosa succede sul foglio per vedere se funziona bene oppure ci sono errori di esecuzione.

    quando è attivo ScreenUpdating = false tali cambiamenti non li noti perche è bloccata la variazione del foglio, se devi fare i controlli devi disattivare ScreenUpdating con l'apostrofo.

    ma oltre questo puoi vedere anche il valore che ha preso la variabile che hai assegnato, passando con il cursore sopra la variabile.

    si può anche tornare indietro nella macro e rifare un passaggio modificando le istruzioni, per fare questo basta selesuonare sul bordo della riga gialla compare una frecci e puoi spostarla in avanti oppure indietro secondo quello che ti serve

    ti metto una immagine per farti vedere il procedimento, nell'esecuzione della macro sopra.



    con un poco di pratica potrai vedere come funzionano le macro ed acquisire più conoscenza.

    Ciao By Sal (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    raimea
    Post: 17
    Registrato il: 22/10/2021
    Città: ISEO
    Età: 56
    Utente Junior
    office 2010
    00 27/10/2021 21:31
    ciao
    ho applicato ed adattato la macro di dodo47
    ed era tutto ok

    ora mi da un errore che prima non accadeva !

    quando premo tasto prel 5/6 addendi
    mi si blocca dicendo >>> tipo non corrispondente !

    le ho provate tutte ma non capisco xche ora non funziona piu

    la logica e uguale
    cioe cercare la sigla di col Q in col J
    prelev il corrispondente numero da inserire in col R

    ma ora si blocca !

    vi allego il file


    NB
    ho tentato anche di usare la macro di sal
    ma non ho tradotto giusto qualcosa


    [TESTO ::vba Sub RicPos() 'ricerca Posizione Dim r, c, d, p, n, x, y, rn1, rn2, arr1, Fine As Double, Inizio As Double Application.Calculation = xlCalculationManual 'blocca le formule r = Cells(Rows.Count, 17).End(xlUp).Row 'ultima riga colonna q Range("r2:r" & r).ClearContents 'pulisce dati in colonna r rn1 = Range("q2:q" & r) 'prende tutti i dati della colonna q Application.ScreenUpdating = False 'blocca lo scermo Inizio = Timer 'inizializza cronometro arr1 = Range("j2:j56") 'prende le sigle delle ruote r = Cells(Rows.Count, 9).End(xlUp).Row 'ultima riga colonna H rn2 = Range("I1:I" & r) 'prende estrazione colonna H For y = 1 To UBound(rn2) '1° ciclo scorre i numeri dell'estrazione n = rn2(y, 1) 'numero dell'estrazione p = arr1(y, 1) 'sigla dell'estrazione "Ba1-2-3-etc" Array colonna j For x = 1 To UBound(rn1) '2° ciclo scorre la colonna A If rn1(x, 17) = p Then 'confronta la sigla colonna q con la sigla dell'estrazione Cells(x + 1, 18) = n 'ogni volta che la trova scrive il numero in colonna r End If Next x Next y 'chiusura seleziona la cella A1 e rispristina lo schermo e il calcolo delle formule 'riportando il tempo impiegato Cells(1, 1).Select Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Fine = Timer MsgBox ("Tempo impiegato " & Round((Fine - Inizio), 2) & " secondi") End Sub]

    ciao



    [Modificato da raimea 27/10/2021 21:49]
  • 15MediaObject5,00112 1
  • Passa alla versione desktop