Trovare il numero di riga della cella attiva in un elenco filtrato

Anonimo
2021-12-09T16:30:14+00:00

Applico un filtro ad una tabella che mi restituisce 7 righe

Mi posiziono sulla quarta riga (delle 7 filtrate)

Quale codice vba mi restituisce 4 riferito alla cella attiva ?

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
Risposta accettata dall'autore della domanda
Anonimo
2021-12-16T08:17:28+00:00

Ciao Antonio,

Certamente Norman, pensavo fosse doveroso e carino terminare questo thread caricando il file a cui sto' lavorando

Con questa ultima modifica il file acquista un minimo di funzionalità,

Norman 16122021.xlsm

Non riesce lo stesso a salire di UNA riga, la variabile "i" raggiunge lo Zero, secondo me non viene bloccato il ciclo appena trova la prima riga non nascosta. Ho provato a piazzare qua e là un "EXIT FOR" ma niente e non riesco a capire dove va messo

Ho caricato il tuo file e, con riferimento all'uso del pulsante Precedente, vedo subito due problemi col codice nella tua procedura cmdPrecedente_Click:

  • Poiché hai disattivato quella porzione di codice che identifica il record filtrato attualmente selezionato, il valore della variabile i sarà sempre zero e, quindi, il ciclo per selezionare il record filtrato precedente verrà sempre bypassato: 0 sarà sempre meno di 1!!
  • Anche riattivando il codice di cui sopra, il ciclo per selezionare il record precedente uscirà sempre al primo passo perché hai inserito l'istruzione Exit For nel posto sbagliato. Pertanto, sostituisci: For k = i - 1 To 1 Step -1
      If Rng.Rows(k).Hidden = False Then 
    
          Rng.Cells(k, 1).Select 
    
      End If 
    
      **Exit For** 
    
    Next k

con:

For k = i - 1 To 1 Step -1 

    If Rng.Rows(k).Hidden = False Then 

        Rng.Cells(k, 1).Select 

        Exit For 

    End If 

Next k 

In questo modo il codice uscirà dal ciclo solo quando verrà identificato il record precedente.

Con queste due modifiche viene identificato il pulsante funzioni e il record precedente

Per completezza, la procedura di interesse diventa:

'========>>

Private Sub cmdPrecedente_Click()

Dim SH As Worksheet 

Dim Rng As Range, Rng2 As Range 

Dim oTabella As ListObject 

Dim i As Long, j As Long, k As Long 

Dim l As Long, m As Long 

Const sTabella As String = "Anagrafica"      '<<=== Modifica 

Const sFoglio As String = "BaseDati"          '<<=== Modifica 

Set oTabella = ActiveSheet.ListObjects(sTabella) 

Set Rng = oTabella.DataBodyRange 

On Error Resume Next 

Set Rng2 = Rng.SpecialCells(xlCellTypeVisible) 

On Error GoTo 0 

' In quale righa è la cella attiva ? 

**For i = 1 To Rng.Rows.Count** 

    **If Rng.Rows(i).Hidden = False Then** 

        **j = j + 1** 

        **If Rng.Rows(i).Row = ActiveCell.Row Then** 

            **TextRigaAttiva = j** 

            **Exit For** 

        **End If** 

    **End If** 

**Next i** 

'salire di una riga 

For k = i - 1 To 1 Step -1 

    If Rng.Rows(k).Hidden = False Then 

        Rng.Cells(k, 1).Select 

        **Exit For** 

    End If 

Next k 

UserForm\_Activate 

End Sub

'<<========

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2021-12-14T18:49:32+00:00

Ciao Antonio,

Ho 2 pulsanti nella Userform "precedente "successivo" che scendono e salgono di una riga nell'elenco filtrato.

Ovviamente

Rng2.ActiveCell.Offset(1, 0).Activate

non funziona!!

Come indicato in precedenza, per gestire le celle successive in una tabella filtrata, è necessario ciclare la tabella, identificando le celle visibili.

Quindi, sempre con riferimento al codice che ho postato in precedenza, per selezionare la cella successiva nella tabella filtrata, dovresti provare qualcosa del genere, in cui il codice aggiuntivo è evidenziato in grassetto:

'========>>

Option Explicit

'-------->>

Public Sub Tester()

Dim SH As Worksheet 

Dim Rng As Range, Rng2 As Range 

Dim oTabella As ListObject 

Dim i As Long, j As Long, **k As Long** 

Dim iRow As Long 

Const sTabella As String = "Tabella1"      '&lt;&lt;=== Modifica 

Set oTabella = ActiveSheet.ListObjects(sTabella) 

If oTabella.AutoFilter Is Nothing Then 

    Call MsgBox(Prompt:="Nessun filtro automatico esiste per la tabella " & sTabella & "!", \_ 

        Buttons:=vbCritical, \_ 

        Title:="REPORT") 

    Exit Sub 

End If 

If oTabella.AutoFilter.FilterMode = False Then 

    Call MsgBox(Prompt:="La tabella " & sTabella & " non è stata filtrata!", \_ 

        Buttons:=vbCritical, \_ 

        Title:="REPORT") 

    Exit Sub 

End If 

Set Rng = oTabella.DataBodyRange 

On Error Resume Next 

Set Rng2 = Rng.SpecialCells(xlCellTypeVisible) 

On Error GoTo 0 

If Rng2 Is Nothing Then 

    Call MsgBox(Prompt:="Non ci sono righe visibili nella tabella", \_ 

        Buttons:=vbCritical, \_ 

        Title:="REPORT") 

    Exit Sub 

End If 

If Intersect(Rng2, ActiveCell) Is Nothing Then 

    With oTabella.DataBodyRange 

        .Rows(1).Hidden = False 

        .Cells(1, 1).Select 

    End With 

End If 

For i = 1 To Rng.Rows.Count

    If Rng.Rows(i).Hidden = False Then 

        Debug.Print Rng.Rows(i).Cells(1).Value 

        j = j + 1 

        If Rng.Rows(i).Row = ActiveCell.Row Then 

            Call MsgBox(Prompt:="La cella attiva si trova sulla riga " & j & " della tabella filtrata.", \_ 

                Buttons:=vbInformation, \_ 

                Title:="REPORT") 

            Exit For 

        End If 

    End If 

Next i 

**For k = i + 1 To Rng.Rows.Count** 

    **If Rng.Rows(k).Hidden = False Then** 

        **Rng.Cells(k, 1).Select** 

            **Exit For** 

    **End If** 

**Next k** 

End Sub

'<<========

NB E' possibile trovare una RISORSA che chiarisca la gerarchia degli oggetti Excel e relativi metodi e proprietà applicabili??

  • Qualsiasi buon libro su VBA per Excel sarà utile
  • Dopo aver definito una variabile oggetto, digitando un punto dopo la variabile verrà prodotto un elenco a discesa intellisense delle proprietà e dei metodi degli oggetti.

  • Un altro riferimento utile è fornito dalla risorsa della guida in linea di VBA

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2021-12-10T10:43:18+00:00

Ciao Antonio,

Come indicato nella mia precedente risposta poco fa, non ho mai avuto bisogno di determinare le informazioni da tei originariamente richieste e sarei sorpreso se non fosse possibile adottare un approccio diverso che precludesse tale necessità.

If Intersect(Rng2, ActiveCell) Is Nothing Then

Call MsgBox(Prompt:="La cella attiva non è nell'intervallo della tabella filtrata", _

Buttons:=vbCritical, _

Title:="REPORT")

Exit Sub

se la cella attiva non è all'interno della tabella mi servirebbe che si spostasse la cella attiva sulla prima riga della prima colonna dell'elenco filtrato.

ActiveSheet.ListObjects(sTabella).DataBodyRange.Rows(1).Hidden = False

Cells(0,1).select

Può essere giusto o c'è un modo migliore ?

Ho un problema intrinseco con qualsiasi codice che potenzialmente scopra una riga filtrata senza modificare il filtro originale ma, se sei determinato ad adottarlo, penso che puoi sostituire la parte di codice citata con:

If Intersect(Rng2, ActiveCell) Is Nothing Then 

    With oTabella.DataBodyRange 

        .Rows(1).Hidden = False 

        .Cells(1, 1).Select 

    End With 

End If 

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2021-12-09T18:05:15+00:00

Ciao Antonio,

Applico un filtro ad una tabella che mi restituisce 7 righe

Mi posiziono sulla quarta riga (delle 7 filtrate)

Quale codice vba mi restituisce 4 riferito alla cella attiva ?

Supponendo che la tabella sia una tabella di Excel, prova qualcosa del genere:

'========>>

Option Explicit

'-------->>

Public Sub Tester()

Dim SH As Worksheet 

Dim Rng As Range, Rng2 As Range 

Dim oTabella As ListObject 

Dim i As Long, j As Long 

Const sTabella As String = "Tabella1"      '&lt;&lt;=== Modifica 

Set oTabella = ActiveSheet.ListObjects(sTabella) 

If oTabella.AutoFilter Is Nothing Then 

    Call MsgBox(Prompt:="Nessun filtro automatico esiste per la tabella " & sTabella & "!", \_ 

        Buttons:=vbCritical, \_ 

        Title:="REPORT") 

    Exit Sub 

End If 

If oTabella.AutoFilter.FilterMode = False Then 

    Call MsgBox(Prompt:="La tabella " & sTabella & " non è stata filtrata!", \_ 

        Buttons:=vbCritical, \_ 

        Title:="REPORT") 

    Exit Sub 

End If 

Set Rng = oTabella.DataBodyRange 

On Error Resume Next 

Set Rng2 = Rng.SpecialCells(xlCellTypeVisible) 

On Error GoTo 0 

If Rng2 Is Nothing Then 

    Call MsgBox(Prompt:="Non ci sono righe visibili nella tabella", \_ 

        Buttons:=vbCritical, \_ 

        Title:="REPORT") 

    Exit Sub 

End If 

If Intersect(Rng2, ActiveCell) Is Nothing Then 

    Call MsgBox(Prompt:="La cella attiva non è nell'intervallo della tabella filtrata", \_ 

        Buttons:=vbCritical, \_ 

        Title:="REPORT") 

    Exit Sub 

End If 

For i = 1 To Rng.Rows.Count 

    If Rng.Rows(i).Hidden = False Then 

        j = j + 1 

        If Rng.Rows(i).Row = ActiveCell.Row Then 

            Call MsgBox(Prompt:="La cella attiva si trova sulla riga " & j & " della tabella filtrata.", \_ 

                Buttons:=vbInformation, \_ 

                Title:="REPORT") 

            Exit Sub 

        End If 

    End If 

Next i 

End Sub

'<<========

Potresti scaricare il mio file di prova Antonio20211209.xlsm

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

16 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2021-12-09T22:40:22+00:00

    l'avevo già letto sui forum, ma è Incredibile che si debba usare un ciclo per contare le singole righe.

    Con l'UsesrForm sono a buon punto, l'ho fatta appoggiandomi ad AdvancedFilter che ho impostato sulla tabella dati cosi' mi sono facilitato molto la programmazione.

    Grazie Norman

    La risposta è stata utile?

    0 commenti Nessun commento