Ho sempre lo stesso foglio "Settore A" in cui devo inserire dei
prodotti utilizzando
dei codici
Ogni cella del foglio all'interno di questo range : $F$6:$I$85
ospiterà un solo codice che può corrispondere ad una o più lettere
("A" "G" "VE" "SSL" ecc)
In un secondo foglio "carichi settoreA" verranno effettuati dei
calcoli che prevedono inizialmente un conteggio di quante celle per
ogni prodotto,all'interno del range $F$6:$I$85 del foglo "Settore A"
sono presenti.
Per farlo utilizzo ora questa formula
=COUNTIF('SETTORE A'!$F$6:$I$85;B1)
che va a leggere il codice dell'articolo direttamente in una cella
comodamente modificabile ogni volta che cambia la sigla dell'articolo
modificando in contemporanea anche la formula.
Le lettere che identificano un prodotto
A= XY
G=XX
ecc
spesso cambiano
AB=XY
FS=XX
Ora ogni prodotto come dicevo deve essere inserito in un range di
celle F6:i85 all'interno del foglio "settore a".
In ogni cella un codice (ossia un articolo) e ad ogni articolo
corrisponde una colorazione praticolare e automatica della cella in
cui viene inserito.
Gli articoli sono tanti per cui non è possibile utilizzare la
formattazione condizionale.
Ho infatti inserito un codice VBA (suggeritomi all'interno di questo
NG tempo fa) che fa questo automaticamente.
Ecco il codice:
Option Explicit
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RNG As Range
Dim Rng2 As Range
Dim rCell As Range
Set RNG = Intersect(Me.Range("f6:i85"), Target)
Set Rng2 = Intersect(Me.Range("D6:D85"), Target)
If Not RNG Is Nothing Then
For Each rCell In RNG.Cells
With rCell
Select Case .Value
Case Is = "A"
.Interior.ColorIndex = 33
Case Is = "G"
.Interior.ColorIndex = 6
Case Is ="Ve"
.Interior.ColorIndex = 4
avanti così per ogni articolo
E' possibile dire al codice di colorare la cella in base ad una o più
lettere inserite nella cella B1?
Ho provato a sostituire la lettera "a" con l'indirizzo di cella B1 ma
così mi dà errore.
Immagino occorra modificare anche il resto del codice?
Potete aiutarmi?
Grazie ancora e comunque :-)
> Set RNG = Intersect(Me.Range("f6:i85"), Target)
> Set Rng2 = Intersect(Me.Range("D6:D85"), Target)
>
> If Not RNG Is Nothing Then
> For Each rCell In RNG.Cells
Non ho capito cosa devi fare, e soprattutto non ho capito
il ciclo FOR quale scopo abbia: RNG è un range costituito
da UNA sola cella, essendo l'intersezione tra LA cella
Target e il range "F6:I85".
Intanto modificherei così:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RNG As Range
Dim Rng2 As Range
Dim rCell As Range
If Not Intersect(Target, Range("F6:I85")) Is Nothing Then
' quello che vuoi
' cut
Per un aiuto migliore posta TUTTO il codice o metti il file
su un server di sharing.
Fai sapere se hai risolto, grazie
Bye!
Scossa
>RNG è un range costituito
> da UNA sola cella, essendo l'intersezione tra LA cella
> Target e il range "F6:I85".
>
Target è "NORMALMENTE" un range di una sola cella, perche se - per
esempio - seleziono più celle, digito un valore e premo CTRL+Invio
Target è costituito dalle celle selezionate.
Bye!
Scossa
Target � un riferimento *alle celle* modificate.
Sempre.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
For Each c In Target
MsgBox c.Address
Next
Set c = Nothing
End Sub
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/officeit/threads
Scusa Mauro, questo lo so, ma con "Normalmente" intendo dire che se mi
posiziono in A5 scrivo Pippo e premo invio Target è la cella A5; per
cui nel contesto dell'OP (inserisce qualcosa in una cella e preme
invio):
For Each rCell In RNG.Cells
non mi pare abbia molto senso.
Poi avrò capito male le sue necessità ....
Bye!
Scossa
For Each rCell In RNG.Cells
non mi pare abbia molto senso.
Poi avr� capito male le sue necessit� ....
*****************************
Target rappresenta un riferimento
all'oggetto di tipo Range modificato.
E' il *normalmente* che mi suona
strano.
Il problema dell'OP e il resto del
thread non l'ho seguito.
Mi fido delle risposte che dai tu.
"Normalmente" = per quello che ho visto in giro l'utente medio scrive
in una cella alla volta, la selezione estesa mette paura :-))
> Mi fido delle risposte che dai tu.
Grazie! molto onorato!! :-)
Bye!
Scossa
Nel 99% dei casi quando si cancella
il contenuto. E molte volte si solleva
l'eccezione.
Giusto, la cancllazione non l'avevo considerata.
Acc! maledetto NICK CARTER, anche questa volta l'hai vinta
tu! :-)))
--
Bye!
Scossa
Un'idea(solo un'idea):
dim c as range
if target.cells.count = 1 Then
'codice
else
for each c in target
'codice
next
end if
set c = nothing
Come sempre i tempi della tartaruga sono quelli che sono...
Grazie per le risposte, appena ho un attimo di tempo provo e vi
faccio sapere.
Comunque tutto il codice è questo sotto e funziona perfettamente:
Option Explicit
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RNG As Range
Dim Rng2 As Range
Dim rCell As Range
Set RNG = Intersect(Me.Range("F6:I85"), Target)
Set Rng2 = Intersect(Me.Range("D6:D85"), Target)
If Not RNG Is Nothing Then
For Each rCell In RNG.Cells
With rCell
Select Case .Value
Case Is = "A"
.Interior.ColorIndex = 33
Case Is = "G"
.Interior.ColorIndex = 6
Case Is = "VE"
.Interior.ColorIndex = 4
Case Is = "Viola"
.Interior.ColorIndex = 7
Case Is = "sps"
.Interior.ColorIndex = 34
Case Is = "spm"
.Interior.ColorIndex = 34
Case Is = "spl"
.Interior.ColorIndex = 34
Case Is = "sss"
.Interior.ColorIndex = 35
Case Is = "ssm"
.Interior.ColorIndex = 35
Case Is = "ssl"
.Interior.ColorIndex = 35
Case Is = "FPs"
.Interior.ColorIndex = 8
Case Is = "FPm"
.Interior.ColorIndex = 8
Case Is = "FPl"
.Interior.ColorIndex = 8
Case Is = "FPxl"
.Interior.ColorIndex = 8
Case Is = "FSs"
.Interior.ColorIndex = 10
Case Is = "FSm"
.Interior.ColorIndex = 10
Case Is = "FSl"
.Interior.ColorIndex = 10
Case Is = "FSxl"
.Interior.ColorIndex = 10
Case Is = "FMs"
.Interior.ColorIndex = 38
Case Is = "FMm"
.Interior.ColorIndex = 38
Case Is = "FMl"
.Interior.ColorIndex = 38
Case Is = "FMXL"
.Interior.ColorIndex = 38
Case Is = "sms"
.Interior.ColorIndex = 38
Case Is = "smm"
.Interior.ColorIndex = 38
Case Is = "sml"
.Interior.ColorIndex = 38
Case Else
.Interior.ColorIndex = xlNone
End Select
End With
Next rCell
End If
End Sub
Grazie ancora, provo al più presto!
Scusate ,
volevo provare ad inserire il codice ma mi sono accorta di non capire
bene come devo fare e soprattutto dove lo scrivo il numero
appartenente al colore?
Oppure quello che avete messo è solo il codice preliminare ?!?
Se poteste spegarmi in modo più chiaro,please?!?!
Grazie mille
... mega cut
Il tutto semplificabile così:
'----------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCell As Range
If Not Intersect(Me.Range("F6:I85"), Target) Is Nothing
Then
For Each rCell In Target
With rCell
Select Case .Value
Case Is = "A"
.Interior.ColorIndex = 33
Case Is = "G"
.Interior.ColorIndex = 6
Case Is = "VE"
.Interior.ColorIndex = 4
Case Is = "Viola"
.Interior.ColorIndex = 7
Case Is = "sps", "spm", "spl"
.Interior.ColorIndex = 34
Case Is = "sss", "ssm", "ss1"
.Interior.ColorIndex = 35
Case Is = "FPs", "FPm", "FP1", "FPxl"
.Interior.ColorIndex = 8
Case Is = "FSs", "FSm", "FSl", "FSx1"
.Interior.ColorIndex = 10
Case Is = "FMs", "FMm", "FMl", "FMXL", _
"sms", "smm", "sml"
.Interior.ColorIndex = 38
Case Else
.Interior.ColorIndex = xlNone
End Select
End With
Next rCell
End If
End Sub
'--------------------
Però continuo a non capire l'utilità del ciclo for, vedi
risposta al tuo successivo post.
Bye!
Scossa
Questo il codice che userei io:
'--------------------
Option Explicit
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Me.Range("F6:I85"), Target) Is Nothing
Then
With Target
Select Case .Cells(1, 1).Value
Case Is = "A"
.Interior.ColorIndex = 33
Case Is = "G"
.Interior.ColorIndex = 6
Case Is = "VE"
.Interior.ColorIndex = 4
Case Is = "Viola"
.Interior.ColorIndex = 7
Case Is = "sps", "spm", "spl"
.Interior.ColorIndex = 34
Case Is = "sss", "ssm", "ss1"
.Interior.ColorIndex = 35
Case Is = "FPs", "FPm", "FP1", "FPxl"
.Interior.ColorIndex = 8
Case Is = "FSs", "FSm", "FSl", "FSx1"
.Interior.ColorIndex = 10
Case Is = "FMs", "FMm", "FMl", "FMXL", _
"sms", "smm", "sml"
.Interior.ColorIndex = 38
Case Else
.Interior.ColorIndex = xlNone
End Select
End With
End If
End Sub
'--------------------
Come vedi non c'è bisogno di nessun ciclo FOR, in quanto
anche se selezioni più celle, per esempio per cancellarle o
per scrivere in esse un valore, assumeranno tutte lo stesso
valore di Target.cells(1,1) e seguiranno lo stesso suo
"destino".
Fai sapere se hai risolto, grazie.
--
Bye!
Scossa
Come vedi non c'� bisogno di nessun ciclo FOR, in quanto
anche se selezioni pi� celle, per esempio per cancellarle o
per scrivere in esse un valore, assumeranno tutte lo stesso
valore di Target.cells(1,1) e seguiranno lo stesso suo
"destino".
Fai sapere se hai risolto, grazie.
--
Bye!
Scossa
****************
Risp. per scossa
****************
L'iterazione mi pare indispensabile in quanto, se l'operatore copiasse da
qualche parte e incollasse(per esempio in F5:F10) un blocco di codici
diversi, questa routine attribuirebbe all'intero range "Target" il colore
corrispondente alla prima cella.
Se in F5 c'� "G" tutte le celle da F5 a F10 sono colorate col colore 6,
ancorch� F6, F7, F8, F9 e F10 contengano altri codici.
Mi sbaglio?
Ciao, E.
> L'iterazione mi pare indispensabile in quanto, se l'operatore copiasse da
> qualche parte e incollasse(per esempio in F5:F10) un blocco di codici
> diversi, questa routine attribuirebbe all'intero range "Target" il colore
> corrispondente alla prima cella.
> Se in F5 c'è "G" tutte le celle da F5 a F10 sono colorate col colore 6,
> ancorché F6, F7, F8, F9 e F10 contengano altri codici.
> Mi sbaglio?
No, hai perfettamente ragione, sono io che comincio sempre
- se non diversamente richiesto - pensando alle cose
semplici.
Bye!
Scossa
> Oppure quello che avete messo � solo il codice preliminare ?!?
> Se poteste spegarmi in modo pi� chiaro,please?!?!
> Grazie mille
Mi piacerebbe molto vedere questo file per capirci qualcosa di pi�.
Perch� - modificati i dati riservati - non ne fai l'upload in un sito di
hosting e ci dai il link?
Potremmo esserti moooolto pi� utili, con meno fatica...
Ciao,
E.
Ok stasera carico e poi vi do il link :-)
grazie ragazzi
Ecco ragazzi, siccome sono bloccata in casa dalla neve ho potutto
caricare il file on line.
Il link al mio foglio excel su cui avrei bisogno della modifica è
questo
http://dl.dropbox.com/u/3616706/Copy%20of%20LISTAin1.9.1.xls
va bene così o devo darvi altre informazioni?
Intanto grazie :-)
Ecco ragazzi, siccome sono bloccata in casa dalla neve ho potutto
caricare il file on line.
Il link al mio foglio excel su cui avrei bisogno della modifica �
questo
http://dl.dropbox.com/u/3616706/Copy%20of%20LISTAin1.9.1.xls
va bene cos� o devo darvi altre informazioni?
Intanto grazie :-)
*********
Risp
*********
Ho scaricato il file e c'� un sacco di roba che, non sapendo cosa debba
fare, non ho proprio guardato.
Ho cancellato tutti i fogli lasciando solo "NUCLEO A", "CARICHI NUCLEO A" e
"legenda" per inserire il codice che nel foglio "NUCLEO A" colora le celle
in base al codice di prodotto inserito, copiandolo da quello della tabella
posta in "legenda".
Questa � la routine (posta nel modulo di "NUCLEO A"):
-------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, Leg As Range, c1 As Range, c2 As Range
Set rng = Intersect(Me.Range("F6:I85"), Target)
If rng Is Nothing Then Exit Sub
Set Leg = ThisWorkbook.Worksheets("legenda").Range("B5")
Set Leg = Leg.Resize(Leg.End(xlDown).Row - Leg.Row + 1)
For Each c1 In rng.Cells
For Each c2 In Leg
If c1.Value = c2.Value Then
c1.Interior.ColorIndex = c2.Interior.ColorIndex
Exit For
Else
c1.Interior.ColorIndex = xlColorIndexNone
End If
Next c2
Next c1
End Sub
-------------------
e questo � il file
http://www.4shared.com/file/178195301/7e673c04/Tartaruga.html
Quando modifichi la tabella posta in "legenda" e inserisci nuovi prodotti,
colorali nel colore che ti pare.
I successivi inserimenti in "NUCLEO A" assumeranno automaticamente lo stesso
colore.
Almeno se ho capito quello che ti interessa...
Ciao,
E.
Ciao E,
non mi ero accorta della tua risposta.
Vado a verificare e intanto comunque ti ringrazio.
Ti faccio sapere
:-)
Forse la routine ammette solo una lettera come codice?
grazie ancora e scusate i tempi ...lunghi!
Finalmente dopo tanto tempo sono riuscita a verificare la routine che
mi hai cos� gentilmente fornito.
Purtroppo funziona bene con lettere singole (A oppure G ecc) ma se
come codice prodotto inserisco pi� di una lettera (AS oppure VL) non
mi colora la cella con il colore presente nel foglio legenda.
Forse la routine ammette solo una lettera come codice?
grazie ancora e scusate i tempi ...lunghi!
***************
Non capisco quel che dici.
Nel file che hai scaricato ci sono codici di esempio di tutte le lunghezze.
Eccoli:
A
G
VE
VIOLA
LN
LE
LS
FM1
FM2
As
AM
AL
SSS
SSM
SSL
SMS
SMM
... li trovi gi� colorati e, se li cambi, funzionano!
Forse dovresti spiegarti meglio...
Ciao,
E.
Ciao Plinius.
La butto l�, vedo solo questo codice.
As e AS sono diversi. Come li avr� scritti
l'OP?
--
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4890 (20100223) __________
Il messaggio � stato controllato da ESET NOD32 Antivirus.
Partito un colpo....
... voleva essere:
If UCase(c1.Value) = UCase(c2.Value) Then
non sarebbe meglio?
Non � chiaro quale sia il tipo di confronto che le serve e, d'altra parte,
dovrebbe essere predefinito quello di tipo "testo".
Il problema che evidenzia sarebbe il mancato funzionamento con stringhe di
lunghezza superiore a 1... mah!
Forse in primavera ci dir� qualcosa, non disperiamo! :-))
Ciao,
E.
LOL!
Ciao ragazzi,
allora cerco di spiegarmi meglio :-)
Il nuovo script in VBA funziona perfettamente rispetto alle mie
esigenze cioè io cambio un codice, ad esempio nella cella C8 del
foglio "legenda" metto la sigla Z con sfondo della cella giallo e lui
colora la cella di un qualunque foglio all'interno del file in cui la
inserisco con il colore con cui è colorata la cella C8 del foglio
legenda. Se cambio il colore della cella C8 lasciando la sigla Z la
cella in cui metterò la Z si colora con il nuovo colore.Perfetto.
Vorrei che facesse sempre così.
Invece se inserisco codici con due lettere ad esempio in C9 metto
"As"o "aS" (non credo sia sensibile alle maiuscole ma non sarebbe un
problema) e lo sfondo della cella è azzurro, la cella in cui inserisco
la sigla As (o sue varianti) resta bianca mentre dovrebbe colorarsi di
azzurro.
Ho notato una cosa che prima non avevo osservato.
Nel foglio excel su cui avete provato il codice che era composto da un
solo foglio legenda ed un solo foglio in cui vengono inserite le celle
in realtà il codice funziona perfettamente sia con codici di una sola
lettera che di due o di tre. Io però devo usare il codice in un file
excel composto da più fogli che si ripetono ,anche se con nomi
diversi, e in quello il codice produce il problema che vi ho spiegato
sopra.
Il file excel è composto da varie sheet: settore A, carichi settore A,
settore B, carichi settore B, settore C, carichi settore C ecc, alla
fine c'è una sheet carichi generali su cui la "colorazione variabile"
non serve(è solo un foglio riepilogativo) e un unico foglio "legenda"
che vale per tutte le sheet.
Io ho copiato lo script Vba in ogni sheet Settore (A,B,C ecc) che è
poi dove vado a inserire i codici prodotti e dove mi serve la
colorazione ma, come dicevo,colora solamente se il codice è ad una
lettera.
Spero di essere stata più chiara.
Grazie ancora
Il nuovo script in VBA funziona perfettamente rispetto alle mie
esigenze cio� io cambio un codice, ad esempio nella cella C8 del
foglio "legenda" metto la sigla Z con sfondo della cella giallo e lui
colora la cella di un qualunque foglio all'interno del file in cui la
inserisco con il colore con cui � colorata la cella C8 del foglio
legenda. Se cambio il colore della cella C8 lasciando la sigla Z la
cella in cui metter� la Z si colora con il nuovo colore.Perfetto.
Vorrei che facesse sempre cos�.
Invece se inserisco codici con due lettere ad esempio in C9 metto
"As"o "aS" (non credo sia sensibile alle maiuscole ma non sarebbe un
problema) e lo sfondo della cella � azzurro, la cella in cui inserisco
la sigla As (o sue varianti) resta bianca mentre dovrebbe colorarsi di
azzurro.
Ho notato una cosa che prima non avevo osservato.
Nel foglio excel su cui avete provato il codice che era composto da un
solo foglio legenda ed un solo foglio in cui vengono inserite le celle
in realt� il codice funziona perfettamente sia con codici di una sola
lettera che di due o di tre. Io per� devo usare il codice in un file
excel composto da pi� fogli che si ripetono ,anche se con nomi
diversi, e in quello il codice produce il problema che vi ho spiegato
sopra.
Il file excel � composto da varie sheet: settore A, carichi settore A,
settore B, carichi settore B, settore C, carichi settore C ecc, alla
fine c'� una sheet carichi generali su cui la "colorazione variabile"
non serve(� solo un foglio riepilogativo) e un unico foglio "legenda"
che vale per tutte le sheet.
Io ho copiato lo script Vba in ogni sheet Settore (A,B,C ecc) che �
poi dove vado a inserire i codici prodotti e dove mi serve la
colorazione ma, come dicevo,colora solamente se il codice � ad una
lettera.
Spero di essere stata pi� chiara.
Grazie ancora
********************
Ecco... ora dovrebbe essere chiaro!
La macro � questa:
-----------------
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, Leg As Range, c1 As Range, c2 As Range
Set rng = Intersect(Me.Range("F6:I85"), Target)
If rng Is Nothing Then Exit Sub
Set Leg = ThisWorkbook.Worksheets("legenda").Range("B5")
Set Leg = Leg.Resize(Leg.End(xlDown).Row - Leg.Row + 1)
For Each c1 In rng.Cells
For Each c2 In Leg
If c1.Value = c2.Value Then
c1.Interior.ColorIndex = c2.Interior.ColorIndex
Exit For
Else
c1.Interior.ColorIndex = xlColorIndexNone
End If
Next c2
Next c1
End Sub
--------------------
e, come vedi, alla terza riga controlla se la cella modificata rientra tra
quelle che si vuole assoggettare alla colorazione.
Per il foglio "NUCLEO A" questa zona � individuata in F6:I85
Questo vuol dire che se scrivi "AS" fuori da quella zona non succede un bel
niente mentre, se � all'interno di essa, la cella si colora.
Dopo aver copiato la macro nei moduli di tutti i fogli in cui hai bisogno
della colorazione, modifica per ciascuno di essi la zona che ti interessa
cambiando questa riga:
Set rng = Intersect(Me.Range("F6:I85"), Target)
...indicando, foglio per foglio, le zone che ti interessano.
Ciao,
E.
Ciao ragazzi, rispondo al volo.
So quale parte del codice definisce il range di celle su cui agisce il
codice stesso che però è uguale per ogni nucleo quindi copiando il
codice nella pagina di ogni nucleo dovrebbe funzionare (come funziona
nel foglio con un sigolo nucleo) invece no.
Proverò a cancellare e a ricopiarlo ma se mancasse qualche pezzo mi
uscirebbe la finestra di debug invece no, semplicemente non colora.
Comunque provo a rifare tutto....
non si sa mai.
As soon as possible (magari prima di primavera ;-))))
Grazie
Ciao a tutti,
finalmente ho avuto modo di provare il form in excel con il codice VBA
che mi avete dato.
Ora ho capito che cosa bloccava la colorazione delle celle.
Nel foglio "legenda" in cui il codice VBA andava a raccogliere le
informazioni per sapere colore e lettera da abbinare avevo lasciato
delle righe vuote che di fatto bloccavano la routine. per cui il
codice funzionava solamente con le righe a monte della riga vuota.
Elimando il "salto" il codice funziona perfettamente.
Grazie :-)
****************
Bene, bene, ma...
"As soon as possible (magari prima di primavera ;-))))"
Obiettivo mancato di 4 giorni! :-))
Grazie del riscontro!
E. :-)
Accidenti ;-)
Comunque funzia alla grande :-)