cerca verticale dinamico



  • cerca verticale dinamico
    di Alessandro (utente non iscritto) data: 19/07/2013 09:51:35

    Salve,
    Ho un problema con la ricerca avanzata di testo.
    nella riga 4 ho le intestazioni 01-rosso, 02-verde ecc.
    dalla riga 6 ho incolonnato diversi valori, come indicato (i puntini servono solo a rendere l'idea dell'incolonnamento):

    ..01-rosso.......... 02-verde.......... 03-blu.......... 04-giallo.......... 05-nero

    01-linea A....... 02-linea B....... 02-linea A....... 01-linea A....... 01-linea B
    02-linea B....... 01-linea C....... 01-linea C....... 02-linea B....... 02-linea C
    03-linea C....... 03-linea A....... 02-linea B....... 03-linea C....... 03-linea A

    nella cella A1 ho il testo con il riepilogo del codice: "tipo-0301"
    ora l'obiettivo è di avere in A2 la scritta "03-blu" (risolto tranquillamente con un cerca orizzontale, dopo aver estratto i caratteri "03" dalla scritta "tipo-0301")
    e in A3 la scritta "01-linea C" che è incolonnata sotto "03-blu".
    Questo non so come ottenerlo, perchè non so come imporre al "cerca verticale" di andare a cercare sotto "03-blu".
    si tenga presente che la tabella viene periodicamente aggionata, percui le posizioni dei testi non sono fisse. la scritta in A1 comincia sempre con "tipo-xxxx" dove xxxx è il codice che può variare.
    Che formula dovrei scrivere nella cella A3 per avere il valore ricercato?
    Grazie a chi mi aiuta a risolvere il problema.
    Alessandro


  • Ciclo velocizzabile?
    di Cesare data: 19/07/2013 10:20:25

    Premetto che sto cominciando adesso a dilettarmi con VBA e sono proprio un principiante. Ho un file che aggiorno periodicamente con dei dati giornalieri che importo da un file txt. Filtro i dati lasciando solo gli ultimi 2 mesi (circa 15.700 righe) e lancio la macro (realizzata con notevole aiuto esterno) di aggiornamento. Attualmente impiega circa 2 minuti. Secondo voi è velocizzabile? Tra l'altro ho notato che se la macro la lancio senza aver prima filtrato i dati e quindi con circa 72.000 righe, impiega quasi lo stesso tempo, la differenza è veramente di pochissimi secondi.

    Già che ci siamo, vorrei inserire una progress bar e ho letto in giro qualche post. Nessun problema per creare la form, ma non sono riuscito a capire in quale parte del codice esattamente richiamarla.

    Grazie anticipatamente per l'aiuto.
     
    Dim UC As Integer, UR As Long, RR As Long, I As Long, J As Long, K As Long, Trovato As Integer
        Dim Ws1 As Worksheet, Ws2 As Worksheet
        Dim Matrice1(), Inizio As Double, Sostituiti As Long, Ricalcolo As Variant
            
        Inizio = Timer
        Ricalcolo = Application.Calculation
        Application.Calculation = xlCalculationManual
        Application.ScreenUpdating = False
        Set Ws1 = Sheets("BE_Fatt")
        Set Ws2 = Sheets("Dati_Importati")
        UR = Ws2.Range("A" & Rows.Count).End(xlUp).Row
        UC = Ws1.Range(Ws1.Cells(1, Columns.Count).Address).End(xlToLeft).Column
        Matrice1 = Ws2.Range(Ws2.Cells(1, 1), Ws2.Cells(UR, 3))
        Sostituiti = 0
        UR = Ws1.Range("L" & Rows.Count).End(xlUp).Row
        UC = Ws1.Range(Ws1.Cells(1, Columns.Count).Address).End(xlToLeft).Column
        For I = 2 To UBound(Matrice1)
            If Application.WorksheetFunction.CountIf(Ws1.Range("M100:M" & UR), Matrice1(I, 2)) > 0 Then
                For J = 100 To UR
                ProgressBar.Show
                    If Ws1.Cells(J, "M") = Matrice1(I, 2) Then
                        For K = 14 To UC
                            If Ws1.Cells(5, K) = Matrice1(I, 1) Then
                                Ws1.Cells(J, K) = Matrice1(I, 3)
                                Sostituiti = Sostituiti + 1
                                Exit For
                            End If
                        Next K
                        Exit For
                    End If
                Next J
             End If
        Next I
        Application.ScreenUpdating = True
        Application.Calculation = Ricalcolo
        If Sostituiti > 0 Then
            MsgBox "Elaborazione effettuata.  " & vbCrLf & vbCrLf & "Sostituiti: " & Sostituiti & " dati in   '" & Format(Timer - Inizio, "0.00") & "'  Secondi"
        Else
            MsgBox "Non sono stati trovati dati da sostituire", vbCritical
        End If
        Set Ws1 = Nothing
        Set Ws2 = Nothing
        Application.ScreenUpdating = True



  • di Cesare data: 19/07/2013 10:23:07

    Scusate, ero convinto di aver creato una nuova discussione e invece ho risposto a questa, chiedo umilmente venia



  • di Raffaele_53 (utente non iscritto) data: 20/07/2013 13:09:10

    Intravedo un'errore di base.
    Sotto 03-Blu vedo due differenti 02-linea..X (non può funzionare se in A1 c'è "tipo-0302"

    Credo che in A2 hai scritto =CERCA.ORIZZ(STRINGA.ESTRAI(A1;6;2)&"*";A4:E4;1;FALSO)
    In A3 puoi mettere =CERCA.VERT(STRINGA.ESTRAI(A1;6;2)&"*";INDIRETTO(CODICE.CARATT((RIF.COLONNA(A1)+CONFRONTA(STRINGA.ESTRAI(A1;6;2)&"*";A4:E4;0)-1)+64)&"6:"&CODICE.CARATT((RIF.COLONNA(A1)+CONFRONTA(STRINGA.ESTRAI(A1;6;2)&"*";A4:E4;0)-1)+64)&"1000");1;FALSO)

    Dove &"6:" significa che cerca dalla riga 6
    Dove &"1000" significa sino alla riga 1000


  • PERFETTO!
    di Alessandro (utente non iscritto) data: 22/07/2013 10:25:55

    Grazie Rafafele!
    ho provato in fretta la formula e funziona perfettamente.
    Sinceramente non ho capito come funziona, ma appena posso provo a studiarla.
    P.S. in effetti c'era l'errore che indichi


  • e su fogli differenti?
    di Alessandro (utente non iscritto) data: 29/07/2013 17:41:11

    ho dovuto fare una modifica al file,
    adesso le caselle
    A1 ("tipo-0301")
    A2 (la scritta "03-blu")
    e A3 (la scritta "01-linea C")
    sono su "foglio1", mentre la matrice è su "foglio2".
    ho provato a spostare la matrice di foglio e vari altri esperimenti, ma non ne vengo fuori.
    potreste aiutarmi?
    grazie
    Alessandro