› Sviluppare funzionalita su Microsoft Office con VBA › Somma per settimana
-
AutoreArticoli
-
Buongiorno a tutti, ho un problemino con un pezzo di codice, in pratica tramite questa parte dovrei sommare tutte le celle piene sotto ad AM2 a quelle trovate in una tabella contenente tutte le settimane. e non riesco a farla funzionare, qualcuno può aiutarmi?
Grazie
Allego il file per chi volesse vederlo.
La macro in questione si chiama SOMMA ed è applicata ad un pulsante presente in MASCHERA RICERCA
`Set r = Range("B35:BA35").Find(What:=Range("E11").Value, LookIn:=xlValues, LookAt:=xlWhole) If Not r Is Nothing Then For j = 1 To Range("AM2").End(xlDown).Row Cells(r.Row + j, r.Column) = Cells(r.Row + 1, r.Column) + Range("N" & j + 1) Next j End If`Allegati:
You must be logged in to view attached files.Ciao purtroppo non posso vedere il file, ma avrei domande riguardo al codice:
Tu cerchi il valore contenuto in E11 dentro al Range(B35:BA35) e lo assegni ad R, in seguito ti assicuri che sia stato trovato e nel caso esegui un ciclo che va da 1 al numero di riga dell'ultima cella non vuota sotto ad AM2.
- hai detto che vuoi sommare tutte le celle non vuote sotto AM2, però c'è un problema qui
Range("AM2").End(xlDown).RowIl metodo End si ferma alla prima occorrenza di cella vuota, quindi se ci sono in seguito altri valori non li vede. Dovresti usare una strategia diversa per farti dare l'ultima cella piena
Range("AM" & Rows.Count).End(XlUp).RowCioè spostarti all'ultima cella in basso del foglio e risalire fino alla prima cella piena.
- altra cosa, usi più volte R.Row, ma R avrà sempre e soltanto il valore 35 per via del range di ricerca, quindi mi domando perché non usare il valore direttamente?
Spero di essere stato chiaro
Io il file l'ho visto ma non è chiaro bene ciò che vuoi ottenere. Quello che forse ho capito è che non stiamo parlando del Foglio "MASCHERA RICERCA" bensì del Foglio "Ordine Rame".
Puoi essere più chiaro con una spiegazione più dettagliata? Magari facendo un esempio pratico.
Ci provo, allora in pratica si tratta di sommare le celle presenti in AM2;AM29 alle corrispondenti trovate confrontando E11 ( n settimana richiesta ) nella riga 35 ( dove ci sono tutti i numeri delle settimane ) partendo dalla riga 36 fino alla 63 ( si tratta di 27 righe in tutto ).
Nell'esempio che ho mandato dovrei sommare AM2;AM29 all'intervallo Z36;Z63 intervallo individuato confrontando E11 con Z35 ( settimana 25).
Al variare di E11 varierà anche l'intervallo in cui sommare le celle (se fosse la settimana 26 sommerebbe l'intervallo AA36;AA63)
Spero di essere stato chiaro grazie mille per la risposta
@Ale.1989 aspetta forse ho capito!
Tu dici che questa parte di codice non esegue la somma? Ipotesi:
Se in cella "E11" c'è scritto 25 allora rileva il numero di colonna dove nel rigo 35 sia presente 25. Poi parte un ciclo, lungo da 1 a quanto è grande il Range("AM2:AM" & ultimo rigo compilato...nel tuo esempio sarebbe sempre 29), che esegue la somma di ciò che è presente + il valore presente lungo le celle nel Range("N2") in giù fino alla fine del ciclo....
Se così fosse, la somma avviene solo che tu non la vedi perché la tabella delle settimane ("A35:BA63") ha come FormatNumber = Numeri a zero decimali. Dovresti formattarla a 2 posizioni decimali.
Poi altra cosa...modifica questa linea di codice da così:
For j = 1 To Range("AM2").End(xlDown).Rowa così:
For j = 1 To Range("AM2").End(xlDown).Row - 1altrimenti il ciclo fa un'iterazione in più.
Ma quindi devi sommare tutto l'intervallo che comprende AM2:AM29 + l'intervallo "Z36:Z63" (nel caso "E11" = 25)?
E questo totale dove dovrà essere visualizzato?
Si esatto, ( AM2+Z36 , AM3+Z37 .....AM29+Z63 ) la colonna con il risultato non deve essere visualizzato da nessuna parte. Sono sicuro che al momento non funziona perché ho registrato molti codici circa 400 e dovrebbero esserci dei valori un pò più alti.
p.s. so che è senza decimali tabella l'ho messa volontariamente.
Mmmm...diciamo che sto iniziando a capire pian piano...però non ho capito una cosa: prendiamo per esempio sempre in esame la colonna "Z"...in questo momento, così com'è codificato, questa colonna, dal rigo 36 al 63, le celle verranno popolate da una somma che proviene da ciò che attualmente è contenuto al proprio interno + il valore della cella in colonna "N" & j + 1 ("N2", "N3", "N4",....."N29")
Ora tu dici che ti serve un'altra somma, tra "AM2"+"Z36"; "AM3"+"Z37", ecc...giusto? Ma questa somma dove dovrà comparire? Sempre in celle in colonna "Z"? Quindi in "Z36" ci sarà una somma di 3 addendi: "N2"+"M2"+"Z36"; ecc....giusto?
Forse l'inghippo sta proprio qui, non ci deve essere una somma con 3 addendi ma solo con 2 addendi in particolare M2 + Z36 lo colonna N non c'entra niente....
ciao
io ho capito
=MATR.SOMMA.PRODOTTO((($B$35:$BA$35=$E$11)*$B$36:$BA$63))+SOMMA($AM$2:$AM$29)
ma non si riesce a capire se le matrici sono fisse
o variabili
Forse l'inghippo sta proprio qui, non ci deve essere una somma con 3 addendi ma solo con 2 addendi in particolare M2 + Z36 lo colonna N non c'entra niente....
"M2"????? Cos'è ora "M2"? Forse volevi dire "AM2"!
Dunque il codice attuale è questo:
Set r = Range("B35:AZ35").Find(What:=Range("E11").Value, LookIn:=xlValues, LookAt:=xlWhole) If Not r Is Nothing Then For j = 1 To Range("AM2").End(xlDown).Row Cells(r.Row + j, r.Column) = Cells(r.Row + 1, r.Column) + Range("N" & j + 1) Next j End IfAl quarto rigo, verso la fine, c'è scritto + Range("N" & j + 1)
quindi durante il ciclo FOR sta sommando le celle in colonna "N" partendo dal rigo 2 (j + 1)
Forse intendi che non deve considerare la colonna "N" bensì la colonna "AM"?
ciao
Alex
mi fai un poco di didattica
Range("AM2").End(xlDown).Row
trova l'ultima cella avvalorata.
ma nel caso di questo file si ferma a AM29 o trova AM63
in pratica ci sono due righe vuote in mezzo
bloccano il conteggio o continuano fino alla riga 63
Si esatto, ho scritto male la somma deve essere "AM2" + "Z36"
Intendo proprio questo .. non considerare la colonna N ma la colonna AM
Ciao @gianfranco55, si esatto si ferma alla riga 29.
mentre per @Ale.1989 finalmente...be' quindi presumo che non sia difficile per te correggere la linea di codice? Ti ricordi di aggiungere
- 1alla fine del rigo di codice:For j = 1 To Range("AM2").End(xlDown).Rowaltrimenti fai un ciclo in più. Ecco perché ti capitano quegli zero nel rigo 64...fa una iterazione in più superflua.
In teoria sì non sono molto pratico di modifiche 😅devo solo cambiare la N nel ciclo for con AM ?
devo solo cambiare la N nel ciclo for con AM ?
Io proverei se fossi in te
Ok ho appurato che non funziona, o meglio funziona solo se sotto la settimana corrispondente alla ricerca i valori sono a 0, provando a lanciare 2 volte la macro capita che la prima volta aggiunge i valori correttamente, mentre al secondo lancio non viene effettuata la somma
mentre al secondo lancio non viene effettuata la somma
non è che non viene effettuata
semplicemente da qualche parte quando lanci la macro viene azzerata la colonna della settimana
A me questa funziona:
With Worksheets("Ordine Rame").Rows(35) Set r = .Find(Range("E11").Value, LookIn:=xlValues, LookAt:=xlWhole) End With If r Is Nothing Then MsgBox "Valore non valido" Exit Sub End If Uriga = Worksheets("Ordine Rame").Cells(Rows.Count, Mid(r.Address, 2, 1)).End(xlUp).Row i = 1 For Each rng In Range(r.Address & ":" & Mid(r.Address, 2, 1) & Uriga - 1) If rng.Value <> Range("E11").Value Then Range("AM" & i).Value = Range("AM" & i).Value + rng.Value End If i = i + 1 NextOk ho appurato che non funziona, o meglio funziona solo se sotto la settimana corrispondente alla ricerca i valori sono a 0, provando a lanciare 2 volte la macro capita che la prima volta aggiunge i valori correttamente, mentre al secondo lancio non viene effettuata la somma
Trovato l'errore
...allora nel rigo:Cells(r.Row + j, r.Column) = Cells(r.Row + 1, r.Column) + Range("AM" & j + 1)dove c'è scritto ..... = Cells(.Row + 1, r.Column) .....
l'errore è quel 1. Sostituisci 1 con j e tutto funzionerà
Codice migliorato:
With Worksheets("Ordine Rame").Rows(35) Set r = .Find(Range("E11").Value, LookIn:=xlValues, LookAt:=xlWhole) End With If r Is Nothing Then MsgBox "Valore non valido" Exit Sub End If Uriga = Worksheets("Ordine Rame").Cells(Rows.Count, Mid(r.Address, 2, 1)).End(xlUp).Row j = 2 For Each rng In Range(r.Offset(1, 0).Address & ":" & Mid(r.Address, 2, 1) & Uriga - 1) Range("AM" & j).Value = Range("AM" & j).Value + rng.Value j = j + 1 Next -
AutoreArticoli
