Colora riga selezionata con ripristino e password



  • Colora riga selezionata con ripristino e password di Alessandro (utente non iscritto) data: 14/07/2017 08:56:22

    Buongiorno a tutti

    Ho recuperato da un vecchio file una macro che permetteva di evidenziarmi l'intera riga nel momento in cui selezionavo la cella per aiutarmi a non perdermi tra gli altri valori che avevo nella tabella.

    Arricchendo il file sempre più con migliorie ho notato che la macro svolge sempre la sua funzione però se ho già delle celle formattate con altri colori, queste mi diventano bianche perdendo la formattazione.

    RIASSUMENDO:
    Perdo la formattazione
    Non funziona su fogli protetti perche mi dà errore
    ......................................................................
    Il range interessato ad esser evidenziato va da B5 a Q300

    Avete qualche consiglio su dove intervenire?
    Grazie
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     Cells.Interior.Pattern = xlNone
     ActiveCell.EntireRow.Rows.Interior.ColorIndex = 6
    End Sub


  • di alfrimpa data: 14/07/2017 09:16:52

    Ciao Alessandro

    Per quanto riguarda il problema della protezione prova con la macro che vedi sotto.

    Non ho capito se vi sono altri problemi; allega un file di esempio e spiega dove sono e quando si verificano.

    Alfredo
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Unprotect
     Cells.Interior.Pattern = xlNone
     ActiveCell.EntireRow.Rows.Interior.ColorIndex = 6
    ActiveSheet.Protect
    End Sub


  • di Alessandro (utente non iscritto) data: 14/07/2017 09:54:17

    Ciao Alfredo, grazie per la risposta.

    Ho allegato un file di esempio (usate quello nominato Prendere questo esempio)
    Come potete notare appena aperto in alto ci sono delle celle nere ma appena si prova a selezionare una cella nella tabella diventano bianche e perdo la "grafica".
    Nell'esempio ho riportato un range dove ho interesse che venga evidenziata l'intera riga, oltre la tabella non mi serve ma per una questione estetica

    se non mi sono spiegato bene resto a disposizione



  • di Vecchio Frac data: 14/07/2017 10:49:05

    Scusate senza offendere nessuno ma la modifica è davvero semplice ^_^
    - Tu devi azzerare solo le celle di un determinato range
    - Tu devi colorare solo le celle di un determinato range (e non tutta la EntireRow)

    Perciò...?


  • di Alessandro (utente non iscritto) data: 15/07/2017 09:13:57

    Eccomi qua,
    Devo essere sincero, ho smanettato un po con le prove e studiando un po, e seppur semplice la soluzione mi rendo conto che di vba io non ci capisco niente ma dopo ore di ricerca ho capito che sbagliavo a non mettere "Targhet.Row" ma usavo solo Range.("B2:Q140") ecc... trovandomi errori nell'esecuzione della macro.

    Ho un problemino riguardo la protezione:
    per fare i test e velocizzarmi proteggo il foglio senza password(cioè simula il click su proteggi foglio senza inserirla), ma il foglio ufficiale ne ha una, qui ogni volta che modifico un valore o seleziono un'altra cella mi viene chiesta nella finestra di dialogo, in questo modo sono costretto ogni volta a riscriverla, non posso farla in automatico? o ancora meglio, questa macro non può funzionare anche a foglio protetto manualmente?

    Ho riscontrato quanto segue, per disabilitare momentaneamente la protezione del foglio ho inserito ' prima di ActiveSheet.Unprotected e ActiveSheet.Protect

    detto cio con la virgoletta in alto (quindi disabilito la parte di codice "protezione") mi dice che la macro è sbagliata se la tolgo funziona.
    in cosa sto sbagliando?

    allego l'esempio
    Nel foglio 1 non funziona nel 2 si
     
    Funzionante
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Unprotect
    If Target.Row = 1 Then Exit Sub
      Range("B2:Q140").Interior.ColorIndex = xlNone
      Range(Cells(Target.Row, "B"), Cells(Target.Row, "Q")).Interior.ColorIndex = 6
      ActiveSheet.Protect
    End Sub
    
    questo invece riporta errore 
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'ActiveSheet.Unprotect
    If Target.Row = 1 Then Exit Sub
      Range("B2:Q140").Interior.ColorIndex = xlNone
      Range(Cells(Target.Row, "B"), Cells(Target.Row, "Q")).Interior.ColorIndex = 6
     'ActiveSheet.Protect
    End Sub
    
    


  • di Vecchio Frac data: 15/07/2017 12:36:56

    Quello che hai scritto va bene e dovrebbe funzionare.
    Infatti era anche la mia versione che non avevo postato perchè prima volevo il tuo tentativo :)
    Allego la mia versione che come vedi è simile alla tua.
    Per proteggere/sproteggere con password, immetti la tua password dopo le istruzioni Protect/Unprotect.
     
    Option Explicit
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Application.EnableEvents = False
        ActiveSheet.Unprotect
            Range("B5:Q300").Interior.Pattern = xlNone
            Range(Cells(ActiveCell.Row, "B"), Cells(ActiveCell.Row, "Q")).Interior.ColorIndex = 6
        ActiveSheet.Protect
        Application.EnableEvents = True
    End Sub


  • di Tech84 data: 15/07/2017 22:33:16

    Grazie mille per i chiarimenti e disponibilità


  • di Tech84 data: 19/07/2017 10:08:53

    Ho riscontrato un rallentamento nel pc quando passo da una cella all'altra.
    la tabella è formata da 13 colonne x 300 righe
    da vuota scorre una meraviglia ma più si riempie, la riga si colora dopo un secondo circa, idem se mi sposto nella cella affianco o sotto ci mette un secondo circa a selezionarsi...
    Non mi sembra un poema la macro per esser eseguita, tra l'altro come esperimento avevo provato a disabilitare il refresh dello schermo, eseguire la macro e abilitarlo dopo ma sembrava peggio.

    sono rimasto operativo con l'ultimo codice riportato in seguito  
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Unprotect "admin" 'password prima e dopo unprotect e protect alla fine del codice
    If Target.Row = 1 Then Exit Sub
      Range("B2:Q140").Interior.ColorIndex = xlNone 'Range di colonne da evidenziare
      Range(Cells(Target.Row, "B"), Cells(Target.Row, "Q")).Interior.ColorIndex = 6 'B è la colonna da cui parte la selezione
      ActiveSheet.Protect "admin"
    End Sub


  • di Vecchio Frac data: 19/07/2017 10:12:24

    Non dimenticare
    Application.EnableEvents = False
    a inizio codice e
    Application.EnableEvents = True
    a fine codice (guarda il mio esempio). Puoi anche lasciare abilita/disabilita lo ScreenUpdating che va sempre bene.


  • di Vecchio Frac data: 19/07/2017 10:16:42

    Per velocizzare puoi anche assegnare a una variabile Range le celle interessate.
    A volte basta poco ma fa la differenza.
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim rng as Range, i as Long
        Application.EnableEvents = False
        Application.ScreenUpdating = True
        ActiveSheet.Unprotect "admin" 'password prima e dopo unprotect e protect alla fine del codice
        If Target.Row = 1 Then 
            Application.ScreenUpdating = True
            Application.EnableEvents = True
            Exit Sub
        End If
        Range("B2:Q140").Interior.ColorIndex = xlNone 'Range di colonne da evidenziare
        i = Target.Row
        Set rng = Range(Cells(i, "B"), Cells(i, "Q"))    'B è la colonna da cui parte la selezione
        rng.Interior.ColorIndex = 6 
        ActiveSheet.Protect "admin"
        Application.ScreenUpdating = True
        Application.EnableEvents = True
    End Sub