Condividi tramite

Cerca verticale confrontando due dati

Anonimo
2022-07-31T12:34:46+00:00

Buongiorno,

avrei necessità di popolare una listbox con i corsi e le date di scadenza di una determinata persona.

Ho già una listbox popolata da tutte le persone dell'equipaggio ma il problema risiede nel fatto che l'elenco originale in excel, ha molte righe vuote oppure con intestatione che, ovviamente, non vengono caricate nella listbox.

Se i dati fossero stati uno dietro l'altro avrei risolto facilmente sfruttando l'evento "click" della listbox e la proprietà listindex per andare a puntare i nome selezionato ma ovviamente avendo queste righe vuote non posso usare la proprietà listindex perchè vado a punare una cella diversa da quella deisiderata.

Avevo pensato di usare un cerca verticale a due fattori perchè potrebbe esserci la possibilità di avere due persone a bordo con lo stesso nome.

Spero sia fattibile perchè non posso cambiare l'impostazione del foglio di lavoro.

Anticipatamente ringrazio

Saluti

Giuseppe

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

6 risposte

Ordina per: Più utili
  1. Anonimo
    2022-08-01T11:25:13+00:00

    Ciao Giuseppe,

    Ciao Gianfranco,

    per ora ho risolto così speronda di non avere due nomi uguali.

    Ovviamente attendo il commento di Norman e/o la correzione al codice postato.

    If Main_Form.TabStrip1.Value = 0 Then

    Sheets("STCW_MATRIX").Select

    Cells.Find(What:=Main_Form.LB_Crew.List(Main_Form.LB_Crew.ListIndex, 2), After:=ActiveCell, LookIn:=xlFormulas, LookAt _

    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _

    False, SearchFormat:=False).Select

    ElseIf Main_Form.TabStrip1.Value = 1 Then

    Sheets("MATRIX_DROF_TEC").Select

    Cells.Find(What:=Main_Form.LB_Crew.List(Main_Form.LB_Crew.ListIndex, 2), After:=ActiveCell, LookIn:=xlFormulas, LookAt _

    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _

    False, SearchFormat:=False).Select

    End If

    Non è necessario, o efficiente, cercare nel foglio di lavoro: tutte le informazioni necessarie sono già memorizzate in array che abbiamo già creato!

    Per selezionare automaticamente la cella corrispondente alla persona selezionata nella ListBox:

    Nel modulo di codice standard, sostituisci:

    '========>>

    Option Explicit

    Public ArrDati As Variant

    Public arrDati_Out() As Variant

    Public arrMandatory() As Variant

    Public arrREQUIRED_COURSES_ON_BOARD() As Variant

    Public arrREQUIRED_COURSES_TBD() As Variant

    Public Const sFoglio_Dati_Maritime As String = "STCW_MATRIX"

    Public Const sFoglio_Mandatory_Maritime As String = "STCW_MATRIX_MANDATORY"

    Public Const sFoglio_Dati_Technician As String = "MATRIX_DROF_TEC"

    Public Const sFoglio_Mandatory_Technician As String = "MATRIX_DROF_TEC_MANDATORY"

    '-------->>

    Public Sub Extract_Data(SH_Dati As Worksheet, SH_Mandatory As Worksheet)

    Dim Rng_Dati As Range, Rng_Mandatory As Range

    con:

    '========>>

    Option Explicit

    Public ArrDati As Variant

    Public arrDati_Out() As Variant

    Public arrMandatory() As Variant

    Public arrREQUIRED_COURSES_ON_BOARD() As Variant

    Public arrREQUIRED_COURSES_TBD() As Variant

    Public Rng_Dati As Range

    Public Const sFoglio_Dati_Maritime As String = "STCW_MATRIX"

    Public Const sFoglio_Mandatory_Maritime As String = "STCW_MATRIX_MANDATORY"

    Public Const sFoglio_Dati_Technician As String = "MATRIX_DROF_TEC"

    Public Const sFoglio_Mandatory_Technician As String = "MATRIX_DROF_TEC_MANDATORY"

    '-------->>

    Public Sub Extract_Data(SH_Dati As Worksheet, SH_Mandatory As Worksheet)

    Dim Rng\_Mandatory As Range
    

    Nella procedura LB_Crew_Change nel modulo di codice della Userform, sostituisci:

    arrNomi = Application.Index(ArrDati, 0, 5) 
    

    con:

    arrNomi = Application.Index(ArrDati, 0, 5)    
    
    **Application.Goto Rng\_Dati.Cells(Application.Match(sNome, arrNomi, 0), "E")** 
    

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2022-07-31T21:52:03+00:00

    Ciao Gianfranco,

    per ora ho risolto così speronda di non avere due nomi uguali.

    Ovviamente attendo il commento di Norman e/o la correzione al codice postato.

    If Main_Form.TabStrip1.Value = 0 Then

    Sheets("STCW\_MATRIX").Select 
    
        Cells.Find(What:=Main\_Form.LB\_Crew.List(Main\_Form.LB\_Crew.ListIndex, 2), After:=ActiveCell, LookIn:=xlFormulas, LookAt \_ 
    
             :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= \_ 
    
             False, SearchFormat:=False).Select 
    

    ElseIf Main_Form.TabStrip1.Value = 1 Then

    Sheets("MATRIX\_DROF\_TEC").Select 
    
        Cells.Find(What:=Main\_Form.LB\_Crew.List(Main\_Form.LB\_Crew.ListIndex, 2), After:=ActiveCell, LookIn:=xlFormulas, LookAt \_ 
    
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= \_ 
    
            False, SearchFormat:=False).Select 
    

    End If

    Grazie

    Giuseppe

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Gianfranco55 25,190 Punti di reputazione Moderatore volontario
    2022-07-31T17:10:12+00:00

    ciao

    io con il vba ci bisticcio

    e tenterei di usare un

    For Each CL ...............

    If CL = .......... Then

    ma è meglio che aspetti Norman

    che gìà conosce il codice che hai

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2022-07-31T16:20:49+00:00

    Buongiorno Gianfranco,

    hai perfettamente ragione ed io mi riferivo ad un codice VBA

    Come puoi vedere dall'immagine allegata, questa è la matrice dei corsi che non posso modificare.

    Sfruttando un codice adhoc creato dal buon Norman, ho una listbox che si popola solo se nella colonna "E" esiste il nome.

    Pertanto, nell'esempio specifico, quando viene eseguito il codice e la listbox popolata il primo dato che vedrò nella listbox è "Master DP(OIM) Castellano Giuseppe " (come da esempio allegato).

    Il mio problema è che selezionando una persona dalla listbox come da immagine dovrei selezionare la cella corrispondente, ho sfruttato la proprietà listindex ma ovviamente il risultato non è quello desiderato perchè listindex nel primo dato è "0" che sommato alla riga di partenza "11" la cella selezionata sarà "E11" e non "E14" come da matrice. Lo stesso vale per il marittimo "Pitrola Santo" che sulla matrice si trova in "E19" ma sulla listbox si trova alla terza riga e quindi a listindex 2.

    If Main_Form.TabStrip1.Value = 0 Then

    Sheets("STCW_MATRIX").Range("E" & LB_Crew.ListIndex + 11).Select

    End If

    Spero di essermi chiarito meglio e spero che con un cerca verticale a due condizioni "Professional Role & Surname Name" riesca a risolvere il problema.

    Ovviamente anche qualsiasi altro metodo purchè selezionando dalla listbox un membro dell'equipaggio lo stesso venga selezionato sul foglio di calcolo.

    Grazie

    Giuseppe

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Gianfranco55 25,190 Punti di reputazione Moderatore volontario
    2022-07-31T13:54:30+00:00

    ciao

    dovrei vedere il file

    concateni nome cognome e fai la ricerca su quelli

    es.

    =CERCA.VERT(A1&" "&B1;D1:D10&" "&E1:E10;1;0)

    ma senza un esempio si fa fatica a rispondere

    La risposta è stata utile?

    0 commenti Nessun commento