Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

formattazione condizionale e problemi di memoria

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

formattazione condizionale e problemi di memoria

Postdi matzap » 20/10/21 12:12

ciao a tutti,
è un po' che non scrivo!
ho un foglio con molte formattazioni con il quale gestisco le turnazione del personale.
su una colonna ci sono i nomi
su una riga ci sono le date dal 1 settembre al 31 dicembre
su un altro foglio le date dal 1 gennaio al 31 agosto ( ma il funzionamento è lo stesso)
nelle caselle da da E4 a FA32 indicato il turno di ogni persona. la casella si colora in modo diverso in base a cosa si scrive.
quando modifico una casella l'aggiornamento della formattazione è lentissimo se poi faccio un copia incolla si blocca e mi da messaggio di problemi di memoria.

come posso fare?
Vi allego il file:
http://www.filedropper.com/turnimanuten ... ivisione_2
Grazie e ciao
Matteo
matzap
Utente Senior
 
Post: 246
Iscritto il: 16/04/13 08:27

Sponsor
 

Re: formattzaione condizionale e problemi di memoria

Postdi wallace&gromit » 20/10/21 17:10

Quando cerco di vedere le formule di formattazione condizionale si impalla tutto, mi sa che sono troppe o che il range è troppo complesso. Forse una macro worksheet change sarebbe meglio.
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2069
Iscritto il: 16/01/12 14:21

Re: formattzaione condizionale e problemi di memoria

Postdi Anthony47 » 20/10/21 23:27

Condivido l'idea di W&G di abolire le formattazioni condizionali nell'area E8:IM32 e sostituirle con una macro di WorksheetChange, che scatta tutte le volte che scrivi qualcosa in quell'area (non mi pare ci siano formule).
Ad esempio, questa macro applica le formattazioni che sono visibili nell'area E2:V2 piu' quella dei festivi:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myC As Range, ckArea As String, scanAr As Range
Dim myMatch, myCData
'=NON(VAL.NON.DISP(CERCA.VERT(E$4;FESTE;1;0)))
ckArea = "E8:IM32"                  '<<< L'area da controllare
Set scanAr = Application.Intersect(Target, Range(ckArea))
If Not scanAr Is Nothing Then
    Application.ScreenUpdating = False
    For Each myC In scanAr
        myCData = CLng(Cells(4, myC.Column))
        If Application.VLookup(myCData, Sheets("Festività").Range("FESTE"), 1) = myCData Then
            myC.Interior.ColorIndex = 49
        Else
            myMatch = Application.Match(myC.Value, Range("E2:V2"), False)
            If IsError(myMatch) Then
                myC.Interior.ColorIndex = xlNone
            Else
                myC.Interior.ColorIndex = Range("E2").Cells(1, myMatch).Interior.ColorIndex
            End If
        End If
    Next myC
    Application.ScreenUpdating = False
End If
End Sub

Va messa nel "modulo vba del foglio su cui lavori" (ad esempio: gen-ago). Per questo:
-tasto dx sul tab col nome del foglio; scegli Visualizza codice
-copia il codice e incollalo nel modulo vba che così e' stato aperto

Se ci sono piu' fogli di lavoro il codice va messo in tutti i moduli vba di questi fogli

Attenzione:
1) e' opportuno ridefinire il "Nome" FESTE non come =Festività!$A$2:$A$1048576 ma come =Festività!$A$2:$A$10000 (10mila righe per le festivita' basteranno certamente)
2) e' necessario che la prima cella di questo "Nome" sia posta a -1
3) e' necessario che le date inserite siano in ordine crescente (come sono gia' adesso)

Poi torna su Excel e prova a inserire dati e vedi se l'effetto e' quello desiderato

INFINE, avendo tolto le formattazioni condizionali, ora tutte le celle saranno Neutre anche se gia' popolate con valori che non vorresti perdere o dover riscrivere.
Per recuperarle aggiungi questa macro in un "Modulo Standard" del vba:
Codice: Seleziona tutto
Sub FormattAll()
Range("E8:IM32").Copy
Range("E8").PasteSpecial xlPasteValues
Application.CutCopyMode = False
Range("E8").Select
End Sub

Avvia la Sub FormattAll e dovrebbe formattare l'intero tabellone.
Ragionevolmente questa Sub andra' eseguita una sola volta per ognuno dei fogli di lavoro che hanno bisogno di quella formattazione, per recuperare il pregresso; ma non e' vietato rieseguirla, ad esempio perche' vuoi modificare i colori corrispondenti al range E2:V2

Fai sapere...
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: formattzaione condizionale e problemi di memoria

Postdi matzap » 21/10/21 10:42

Ciao Antony,
ho incollato la macro
Private Sub Worksheet_Change(ByVal Target As Range)
nel foglio.
Ho poi incollato anche la macro
Sub FormattAll()

ma mi da debug qui : If Application.VLookup(myCData, Sheets("Festività").Range("FESTE"), 1) = myCData Then

inoltre:
e' opportuno ridefinire il "Nome" FESTE non come =Festività!$A$2:$A$1048576 ma come =Festività!$A$2:$A$10000 (10mila righe per le festivita' basteranno certamente) OK fatto
2) e' necessario che la prima cella di questo "Nome" sia posta a -1 cosa vuol dire?
3) e' necessario che le date inserite siano in ordine crescente (come sono gia' adesso) ok


intanto grazie
excel 2010
matzap
Utente Senior
 
Post: 246
Iscritto il: 16/04/13 08:27

Re: formattzaione condizionale e problemi di memoria

Postdi Anthony47 » 21/10/21 11:11

e' necessario che la prima cella di questo "Nome" sia posta a -1 cosa vuol dire?
Vuol dire che l'elenco deve partire con -1, che e' un numero inferiore a tutte le date che possono esserci sul foglio. Visto che hai gia' un elenco:
-copia A2:A20 e incolla in A3
-in A2 scrivi -1 (essendo la cella formattata Data sara' visualizzato come ######, tu non farti impressionare)

A questo punto riprova, non dovresti piu' avere l'errore sulla riga Application.VLookup

e' necessario che le date inserite siano in ordine crescente (come sono gia' adesso) ok
Ricordatene pero' quando aggiungi date nell'elenco.

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

Re: formattzaione condizionale e problemi di memoria

Postdi matzap » 21/10/21 12:32

immaginavo il problema fosse quello. ora funziona ma in parte:

1) nella casella G2 vi è scritto "PER" che vuol dire permesso
nelle varie caselle può esserci scritto 12:00-14:00 PER oppure 22:30-23:00 PER e chiaramente il confronto con G2 da esito negativo.
lo stesso succede con i confronti delle caselle P2 e T2, potrei far considerare il confronto con le ultime tre lettere ma risolverei per il PER ma non per S o T


2) il confronto delle celle con la cella V2 invece di un colore c'è un motivo non viene rilevata,
ho provato ad aggiungere
'myC.Interior.Pattern = xlLightUp
'myC.Interior.PatternColorIndex = Range("E2").Cells(1, myMatch).Interior.PatternColorIndex

ma mi colora tutte le celle

dove sbaglio?
excel 2010
matzap
Utente Senior
 
Post: 246
Iscritto il: 16/04/13 08:27

Re: formattazione condizionale e problemi di memoria

Postdi Anthony47 » 21/10/21 20:13

Eh lo sapevo che non avrebbe coperto tutte le condizioni...
Bisogna aggiungere piu' "casi" a quelli ora considerati. Sono nella seconda parte della macro (e non so se sono tutti):
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myC As Range, ckArea As String, scanAr As Range
Dim myMatch, myCData
'
ckArea = "E8:IM32"                  '<<< L'area da controllare
Set scanAr = Application.Intersect(Target, Range(ckArea))
If Not scanAr Is Nothing Then
    Application.ScreenUpdating = False
    For Each myC In scanAr
        myCData = CLng(Cells(4, myC.Column))
        If Application.VLookup(myCData, Sheets("Festività").Range("FESTE"), 1) = myCData Then
            myC.Interior.ColorIndex = 49
        Else
            myMatch = Application.Match(myC.Value, Range("E2:V2"), False)
            If IsError(myMatch) Then
                myC.Interior.ColorIndex = xlNone
            Else
                myC.Interior.ColorIndex = Range("E2").Cells(1, myMatch).Interior.ColorIndex
            End If
        End If
        Application.EnableEvents = False
        If UCase(myC.Value) = "RC" Then
            Cells(2, "V").Copy
            myC.PasteSpecial Paste:=xlPasteFormats
        ElseIf UCase(Right(myC.Value, 3)) = "PER" Then
            Cells(2, "G").Copy
            myC.PasteSpecial xlPasteFormats
        ElseIf UCase(Right(myC.Value, 1)) = "S" Then
            Cells(2, "P").Copy
            myC.PasteSpecial Paste:=xlPasteFormats
        ElseIf UCase(Right(myC.Value, 2)) = "IN" Then
            Cells(2, "T").Copy
            myC.PasteSpecial Paste:=xlPasteFormats
       
        End If
        Application.EnableEvents = True
        Application.CutCopyMode = False
    Next myC
    Application.ScreenUpdating = False
End If
End Sub

Ri-prova e fai sapere...
Avatar utente
Anthony47
Moderatore
 
Post: 17865
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: formattzaione condizionale e problemi di memoria

Postdi matzap » 22/10/21 08:50

Ciao Anthony,
funziona,
ho aggiunto due righe una per ridimensionare il testo quando rileva il PER
e una per togliere in caso di modifica il motivo a righe su successiva modifica, perché in caso ad esempio scrivessi 3, mi colorava la cella ma mi lasciava il motivo a righe il codsice modficato è questo:

Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myC As Range, ckArea As String, scanAr As Range
Dim myMatch, myCData
'
ckArea = "E8:IM32"                  '<<< L'area da controllare
Set scanAr = Application.Intersect(Target, Range(ckArea))
If Not scanAr Is Nothing Then
    Application.ScreenUpdating = False
    For Each myC In scanAr
        myCData = CLng(Cells(4, myC.Column))
        If Application.VLookup(myCData, Sheets("Festività").Range("FESTE"), 1) = myCData Then
            myC.Interior.ColorIndex = 49
        Else
            myMatch = Application.Match(myC.Value, Range("E2:V2"), False)
            If IsError(myMatch) Then
                myC.Interior.ColorIndex = xlNone
            Else
                myC.Interior.ColorIndex = Range("E2").Cells(1, myMatch).Interior.ColorIndex
                myC.Interior.Pattern = xlSolid
                myC.Interior.PatternColorIndex = xlAutomatic
            End If
        End If
        Application.EnableEvents = False
        If UCase(myC.Value) = "RC" Then
            Cells(2, "V").Copy
            myC.PasteSpecial Paste:=xlPasteFormats
        ElseIf UCase(Right(myC.Value, 3)) = "PER" Then
            Cells(2, "G").Copy
            myC.PasteSpecial xlPasteFormats
            Selection.Font.Size = 14
        ElseIf UCase(Right(myC.Value, 1)) = "S" Then
            Cells(2, "P").Copy
            myC.PasteSpecial Paste:=xlPasteFormats
            Selection.Font.Size = 16
        ElseIf UCase(Right(myC.Value, 2)) = "IN" Then
            Cells(2, "T").Copy
            myC.PasteSpecial Paste:=xlPasteFormats
            Selection.Font.Size = 14
       
        End If
        Application.EnableEvents = True
        Application.CutCopyMode = False
    Next myC
    Application.ScreenUpdating = False
End If
End Sub



Ciao E grazie!
excel 2010
matzap
Utente Senior
 
Post: 246
Iscritto il: 16/04/13 08:27

Re: formattzaione condizionale e problemi di memoria

Postdi Anthony47 » 23/10/21 11:41

Ben fatto
Altre condizioni si possono sempre aggiungere usando la struttura a blocchi della macro

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


Torna a Applicazioni Office Windows


Topic correlati a "formattazione condizionale e problemi di memoria":


Chi c’è in linea

Visitano il forum: Bing [Bot] e 43 ospiti