Condividi:        

Mostrare e Nascondere righe se cella ha un valore

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

Mostrare e Nascondere righe se cella ha un valore

Postdi project4 » 07/11/18 09:09

Buongiorno a tutto il forum e grazie per l'attenzione.
Chiedo aiuto su un file Excel (lavoro con la versione 2010), premetto che di VBA capisco proprio poco quindi chiedo scusa per la mia ignoranza. Detto ciò veniamo al quesito:

vorrei avere delle una serie di righe adiacenti nascoste che vengano mostrate, una alla volta, quando una cella della riga precedente viene riempita con un qualsiasi valore.
Vorrei inoltre che se cancello la cella che ho riempito la riga che si è mostrata torni a nascodersi.

Grazie all'aiuto di altri esperti del mondo VBA sono arrivato ad avere una macro che fa quello che mi serve ma che in una certa situazione mi genera un errore di run-time '13' che non mi so spiegare e che gradirei correggere.
L'errore capita quando vado a selezionare un range di celle adiacenti della colonna A (quelle su cui effettuo i controlli per mostrare/nascondere le righe) e le cancello contemporaneamente.

Ricapitolando se cancello il valore immesso nella cella (es. A6)mi si cancella anche la riga (6) a cui questa appartiene, ma se cancello contemporaneamente più di una cella (es. A6:A10) mi da un errore.

allego il codice di cui parlo:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A4:A20")) Is Nothing Then
Select Case Target.Value
    Case Is <> ""
        Range("a" & Target.Row + 1).EntireRow.Hidden = False  'istruzioni per scoprire la riga
    Case Is = ""
        Range("a" & Target.Row + 1).EntireRow.Hidden = True   'istruzioni per nascondere la riga
End Select
End If
End Sub


e il file di esempio:
http://www.filedropper.com/righenascoste

Grazie per qualunque tipo di aiuto
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Sponsor
 

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi wallace&gromit » 07/11/18 10:05

Ciao, e finalmente benvenuto nel forum giusto :lol: .
Prova con questa macro:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A4:A20")) Is Nothing Then
For i = 20 To 4 Step -1
    If Cells(i, 1) = "" Then
    If Cells(i - 1, 1) <> "" Then
    Cells(i, 1).EntireRow.Hidden = False
    j = i
    Else: Cells(i, 1).EntireRow.Hidden = True
    End If
    End If
Next i
Cells(j, 1).Select
End If
End Sub

N.B. se cancelli però un dato intermedio la cosa si ingrippa: per esempio hai le celle da A4 ad A9 con testo, cancelli A7, quella rimane visibile, ma questo succedeva anche con la tua macro precedente.

P.S. per spiegarti perché succede l'errore nella tua macro: questa richiede il valore di una cella, che può essere vuoto o non vuoto, se selezioni più celle passi qualcosa del tipo: vuoto, vuoto, vuoto e non è quello che la macro si aspetta. Nella mia versione con il ciclo for...next faccio passare una riga alla volta, pertanto il valore sarà sempre uno solo.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi project4 » 07/11/18 13:35

Ciao grazie, ci stiamo avvicinando ma ora ho un nuovo errore :p

quando immetto un valore nelle celle della colonna A tutto bene, mi mostra le righe nascoste fino alla riga 20, appena inserisco un ulteriore valore nella cella A21 ottengo errore run-time '1004' in debug mi evidenzio in giallo la riga 12 del tuo codice
Codice: Seleziona tutto
Cells(j, 1).Select


Faccio presente che ho cambiato il valore dell'intervallo di lavoro quindi il codice è diventato
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A4:A21")) Is Nothing Then
For i = 21 To 4 Step -1
    If Cells(i, 1) = "" Then
        If Cells(i - 1, 1) <> "" Then
            Cells(i, 1).EntireRow.Hidden = False
            j = i
        Else: Cells(i, 1).EntireRow.Hidden = True
        End If
    End If
Next i
Cells(j, 1).Select
End If
End Sub

ma ciò non dovrebbe influire in questo problema. Altra piccola curiosità: prima di darmi l'errore di cui parlo alla casella A21 mette lo sfondo uguale a quella A20 e non ne capisco il motivo...
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi wallace&gromit » 07/11/18 13:50

L'istruzione select non è così importante, semplicemente posiziona il cursore nella prima riga vuota e se tutto il range è pieno va in palla, si può cancellare.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi project4 » 07/11/18 16:03

Infatti non posso che confermare quello che hai detto. Però visto che mi piace come azione (non è indispensabile ma preferirei implementarla) stavo pensando ad un comando per inserirla ugualmente.

ho quindi provato ad aggiungere una condizione if else aggiungendo questo comando:

Codice: Seleziona tutto
If Range("A20") Is Hidden Then
Cells(j, 1).Select
End If


ma ricevo errore run-time '424' manca oggetto. allora so che manca la parte dell'else ma credo che non debba essere obbligatoriamente inserita quindi mi domando che cosa manchi a questa macro.
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi Anthony47 » 07/11/18 23:29

Sulla sintassi dell'istruzione If, prova invece
Codice: Seleziona tutto
If Range("A20").EntireRow.Hidden = True Then


Pero' io avrei optato per una diversa articolazione della Sub Worksheet_Change:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lCell As Range, lShown As Long
'
If Not Intersect(Target, Range("A4:A20")) Is Nothing Then
    For Each lCell In Target
        If Not Intersect(lCell, Range("A4:A20")) Is Nothing Then
            Select Case lCell.Value
                Case Is <> ""
                    Range("a" & lCell.Row + 1).EntireRow.Hidden = False  'istruzioni per scoprire la riga che vuoi
                    lShown = lCell.Row + 1
                Case Is = ""
                    Range("a" & lCell.Row + 1).EntireRow.Hidden = True   'istruzioni per nascondere la riga del target ossia la cella che stai modificando
            End Select
        End If
    Next lCell
End If
If lShown > 0 Then Cells(lShown, 1).Select
End Sub


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

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi project4 » 09/11/18 08:36

Eccomi, scusate il ritardo ma sono stato impegnato.

Innanzitutto grazie per l'aiuto a tutti, Anthony47 giusta la tua precisazione sul mio tentativo di inserire quel if, ho dimostrato la mia ignoranza nel liguaggio :roll:

Ottima anche la macro che hai postato funziona perfettamente.
Grazie ancora!!
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi project4 » 09/11/18 12:16

ehm... ho cantato vittoria troppo presto...
Con le macro preparate funziona tutto perfettamente solo fino a che il foglio è senza protezione. quando proteggo il foglio invece ottengo un errore. Per blogìccare il foglio uso la seguente macro:
Codice: Seleziona tutto
Sub Proteggi_fogli()
Dim i As Integer
For i = 1 To Sheets.Count
Sheets(i).Protect Password:="xxx"
Next i
End Sub


come la dovrei modificare?
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi Anthony47 » 09/11/18 15:55

Allora aggiungi nella macro le istruzioni per sproteggere /proteggere:
Codice: Seleziona tutto
'
'
If Not Intersect(Target, Range("A4:A20")) Is Nothing Then
    ActiveSheet.Unprotect Password:="xxx"          '>>> AGGIUNGI
    For Each lCell In Target
'
'
'
    Next lCell
    ActiveSheet.Protect Password:="xxx"            '>>> AGGIUNGI
End If


Oppure impara a usare l'opzione "UserInterfaceOnly", che imposta una protezione per l'operatore ma lascia le macro libere di modificare tutto.

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

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi project4 » 12/11/18 10:17

Grazie, aggiungendo nella macro il comando per sproteggere/proteggere funziona egregiamente.

Ho pure provato ad usare l'istruzione "UserInterfaceOnly" nella macro che uso per attivare la protezione e mi funziona ma solo fino a che non chiudo e riapro la cartella di lavoro.
Invece provando ad inserire il comando nella macro creata per mostrare/nasconderele righe non sono riuscito a farla funzionare.
Il mio problema ora direi comunque che è risolto, se qualcuno ha voglia di spiegarmi velocemente come usare il comando "UserInterfaceOnly" anche a seguito di chiusura e riapertura del file io ringrazio ;)
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi Anthony47 » 12/11/18 15:25

Ad ogni apertura del file devi impostare quell'opzione. Per questo aggiungerai una macro di Workbook_Open, da inserire nel modulo vba Questa_cartella_di_lavoro; esempio
Codice: Seleziona tutto
Private Sub Workbook_Open()
Sheets("Foglio1").Unprotect Password:="Segretissima"       '<<< Inserisci il vero foglio di lavoro
Sheets("Foglio1").Protect Password:="Segretissima", UserInterFaceOnly:=True  '<<<Idem
'Altri fogli?
Sheets("Foglio2").Unprotect Password:="Segretissima"       '<<< Inserisci il vero foglio di lavoro
Sheets("Foglio2").Protect Password:="Segretissima", UserInterFaceOnly:=True  '<<<Idem
'. . . (altri Fogli)
'...
End Sub

Inserisci tanti blocchi di istruzioni quanti sono i fogli in cui le tue macro vuoi che possano operare senza problemi.

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

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi project4 » 28/01/19 11:36

Torno a fare una domanda sulla questione Nascondi/Scopri righe.

Ho notato che se modifico la cella a cui faccio riferimento per Nascondere/Scoprire la riga tramite l'utilizzo di una formula che preleva i dati da un altro foglio la macro non va in esecuzione.
Ho tentato di farla funzionare automaticamente cambiando l'evento da WorkSheet_Change a WorkSheet_Calculate ma senza successo. Su che cosa potrei lavorare?

Allego un file di esempio.

http://www.filedropper.com/esempio1
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi Anthony47 » 29/01/19 00:56

La teoria giusta e' che devi identificare l'origine della catena e lavorare sull'evento Change originale.

Oppure, se i dati dipendono sempre da quelli di altri fogli, allora potresti valutare di nascondere /scoprire usando l'evento Worksheet_Activate

Oppure metti un tasto che fa partire a comando questa operazione.

Si puo' anche lavorare sull'evento Calculate, ma bisogna tener presente che la macro deve esaminare tutte le celle dell'intervallo e decidere se aprire o chiudere, che sono operazioni lente e che verranno invece eseguite in continuazione.
Il codice della Worksheet_Calculate:
Codice: Seleziona tutto
Private Sub Worksheet_Calculate()
Dim lCell As Range
'
        For Each lCell In Range("a3:a20")
            Application.EnableEvents = False
                Select Case lCell.Value
                    Case Is <> ""
                     Range("a" & lCell.Row + 1).EntireRow.Hidden = False  'istruzioni per scoprire la riga che vuoi
                        lShown = lCell.Row + 1
                    Case Is = ""
                    Range("a" & lCell.Row + 1).EntireRow.Hidden = True   'istruzioni per nascondere la riga del target
                End Select
            Application.EnableEvents = True
        Next lCell
If lShown > 0 Then Cells(lShown, 1).Select
End Sub

In questo caso la Worksheet_Change va rimossa

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

Re: Mostrare e Nascondere righe se cella ha un valore

Postdi project4 » 29/01/19 09:35

Fantastico Anthony!

Ho notato che hai rimosso l'istruzione per proteggere/togliere_la_protezione al foglio di lavoro. Credo di aver capito il perchè e, dopo un po' di tentativi, ho trovato il modo di inserirla nuovamente.
Inoltre ho eliminato l'istruzione
Codice: Seleziona tutto
If lShown > 0 Then Cells(lShown, 1).Select
perchè mi generava un errore.

Il codice è quindi diventato il seguente:
Codice: Seleziona tutto
Private Sub Worksheet_Calculate()
Dim lCell As Range
'
            For Each lCell In Range("A22:A49") <--- Range effettivo, è differente rispetto al file di esempio postato precedentemente
            Application.EnableEvents = False
                Select Case lCell.Value
                    Case Is <> ""
                        ActiveSheet.Unprotect Password:="xxx"
                        Range("a" & lCell.Row + 1).EntireRow.Hidden = False  'istruzioni per scoprire la riga che vuoi
                        lShown = lCell.Row + 1
                        ActiveSheet.Protect Password:="xxx"
                    Case Is = ""
                        ActiveSheet.Unprotect Password:="xxx"
                        Range("a" & lCell.Row + 1).EntireRow.Hidden = True   'istruzioni per nascondere la riga del target
                        ActiveSheet.Protect Password:="xxx"
                End Select
            Application.EnableEvents = True
        Next lCell
End Sub


e mi pare funzionare senza problemi.

Che dire se non che, come sempre, sei praticamente perfetto nelle tue istruzioni. ;)

Grazie
Win10+excel 2010
project4
Utente Junior
 
Post: 30
Iscritto il: 07/11/18 08:45


Torna a Applicazioni Office Windows


Topic correlati a "Mostrare e Nascondere righe se cella ha un valore":

BTp Valore
Autore: MarioLombardi
Forum: Forum off-topic
Risposte: 2

Chi c’è in linea

Visitano il forum: Nessuno e 90 ospiti