Anthony47 ha scritto:statam ha scritto:è la tabella che sul file che ho allegato trovi sulla destra, serve per delle analisi, ma diciamo che non è fondamentale automatizzarla, anzi visto che mi sembra piuttosto complicato dimentichiamoci proprio di questa parte
Non e' difficile, ma se non si capisce di cosa si parla allora e' impossibile.
Allora mi pare che si tratta di una tabella con un valore numerico in colonna 1 e due formule nelle colonne successive....
Mi permetto di lavorare "sopra" la soluzione proposta da peppo (vedi sopra).
1-Trasforma in Tabella l'intervallo H:I occupato dai dati e dalle formule
a) Seleziona l'area; Menu /Inserisci /Tabella; spunta Tabella con intestazione; premi Ok
b) Accertati che venga chiamata Tabella1 (lo vedi nella scheda Progettazione di Strumenti tabella)
2- in un nuovo Modulo standard del vba inserisci questo codice
- Codice: Seleziona tutto
Sub FormCond()
'Applica la formattazione condizionale all'elenco:
Columns("E:E").Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("E4").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=E(E4>=100;E4<200)"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=E4>=200"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
End With
End Sub
Rimanendo nel vba, vai sul modulo Foglio1 e modifica la macro in
- Codice: Seleziona tutto
Private Sub CommandButton1_Click()
Range("E4").Select
Application.CommandBars.ExecuteMso ("SortDescendingExcel")
Call FormCond
tabr = Application.WorksheetFunction.CountIf(Range("E:E"), ">=100")
With ActiveSheet.ListObjects("Tabella1")
.Resize Range("$H$3").Resize(tabr + 1, .ListRows(1).Range.Count)
.DataBodyRange.Cells(1, 1).Offset(.ListColumns(1).DataBodyRange.Count, 0). _
Resize(100, .ListRows(1).Range.Count).Clear
End With
End Sub
In questo modo quando premi il pulsante presente sul foglio:
-l'elenco viene ordinato
-vengono rimossi eventuali colori applicati all'elenco
-viene applicata all'elenco la formattazione condizionale necessaria per visualizzare in Giallo e in Rosso
-la tabella presente viene ridimensionata per avere il giusto numero di righe
Quello che non sono in grado di fare e' compilare la colonna 1 della tabella, ed eventualmente adattare la formula di colonna 3; perche' nulla sappiamo di queste cose.
Ciao
Ciao Anthony, innanzi tutto scusa se ti rispondo solo ora ho avuto alcuni problemi.
Ti voglio ringraziare per il tuo aiuto e la tua disponibilità, purtroppo non sono riuscito ad utilizzare i tuoi codici e adattarli alle mie esigenze che nel frattempo sono cambiate e diventate più "semplici".
Dunque vorrei rispiegare brevemente quello che mi serve e darti un file di esempio per comprendere meglio:
http://www.filedropper.com/testordinaHo un file excel contenente tot fogli quanti sono i mesi dell'anno e uno per una specie di analisi. In ogni foglio (mese) viene estrapolato un report (sempre nelle stesse posizioni, anche se varia la lunghezza del report in verticale). Ognuno di questi report contiene principalmente il nome dei prodotti e i prezzi (negativi).
Una volta incollato il report sul foglio del mese corrente, quello che faccio io manualmente e che mi servirebbe automatizzare con una macro (da attaccare a un pulsante) è:
1. Seleziona il range di celle C4:K9999 (così che se il report sia più lungo venga comunque selezionato)
2. Inserisci filtro per ordinare i dati in ordine decrescente e ordina dal più piccolo al più grande (i prezzi sono in negativo quindi in alto ci dovranno essere quelli più negativi)
3. Colora di rosso chiaro le righe (range di celle C:J) dei prodotti con i prezzi >= -200 e colora di giallo quelli >= -100 & < -200
Per i punti 1 e 2 ho provato a registrare la macro con il registratore e ho prodotto questo risultato:
- Codice: Seleziona tutto
Sub order()
'
' order Macro
'
'
Range("C4:K1278").Select
Selection.AutoFilter
ActiveWindow.SmallScroll Down:=-27
ActiveWorkbook.Worksheets("Settembre").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Settembre").AutoFilter.Sort.SortFields.Add Key:= _
Range("J4:J330"), SortOn:=xlSortOnValues, order:=xlAscending, DataOption _
:=xlSortNormal
With ActiveWorkbook.Worksheets("Settembre").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
L'unica cosa che cambia da foglio a foglio (penso) è proprio il nome del foglio (settembre, ottobre ecc.) quindi penso che potrei fare una macro registrata per ogni foglio, inserirla nel pulsante "ordina" e risolverei.
Invece per il
punto 3 non saprei proprio come fare.
Ultima cosa: nell'ultimo foglio "analisi" vorrei che in automatico comparissero, per ogni mese nelle celle adatte (basta guardare il foglio analisi per capire), i nomi dei prodotti con importi superiori o uguali ai -200 o alternativamente quelli colorati di rosso (penso si possa fare con un cerca.vert ma non riesco a costruirlo correttamente)