Condividi:        

Macro per nascondere/scoprire righe in base a valore cella

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Macro per nascondere/scoprire righe in base a valore cella

Postdi MKino8 » 27/10/17 01:25

Salve a tutti, ho un problemino, avrei bisogno di un aiuto per effettuare un'azione particolare su excel 2016.
Ho un modello per fattura interattivo e vorrei fare in modo che in base al valore contenuto in una cella, si nascondano o si riscoprano alcune righe sottostanti.
Tutto ciò in modo automatico, senza forzare l'azione con pulsanti.
Esempio:
Ho la cella B10 che contiene un valore testuale e le righe 15 e 16 non sono visibili, perciò nascoste, se questo valore cambia con un altro allora tali righe diventano visibili e scoperte, e viceversa se si rimette tale valore iniziale.

Essendo però neofita con il mondo di excel e del VB non saprei bene come fare, ho visto in giro problemi simili, ma non riesco ad automatizzare il tutto.
Qualcuno mi può dare qualche dritta e spiegare come potrei procedere?
MKino8
Newbie
 
Post: 6
Iscritto il: 27/10/17 01:12

Sponsor
 

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi Anthony47 » 27/10/17 14:33

Ciao MKino8, benvenuto nel forum.
Hai descritto in modo vago quel che devi fare, quindi la risposta non puo' che essere vaga...
Esempio:
Ho la cella B10 che contiene un valore testuale e le righe 15 e 16 non sono visibili, perciò nascoste, se questo valore cambia con un altro allora tali righe diventano visibili e scoperte, e viceversa se si rimette tale valore iniziale.

Prova con questa macro:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim arRange, aFrasi
'
If Target.Address = "$B$10" Then
    aFrasi = Array("prima", "seconda", "terza frase", "Quarta frase")   '<<< Le frasi
    arRange = Array("20:22", "25:26", "18:19,23:23", "28:29,33:34")     '<<< Le righe che nascondono
    For I = 0 To UBound(arRange)
        If InStr(1, Target.Value, aFrasi(I), vbTextCompare) > 0 Then
            Rows(arRange(I)).Hidden = True
        Else
            Range(arRange(I)).EntireRow.Hidden = False
        End If
    Next I
End If
End Sub

Va messa nel "modulo vba del foglio su cui lavori"; per questo, partendo da Excel:
-tasto dx sul tab col nome del foglio su cui lavori, scegli Visualizza codice
-copi il codice e lo incolli nel frame destro vuoto dell'editor delle macro che si e' aperto
Le righe marcate <<< vanno personalizzate come da commento; in pratica ogni frase scritta in aFrasi comanda il "nascondimento" delle righe indicare in arRange (se trovata all'interno della cella B10, le righe vengono nascoste; se non trovata le righe vengono visualizzate). Questo avviene tutte le volte che la cella B10 viene modificata da tastiera.

E' possibile "cablare" in B10 piu' di una frase, nel qual caso ogni corrispondente gruppo di righe verra' nascosto.

Prova a personalizzarla per il tuo scopo; e se ti areni, spiega che cosa hai fatto, cosa hai ottenuto, che cosa non hai ottenuto, oltre a spiegare con "maggiori dettagli" la tua richiesta.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi Zer0Kelvin » 27/10/17 14:36

Ciao.
Puoi usare l'evento Worksheet_Change (che si verifca ogni volta che si modifica una cella) e la proprietà Hidden che determina se un intervallo è nascosto.
Un piccolo esempio:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B10")) Is Nothing Then
        If Range("B10") = "pippo" Then
            Rows("15:16").Hidden = True
        Else
            Rows("15:16").Hidden = False
        End If
    End If
End Sub
**EDIT**
Ciao Antony, risposte quasi contemporanee... :roll:
Edit: E stavo scrivendo anche io lo stesso commento... Meno male che le risposte sono anche simili, eh eh
Anthony
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi MKino8 » 29/10/17 17:56

Anthony47 ha scritto:Ciao MKino8, benvenuto nel forum.
Hai descritto in modo vago quel che devi fare, quindi la risposta non puo' che essere vaga...
Esempio:
Ho la cella B10 che contiene un valore testuale e le righe 15 e 16 non sono visibili, perciò nascoste, se questo valore cambia con un altro allora tali righe diventano visibili e scoperte, e viceversa se si rimette tale valore iniziale.

Prova con questa macro:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim arRange, aFrasi
'
If Target.Address = "$B$10" Then
    aFrasi = Array("prima", "seconda", "terza frase", "Quarta frase")   '<<< Le frasi
    arRange = Array("20:22", "25:26", "18:19,23:23", "28:29,33:34")     '<<< Le righe che nascondono
    For I = 0 To UBound(arRange)
        If InStr(1, Target.Value, aFrasi(I), vbTextCompare) > 0 Then
            Rows(arRange(I)).Hidden = True
        Else
            Range(arRange(I)).EntireRow.Hidden = False
        End If
    Next I
End If
End Sub

Va messa nel "modulo vba del foglio su cui lavori"; per questo, partendo da Excel:
-tasto dx sul tab col nome del foglio su cui lavori, scegli Visualizza codice
-copi il codice e lo incolli nel frame destro vuoto dell'editor delle macro che si e' aperto
Le righe marcate <<< vanno personalizzate come da commento; in pratica ogni frase scritta in aFrasi comanda il "nascondimento" delle righe indicare in arRange (se trovata all'interno della cella B10, le righe vengono nascoste; se non trovata le righe vengono visualizzate). Questo avviene tutte le volte che la cella B10 viene modificata da tastiera.

E' possibile "cablare" in B10 piu' di una frase, nel qual caso ogni corrispondente gruppo di righe verra' nascosto.

Prova a personalizzarla per il tuo scopo; e se ti areni, spiega che cosa hai fatto, cosa hai ottenuto, che cosa non hai ottenuto, oltre a spiegare con "maggiori dettagli" la tua richiesta.

Ciao


Grazie mille per l'aiuto, non ho risposto subito perché ieri ero a lavoro tutto il giorno.
Ho capito perfettamente come fare, adesso funziona tutto come pensavo.

un'altra domanda, se questo script lo voglio funzionante su tutti i fogli come si fa?

Grazie ancora per l'aiuto.
A presto
MKino8
Newbie
 
Post: 6
Iscritto il: 27/10/17 01:12

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi Anthony47 » 29/10/17 19:25

Cancella la macro dal modulo in cui l'hai inserita; cerca, nel frame intestato Progetto-VBAProject dell'editor delle macro, il modulo "Questa_cartella_di_lavoro" e aprilo con doppioclick.
Inserisci in questo modulo il codice gia' suggerito, modificando pero' la prima riga in questo modo:
Codice: Seleziona tutto
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim arRange, aFrasi
'
If Target.Address = "$B$10" Then
'etc etc

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi MKino8 » 30/10/17 01:02

Ok, grazie!
MKino8
Newbie
 
Post: 6
Iscritto il: 27/10/17 01:12

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi fabio.dichiara » 05/04/18 16:24

Buona sera a tutti. Ho trovato molto utile la macro proposta da Anthony47 che riporto di seguito ma purtroppo gira solo se aFrasi e arRange sono sullo stesso foglio. A questo punto però vi chiedo come posso fare per richiamare le frasi dal Foglio1 e nascondere le righe dal Foglio2? In particolare vorrei che se A1 del Foglio1 è "prima" allora deve nascondere le righe del Foglio2 20:29 e se A2 del Foglio1 (quindi altra cella) è "seconda" allora deve nascondere le righe del Foglio2 25:29. Spero sia chiaro..
Grazie
Fabio

Codice: Seleziona tutto
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim arRange, aFrasi
'
If Target.Address = "$a$1" Then
aFrasi = Array("prima", "seconda", "terza frase", "Quarta frase")   '<<< Le frasi
    arRange = Array("20:22", "25:26", "18:19,23:23", "28:29,33:34")     '<<< Le righe che nascondono
    For I = 0 To UBound(arRange)
        If InStr(1, Target.Value, aFrasi(I), vbTextCompare) > 0 Then
            Rows(arRange(I)).Hidden = True
        Else
            Range(arRange(I)).EntireRow.Hidden = False
        End If
    Next I
End If
End Sub
fabio.dichiara
Newbie
 
Post: 8
Iscritto il: 05/04/18 16:09

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi Anthony47 » 06/04/18 02:11

In questo caso si usera' l'evento Worksheet_Change di Foglio1:
-tasto dx sul tab col nome Foglio1; scegli Visualizza codice
-copia questa macro e incollalo nel frame vuoto dell'editor delle macro che si e' aperto:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
    If Range("A1").Value = "prima" Then
        Sheets("Foglio2").Rows("20:29").Hidden = True
    Else
        Sheets("Foglio2").Rows("20:29").Hidden = False
    End If
ElseIf Target.Address = "$A$2" Then
    If Range("A2").Value = "seconda" Then
        Sheets("Foglio2").Rows("20:29").Hidden = False
        Sheets("Foglio2").Rows("25:29").Hidden = True
    Else
        Sheets("Foglio2").Rows("25:29").Hidden = False
    End If
End If
End Sub

A questo punto torna su Foglio1; quando in A1 verra' inserito "prima" si nascondono alcune righe di Foglio2, e quando in A2 si scrive "seconda" si nasconderanno altre righe. Un nuovo evento ha il sopravvento su un evento precedente.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi fabio.dichiara » 06/04/18 10:43

Anthony grazie mille. Funziona molto bene ma risulta macchinosa considerando il seguente caso.
Supponiamo che se A1 Foglio1 è "" e A2 Foglio1="" voglio nascondere le righe 17:29 del Foglio2. mentre se in Foglio1 A1 è <> da"" e A2="" allora voglio nascondere solo le righe 24:29 del Foglio2. Se ho in un determinato momento A2="" e A3="" e premo canc su A3 mi nasconde solo il range 24:29 mentre essendo anche a2="" dovrebbe nascondermi le righe 17:29. Questo si verifica perche come da te detto 'un nuovo evento ha il sopravvento sul precedente'. Secondo te è migliorabile in questo senso? E' solo una sfumatura ma se non è fattibile sono comunque molto soddisfatto della tua soluzione.
Grazie mille
Fabio
fabio.dichiara
Newbie
 
Post: 8
Iscritto il: 05/04/18 16:09

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi fabio.dichiara » 06/04/18 14:40

Il codice è questo...
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$2" Then
If Range("A2").Value = "" Then
Sheets("Foglio2").Rows("17:29").Hidden = True
Else
Sheets("Foglio2").Rows("17:29").Hidden = False
End If
ElseIf Target.Address = "$A$3" Then
If Range("A3").Value = "" Then
Sheets("Foglio2").Rows("17:29").Hidden = False
Sheets("Foglio2").Rows("24:29").Hidden = True
Else
Sheets("Foglio2").Rows("24:29").Hidden = False
End If
End If
End Sub
fabio.dichiara
Newbie
 
Post: 8
Iscritto il: 05/04/18 16:09

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi Anthony47 » 06/04/18 15:09

Allora elimina la precedente Sub Worksheet_Change e prova questa variante:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim primaH As String, secoH As String, myC As Range
'
primaH = "20:29"    '<<< Nascondi su PRIMA
secoH = "10:21"     '<<< Nascondi su SECONDA
'
For Each myC In Target
    If myC.Address = "$A$1" Or myC.Address = "$A$2" Then
        Sheets("Foglio2").Rows(primaH).Hidden = False
        Sheets("Foglio2").Rows(secoH).Hidden = False
        If Range("A1").Value = "prima" Then Sheets("Foglio2").Rows(primaH).Hidden = True
        If Range("A2").Value = "seconda" Then Sheets("Foglio2").Rows(secoH).Hidden = True
    End If
Next myC
End Sub

Le righe marcate <<< vanno personalizzate come da commento

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi fabio.dichiara » 06/04/18 20:15

Grazie mille Anthony! Il codice funzione alla grande mettendo "" al posto di "prima" e "seconda".

Fabio
fabio.dichiara
Newbie
 
Post: 8
Iscritto il: 05/04/18 16:09

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi fabio.dichiara » 16/04/18 13:10

Buongiorno Anthony47,

avrei un'altra richiesta. Nella stessa cartella di lavoro vorrei una macro che oltre alla seguente istruzione che funziona benissimo, faccia anche quest'altra operazione interamente sul Foglio 1: Se E1="si" (selezionato ma convalida ad elenco) allora nascondi interamente le colonne da F:I. Se G1="Si" (selezionato ma convalida ad elenco) nascondi interamente le colonne da H:I. Il codice è da integrare al seguente che invece opera su Foglio1 e Foglio2:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim primaH As String, secoH As String, myC As Range
'
primaH = "20:28" '<<< Nascondi su PRIMA
secoH = "30:38" '<<< Nascondi su SECONDA
'
For Each myC In Target
If myC.Address = "$B$4" Or myC.Address = "$B$5" Then
Sheets("Foglio2").Rows(primaH).Hidden = False
Sheets("Foglio2").Rows(secoH).Hidden = False
If Range("B4").Value = "" Then Sheets("Foglio2").Rows(primaH).Hidden = True
If Range("B5").Value = "" Then Sheets("Foglio2").Rows(secoH).Hidden = True
End If
Next myC
End Sub

Grazie mille

Fabio
fabio.dichiara
Newbie
 
Post: 8
Iscritto il: 05/04/18 16:09

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi Anthony47 » 17/04/18 14:04

Mutuando lo stesso approccio usato nella prima parte, modifica la Sub Worksheet_Change di Foglio1 come segue:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim primaH As String, secoH As String, myC As Range
'
primaH = "20:28" '<<< Nascondi su PRIMA
secoH = "30:38" '<<< Nascondi su SECONDA
'
For Each myC In Target
    If myC.Address = "$B$4" Or myC.Address = "$B$5" Then
        Sheets("Foglio2").Rows(primaH).Hidden = False
        Sheets("Foglio2").Rows(secoH).Hidden = False
        If Range("B4").Value = "" Then Sheets("Foglio2").Rows(primaH).Hidden = True
        If Range("B5").Value = "" Then Sheets("Foglio2").Rows(secoH).Hidden = True
    End If
Next myC

primaE1 = "F:I" '<<< Nascondi su Si in E1
secoG1 = "H:I" '<<< Nascondi su Si in G1
'
For Each myC In Target
    If myC.Address = "$E$1" Or myC.Address = "$G$1" Then
        Range(primaE1).EntireColumn.Hidden = False
        Range(secoG1).EntireColumn.Hidden = False
        If Range("E1").Value = "Si" Then Range(primaE1).EntireColumn.Hidden = True
        If Range("G1").Value = "Si" Then Range(secoG1).EntireColumn.Hidden = True
    End If
Next myC
End Sub

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per nascondere/scoprire righe in base a valore cel

Postdi fabio.dichiara » 17/04/18 14:29

Grazie ancora 8)
fabio.dichiara
Newbie
 
Post: 8
Iscritto il: 05/04/18 16:09


Torna a Applicazioni Office Windows


Topic correlati a "Macro per nascondere/scoprire righe in base a valore cella":


Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti