Ricerca 2 condizioni



  • Ricerca 2 condizioni
    di Riccardo (utente non iscritto) data: 25/11/2009

    Probabilmente una dsicussione del genere è già stata affrontata, ma non riesco a trovare dei riferimenti validi, quindi la ripropongo.
    sarebbe utile una funzione (o macro) di ricerca di valori simile a cerca.vert, ma che trovasse 2 condizioni: ad esempio dati cognome e nome in due campi diversi trovasse indirizzo in un terzo campo. ciò dovrebbe essere svolto anche in caso di cognomi uguali, ma nomi diversi, cioè che sapesse selezionare rossi mario anche se esiste, prima di questo, rossi antonio.
    mi sono spiegato sufficientemente?
    grazie a chi mi saprà fornire indicazioni.
    riccardo



  • di Ricky53 data: 25/11/2009

    Ciao,
    utilizza una colonna di appoggio (da inserire davanti a quella del cognome o davanti a tutte le altre tute colonne) in cui concateni cella-cognome & cella-nome
    e
    poi fai il "cerca.vert" dei tuoi dati ((cognome e nome da trovare) su una matrice che ha questa colonna come prima colonna e prendi quella corrispondente che ti occorre.

    leggi nella guida l'utilizzo di "cerca.vert"

    ciao da ricky53


  • Ricerca 2 condizioni
    di Cenf (utente non iscritto) data: 25/11/2009

    Ma se invece di nome e cognome hai dei numeri che non si possono concatenare come si fa?



  • di Ricky53 data: 25/11/2009

    Ciao,
    anche i numeri si possono concatenare basta inserire un spazio o un qualunque carattere tra i due numeri.

    ciao da ricky53



  • di Riccardo (utente non iscritto) data: 25/11/2009

    Ringrazio, ma speravo di riuscire a fare meglio, nel senso di trovare proprio una funzione di ricerca ad hoc.
    adesso provo ad approfondire, poi, se riesco faccio sapere i miei risultati.
    grazie comunque.
    riccardo



  • di Ricky53 data: 25/11/2009

    Ciao,
    la funzione "cerca.vert" è proprio fatta per ricercare dei dati in una matrice.
    devi solo preparare i dati (concatenarli ad es.) da cercare e scrivere la sintassi opportuna.

    "cerca.vert" è la funzione più utlizzata di excel dopo "somma"

    ciao da ricky53


  • Ricerca 2 condizioni
    di Riccardo (utente non iscritto) data: 26/11/2009

    Ringrazio ancora ricky53 per i suoi puntuali e sempre competenti interventi, ma poiché non ero soddisfatto del funzionamento di cerca.vert, che impone l'utilizzo di campi accessori e non desiderati, mi sono dato da fare con spirito costruttivo e collaborativo e propongo qui di seguito la mia soluzione di funzione di ricerca di dati in una tabella in presenza di doppia condizione. a beneficio di tutti gli amici del forum interessati all'argomento.

    aggiungo i seguenti commenti:

    1 ) la funzione accessoria contarighe è necessaria perché non sempre la tabella sarà indicata con le doppie coordinate righe-colonne, ma talvolta (secondo me più spesso) sarà indicata col solo nome di colonna (es. a:a o f:f, ecc.)
    2) le funzioni trim e ucase sono utili, anche se non strettamente indispensabili, per intercettare errori di battitura (mario rossi = mario rossi) e così pure l'eliminazione di spazi esterni (iniziali e finali) in soprannumero purché non centrali); per il caso di spazi centrali ho predisposto una funzione trimcar che qui non ho riproposto perché non viene richiamata da questo programma.
    3) offset è la colonna dalla quale estrarre il dato desiderato (dove 1=colonna a, 2=b, ecc.).
    faccio osservare che mentre con cerca.vert non si può andare a ritroso nella colonna del dato da trovare, rispetto alla colonna di ricerca della condizione, nel mio programma ciò è possibile; quindi posso ad esempio cercare 2 condizioni rispettivamente nelle colonne b:b e d:d ed estrapolare il dato dalla colonna a:a
    4) la funzione let2num serve per la trasposizione numerica della lettera di colonna (a=1, b=2, ecc.).
    5) esempio di sintassi di chiamata (nel mio caso la funzione risiede nel personal.xls, per un utilizzo frequente):
    =personal.xls!trova2condiz("elenco clienti-cn";"b:b"; e26;"d:d"; f26; 4)
    dove:
    - "elenco clienti-cn" è il mio database o tabellone in cui ricercare le condizioni e i dati da estrapolare
    - "b:b"; "d:d" sono i campi in cui ricercare le condizioni assegnate rispettivamente in e26 e f26
    faccio osservare che "b:b"; "d:d" sono le colonne passate come testi per l'interpretazione della lettera come numero (v. funzione let2num, per poter chiamare cells(i, j) )
    - 4 è l'offset o colonna da cui estrapolare il dato; la colonna può essere qualsiasi compresa la colonna di ricerca (anche se non avrebbe senso restituire lo stesso dato ricercato come condizione).

    mi rendo conto che più difficile da spiegare che da capire, basta un'occhiata a persona competente per vedere la banalità della funzione, però funziona e bene anche!
    accetterei volentieri suggerimenti migliorativi, soprattutto per la funzione let2num che non è elegante ed ha il grosso limite di valere solo per le colonne da a a z, ma non oltre (bm, ecc.), e ciò è assai limitativo per una funzione che avrebbe la "pretesa" di risolvere la generalità dei casi.
    inoltre mi piacerebbe passare i campi zona1 e zona2 come range e non come testi, ma non ci sono riuscito. ripeto, se avete suggerimenti saranno graditissimi.

    grazie a tutti per l'interessamento
    riccardo

     
    Function Trova2Condiz(WS$, Zona1, cond1, Zona2, cond2, Offset)  ' TROVA Risultato di 2 CONDIZIONI in Campo Offset
    Numrighe = ContaRighe(WS$, 1, 6) ' 6 è il numero di colonne personalizzabile a piacere e, se le righe sono numericamente uguali in tutte le colonne è sufficiente fare la ricerca righe solo in colonna 1)
    For f = 1 To Numrighe
        Cella1 = Trim(UCase(Cells(f, Let2Num(Mid$(Zona1, 1, 1)))))
        Cella2 = Trim(UCase(Cells(f, Let2Num(Mid$(Zona2, 1, 1)))))
        If Cella1 = Trim(UCase(cond1)) And Cella2 = Trim(UCase(cond2)) Then
            Cella$ = Cells(f, Offset).Value
            Exit For
        End If
    Next f
    Trova2Condiz = Cella$
    End Function 'Trova2Condiz
    
    Function ContaRighe(WS$, MinCol, MaxCol) ' Scansiona tutti i campi di WS$ = WorkSheet, da MinCol a MaxCol,
    ' conteggiando il massimo numero di riga fra tutte le colonne
    ' Se non si conosce il numero di colonne impegnato nel foglio basta assegnare il numero massimo (WS$; 1, 256)
    ' Se si vuole solo il numero di righe di un campo, basta assegnare MinCol = MaxCol es. ContaRighe(WS$; 3; 3)
      Dim Contatore ' Contatore Utilizzato per le Righe
      For COLONNA = MinCol To MaxCol
        Ur = Worksheets(WS$).Cells(65536, COLONNA).End(xlUp).Row ' Ur = Ultima riga
        valore = Worksheets(WS$).Cells(Ur, COLONNA).Value ' serve per intercettare cella vuota in riga 1 che darebbe
        'valore 1 anche per riga vuota; così se devo conteggiare un campo vuoto mi ritorna 0 (Zero) anziché 1
        If Ur = 1 And valore = "" Then Ur = 0
        If Contatore < Ur Then Contatore = Ur
      Next COLONNA
      ContaRighe = Contatore ' numero massimo di righe impegnato nelle colonne da MinCol a MaxCol di WS$
    End Function
    
    Function Let2Num(LetAZ) 'Restituisce numero corrispondente a LetAZ A-Z; 1-26
      If LetAZ < "A" Or LetAZ > "Z" Then
        Let2Num = 0
      Else
        Let2Num = Asc(UCase(LetAZ)) - Asc("A") + 1
      End If
    End Function
    
    


  • Trova 2 condizioni
    di Riccardo (utente non iscritto) data: 28/11/2009

    Per completezza di informazione aggiungo che, dopo un paio di giorni di prove e ricerche nell'help di vba, ho risolto credo brillantemente, eureka!
    applicando la semplicissima proprietà "column" alla "zona di ricerca" mi restituisce direttamente il numero di colonna.
    oltretutto ho preso i classici 2 piccioni con una fava perché ho eliminato la brutta subroutine let2num che mi trovava il numero di colonna solo da "a" a "z", invece questa proprietà mi restituisce qualsiasi colonna fino a 256, ed inoltre con questo sistema posso passare i parametri di zona "as range" anziché come testo.
    saluti a tutti.
    riccardo


  • Trova 2 condizioni
    di Riccardo (utente non iscritto) data: 28/11/2009

    Dimenticavo una semplicissima cosa: l'inserimento della nuova funzione, eccola!
     
    Function Trova2Condiz(WS$, Zona1, cond1, Zona2, cond2, Offset)  ' TROVA Risultato di 2 CONDIZIONI in Campo Offset
    Numrighe = ContaRighe(WS$, 1, 3)
    For f = 1 To Numrighe
        Cella1 = Trim(UCase(Cells(f, Zona1.Column)))
        Cella2 = Trim(UCase(Cells(f, Zona2.Column)))
        If Cella1 = Trim(UCase(cond1)) And Cella2 = Trim(UCase(cond2)) Then
            Cella$ = Cells(f, Offset).Value
            Exit For
        End If
    Next f
    Trova2Condiz = Cella$
    End Function 'Trova2Condiz