Risolto Ricerca testo in senso orizzontale ed estrazione della posizione

Dindo

Utente junior
4 Gennaio 2020
35
6
2019
1
Buonasera,
nel file allegato sono presenti 4 colonne di testo.
Cliccando sul pulsante vengono caricate nella Combobox le voci presenti nella colonna B con intestazione "Colonna 2".

Se un domani venisse inserita una nuova colonna tra la A e la B, l'attuale colonna B si trasformerebbe in C.
Di conseguenza, cliccando sul pulsante, non verrebbero più caricate le voci riferite all'intestazione "Colonna 2".
Mi chiedevo quindi se ci sarebbe modo, prima di far caricare le voci alla Combobox, di far cercare nella riga 1 l'intestazione "Colonna 2 " e, una volta trovata, estrapolarne la lettera della colonna di corrispondenza assegnandola ad una variabile da utilizzare successivamente per il caricamento delle voci.
 

Allegati

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
21.636
1.713
66
Napoli
2019 Pro Plus
440
Con un WorksheetFunction.Match (Confronta) determini in quale colonna è presente la stringa Colonna2 e sulla base di questa imposti il range da cui alimentare la combo.
 

cromagno

Excel/VBA Expert
Supermoderatore
Expert
9 Agosto 2015
6.800
183
39
Sardegna
2013 (64 bit)
259
Ciao,
un modo potrebbe essere questo:

Visual Basic:
Private Sub cmdPulsante_Click()
    Dim y As Integer
    Dim CorrectCol As Range
   
    cboCombo.Clear
    Set CorrectCol = Rows(1).Find("COLONNA 2", , xlValues, xlWhole)
    If Not CorrectCol Is Nothing Then
        For y = 2 To CorrectCol.End(xlDown).Row
            cboCombo.AddItem CorrectCol.Offset(y - 1, 0)
        Next
    End If
End Sub
N.B.
ricorda di di cancellare la lista della combobox prima di caricarne una nuova:
cboCombo.Clear
 
  • Like
Reactions: alfrimpa

scossa

Excel/VBA Expert
Moderatore
Expert
14 Luglio 2015
1.284
48
59
Verona Provincia
scossavr.altervista.org
.
10
Ciao,

oltre alla soluzione di cromagno (che saluto), puoi creare i seguenti "nomi"

Visual Basic:
Nome        Riferito a
COLONNA1     =Foglio1!$A$1:$A$40
COLONNA2     =Foglio1!$B$1:$B$40
COLONNA3     =Foglio1!$C$1:$C$40
COLONNA4     =Foglio1!$D$1:$D$40
quindi la tua sub diventa:

Visual Basic:
Private Sub cmdPulsante_Click()

    Dim y As Long
        
    For y = 2 To [COLONNA2].SpecialCells(xlCellTypeConstants).Rows.Count
        cboCombo.AddItem [COLONNA2].Cells(y, 1).Text
    Next
End Sub
Qualsiasi colonna aggiungerai tra le altre le colonne "nominate" avranno sempre il giusto riferimento.
 

Allegati

Dindo

Utente junior
4 Gennaio 2020
35
6
2019
1
Alfrimpa potresti farmi vedere come andrebbe scritto il codice per utilizzare la funzione WorksheetsFunctionMatch ?
Ho provato a pasticciare con il codice ma non sono riuscito a farlo digerire a Vb.

Cromagno, il tuo codice funziona perfettamente.
Potresti spiegarmi la funzione Find relativamente ai 4 parametri che deve contenere ?
Il primo è il testo della cella da cercare, il secondo è stato omesso (cosa potrebbe contenere?), e gli altri 2 (xlValues - xlWhole)

Scossa proverò anche il tuo codice domani.

Grazie a tutti e 3 indistintamente.
Lascio la coppa a Cromagno in quanto ho già collaudato il suo codice.
 

Dindo

Utente junior
4 Gennaio 2020
35
6
2019
1
Con un WorksheetFunction.Match (Confronta) determini in quale colonna è presente la stringa Colonna2 e sulla base di questa imposti il range da cui alimentare la combo.
Alfrimpa ho provato a scrivere il seguente codice ma va in errore.
Ho provato anche a cambiare la variabile "pippo" in As Range.


Visual Basic:
Private Sub cmdPulsante_Click()

    Dim pippo As Integer
    pippo = Application.WorksheetFunction.Match(Range("COLONNA 2"), Range("A1:AA1"), 0)
  
    MsgBox pippo

End Sub
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
21.636
1.713
66
Napoli
2019 Pro Plus
440
No devi scrivere

Visual Basic:
pippo = Application.WorksheetFunction.Match("COLONNA 2", Range("A1:AA1"), 0)
perchè stai ricercando una stringa; un range denominato "Colonna 2" non esiste

Se mettessi "Colonna 2" in un'altra cella es. D1 potresti scrivere

Visual Basic:
pippo = Application.WorksheetFunction.Match(Range("D1", Range("A1:AA1"), 0)
 

Dindo

Utente junior
4 Gennaio 2020
35
6
2019
1
Grazie Alfrimpa...nel frattempo che hai scritto la risposta avevo trovato anch'io l'errore.
Ora però mi resta la difficoltà più grossa.
Ovvero quella di sfruttare il valore 2 restituito nella mia istruzione originale (che riporto di seguito) per far caricare le voci alla Combobox.
Come devo modificarla per fargli capire qual'è la colonna?
Perchè la ricerca mi ha restituito un numero e non una lettera.


Visual Basic:
    For y = 2 To Range("B1").End(xlDown).Row
        cboCombo.AddItem Range("B" & y).Text
    Next
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
21.636
1.713
66
Napoli
2019 Pro Plus
440
Questa è la macro

Visual Basic:
Private Sub CommandButton1_Click()
Dim i As Long
Dim ur As Long
Dim col As Integer
col = WorksheetFunction.Match("Colonna 2", Range("A1:d1"), 0)
ur = Cells(Rows.Count, col).End(xlUp).Row
cboCombo.Clear
For i = 2 To ur
    cboCombo.AddItem Cells(i, col).Value
Next i
End Sub
studiala (soprattutto con riferimento all'istruzione Cells) e cerca di capire come opera.
 
  • Like
Reactions: Dindo

Dindo

Utente junior
4 Gennaio 2020
35
6
2019
1
A dimostrazione che ho capito la logica della tua formula mostro la mia interpretazione.

Ho sostituito il Range dello spazio in cui cercare la stringa "COLONNA 2" con l'intera riga Rows (1) in modo che in qualsiasi punto verrà rilevata.
Capita poi la possibilità di applicare la funzione End(xl.....) ad una Cells dove, a differenza di Range, le colonne sono indicate con un numero invece che con una lettera, l'ho utilizzata direttamente nel ciclo For.

Ma soprattutto..... GRAZIE!!!

Codice:
Private Sub cmdPulsante_Click()

Dim y As Integer
Dim NColonna As Integer

NColonna = WorksheetFunction.Match("COLONNA 3", Rows(1), 0)

cboCombo.Clear
For y = 2 To Cells(1, NColonna).End(xlDown).Row
    cboCombo.AddItem Cells(y, NColonna).Value
Next
   
End Sub
 
Ultima modifica di un moderatore:

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!