Macro per nascondere colonne in excel a seconda di un filtro

Anonimo
2018-05-08T12:35:53+00:00

Buongiorno,

ho un file in excel che serve per mantenere aggiornato un database di articoli.

Per via della complessità di compilazione di questo file volevo fare in modo che a seconda di un filtro mi appaiano solo le colonne corrispondenti alla categoria dell'articolo.

Posto un file di esempio in modo da capire meglio di cosa si tratta:

https://www.dropbox.com/s/a4sk6iwn3io5o16/file%20prova.xlsx?dl=0

In pratica vorrei che una volta fatto il filtro sulla colonna delle categorie (colonna C) mi apparissero solo le colonne che hanno una "X" nella riga corrispondente a quella categoria.

ad esempio, faccio un filtro sulla categoria "FA-023-POLO" e mi appare quello che vedete qui sotto:

La riga corrispondete alla categoria selezionata è la "5".

con questo filtro la colonna "V" (e tutte quelle che non hanno la X nella riga 5) vorrei venisse nascosta.

Grazie per il supporto!

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
2018-06-18T14:04:20+00:00

Ciao Matteo,

Oltre all'ottimo consiglio di Francesca_F, ossia:

Per questa richiesta, relativa alla creazione di una macro su Excel, ti invito ad aprire una richiesta sul nostro forum gemello MSDN. Si tratta di una Community di sviluppatori, che saranno entusiasti di assisterti!

credo che ci siano numerosi esperti qui che possono aiutarti con qualunque problema relativo ad Excel.

Per quanto riguarda la tua specifica domanda, vorrei proporre una modifica, molto leggera, del codice che io ebbi suggerito l'anno scorso a Lblu:

  • Inserisci un nuovo foglio
  • Nella cella A1 del nuovo foglio, immetti la formula

=SUBTOTALE(3;FiltroAutomatico)

  • Fai clic dx sulla linguetta del nuovo foglio
  • Seleziona l'opzione Visualizza Codice dal menu contestuale risultante
  • Incolla il seguente codice:

'=========>>

Option Explicit

'--------->>

Private Sub Worksheet_Activate()

    Me.Visible = xlSheetVeryHidden

End Sub

'--------->>

Private Sub Worksheet_Calculate()

    Call NascondeColonneVuote

End Sub

'<<=========

  • Fai clic dx sulla linguetta del foglio del filtro automatico
  • Seleziona l'opzione Visualizza Codicedal menu contestuale risultante
  • Incolla il seguente codice:

'=========>>

Public Sub CancellaFiltri()

    With ActiveSheet

        If .FilterMode Then

            .AutoFilter.ShowAllData

        End If

    End With

End Sub

'<<=========

'--------->>

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim oName As Name

    If Me.AutoFilterMode Then

        Set RngAutoFilter = Me.AutoFilter.Range

        Set oName = ThisWorkbook.Names.Add( _

                    Name:="FiltroAutomatico", _

                    RefersTo:=RngAutoFilter)

    End If

End Sub

'<<=========

  • Alt+IM per inserire un nuovo modulo di codice
  • Nel nuovo modulo vuoto, incolla il seguente codice:

'=========>>

Option Explicit

Public RngAutoFilter As Range

Public Const sFoglioAutoFilter As String = "Foglio1" '<<=== Modifica

'--------->>

Public Sub NascondeColonneVuote()

    Dim WB As Workbook

    Dim SH As Worksheet

    Dim RngAutoFilter As Range, RngDati As Range, rngVisible As Range

    Dim rCell As Range, rCol As Range

    Dim bHidden As Boolean

    Set WB = ThisWorkbook

    Set SH = WB.Sheets(sFoglioAutoFilter)

    Set RngAutoFilter = SH.AutoFilter.Range

    If Not RngAutoFilter Is Nothing Then

        On Error GoTo XIT

        Application.ScreenUpdating = False

        With RngAutoFilter

            Set RngDati = .Offset(1, 1).Resize(.Rows.Count - 1, _

                                               .Columns.Count - 1)

            .EntireColumn.Hidden = False

        End With

        On Error Resume Next

        RngAutoFilter.EntireColumn.Hidden = False

        Set rngVisible = RngDati.SpecialCells(xlCellTypeVisible)

        For Each rCol In RngDati.Columns

            For Each rCell In rCol.Cells

                With rCell

                    If .EntireRow.Hidden = False Then

                        bHidden = .Value = vbNullString

                        If Not bHidden Then Exit For

                    End If

                End With

            Next rCell

            rCol.EntireColumn.Hidden = bHidden

        Next rCol

    End If

XIT:

    Application.ScreenUpdating = True

End Sub

'--------->>

Public Sub VisualizzaColonne()

    Dim Rng As Range

    Set Rng = ActiveSheet.AutoFilter.Range

    If Not Rng Is Nothing Then

        Rng.EntireColumn.Hidden = False

    End If

End Sub

'--------->>

Public Sub CancellaFiltri()

    With ActiveSheet

        If .FilterMode Then

            .AutoFilter.ShowAllData

        End If

    End With

End Sub

'<<=========

  • Ctrl+R per accedere alla finestra Project Explorer ('Gestione progetti')
  • Fai doppio clic sul modulo ThisWorkbook (Questa_cartella_di_Lavoro) del file e incolla il seguente codice:

'=========>>

Option Explicit

'--------->>

Private Sub Workbook_Open()

    Dim SH As Worksheet

    Dim oName As Name

    Set SH = Me.Sheets(sFoglioAutoFilter)

    With SH

        If .AutoFilterMode Then

            Set RngAutoFilter = .AutoFilter.Range

            Set oName = ThisWorkbook.Names.Add( _

                        Name:="FiltroAutomatico", _

                        RefersTo:=RngAutoFilter)

        End If

    End With

End Sub

'<<========= 

  • Alt+Q per chiudere l'editor di VBA e tornare a Excel
  • Salva il file con l’estensione xlsm

Potresti scaricare il mio file di prova Matteo20180618.xlsm

===

Regards,

Norman

La risposta è stata utile?

3 persone hanno trovato utile questa risposta.
0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-06-22T12:17:53+00:00

    Ciao Matteo,

    Fantastico!

    proprio quello che mi serviva!

    Grazie mille Norman!

    Mi fa piacere che tu abbia risolto il problema e ti ringrazio per il cortese riscontro.

    Alla prossima.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-06-22T12:13:54+00:00

    Fantastico!

    proprio quello che mi serviva!

    Grazie mille Norman!

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-06-18T09:03:27+00:00

    Ciao Matteo,

    Grazie per l'attesa. Per questa richiesta, relativa alla creazione di una macro su Excel, ti invito ad aprire una richiesta sul nostro forum gemello MSDN. Si tratta di una Community di sviluppatori, che saranno entusiasti di assisterti!

    Facci sapere.

    Rimaniamo a tua disposizione.

    Francesca

    La risposta è stata utile?

    0 commenti Nessun commento