Domanda sommare valori in range dinamico

Pedroz 1312

Utente junior
27 Ottobre 2020
35
6
2019
0
Buonasera a tutti,
nel mio foglio ho una serie di dati che corrispondono ad una serie di prodotti che vengono venduti ogni giorno, quindi ho nella prima colonna la data di vendita e poi nella colonna C il costo prodotto, in quella D l'eventuale sconto e nel foglio E il Costo complessivo (quindi costo prodotto - sconto).
adesso vorrei fare due cose:
1) inserire alla fine del mese una riga in cui andrò ad inserire i totali (i totali di tutta la colonna C, i totali ella colonna D e poi di quella E)
2) inserire nella riga successiva un totale progressivo che vada a sommare, mano a mano che vado avanti con i mesi, il totale venduto fino a quel momento.
Ora, fermo restando il problema dell'inserimento nella riga, non so proprio come potrei effettuare il calcolo dei totali essendo il range dinamico, cioè non avrò sempre lo stesso numero di prodotti venduti ed inoltre capiterà che ad esempio il 31 del mese vengano venduti più prodotti.
Inserisco un file di esempio ma tenete presente che i dati li inserisco tramite userform, quindi vorrei un clickbutton che mi permettesse di inserire materialmente le righe ed i totali.
Vi ringrazio in anticipo
 

Allegati

Terix81

Utente abituale
13 Aprile 2020
459
30
Benevento
Excel 2016
26
Ciao, per quanto riguarda il punto 1) sono ci sono problemi particolari perché basta inserire una macro che ti calcola i totali ; un po' più articolato è il punto 2) perché, inserita la riga la prima volta il totale progressivo potrebbe "incrementarsi" facendo aggiungere sempre nella stessa cella il totale del mese precedente (memorizzato in una variabile ad esempio).
Parlavi di una userform ma sul file allegato non ce n'è traccia. anche capire come inserisci i dati potrebbe metterci sulla strada giusta.
 

Pedroz 1312

Utente junior
27 Ottobre 2020
35
6
2019
0
il problema del punto uno è che non è possibile dire in anticipo il range (faccio un esempio C2:E10) proprio perché andando ad inserire ogni mese sempre nello stesso foglio e dato che si vendono un numero variabile di prodotti ogni mese non so proprio come impostare questo codice. appena posso pubblico il file con la userform che comunque non è altro che una serie di textbox e combobox per riempire il form con le colonne elencate
 

ges

Excel/VBA Expert
Amministratore
21 Giugno 2015
29.234
1.865
Como
2011MAC 365WIN
962
Ciao, giusto per capire, nel file che hai allegato le righe in grigio è il risultato che vorresti avere?
Se è così sarebbe da capire come è il file originario e come deve diventare.
 

Pedroz 1312

Utente junior
27 Ottobre 2020
35
6
2019
0
Ciao, giusto per capire, nel file che hai allegato le righe in grigio è il risultato che vorresti avere?
Se è così sarebbe da capire come è il file originario e come deve diventare.
Esatto, vorrei avere un commandbutton che mi permetta di inserire una riga con scritto totale mese etc come nell'esempio (anche colorarla in grigio) e contestualmente mi calcola i totali ma attenzione solo dell'ultimo mese.
mi spiego meglio:
dopo che aggiorno, giorno dopo giorno, questo foglio excel, alla fine del mese clicco sul commandbutton che mi inserisce la riga colorata con la scritta totale mese e sotto totale progressivo e mi calcola il totale dei servizi emessi nell'ultimo mese.
perché vorrei questo? semplice questa specie di gestionale verrà usato da chi non sa nemmeno selezionare un insieme di celle e cliccare su somma......
 

Allegati

ges

Excel/VBA Expert
Amministratore
21 Giugno 2015
29.234
1.865
Como
2011MAC 365WIN
962
Ti posto un codice in base alle tue ultime indicazioni, adattalo alle tue esigenze
Visual Basic:
Sub somma_progressiva()
    Dim uR As Long
    Dim inizio As Long
    Dim fine As Long
    Dim x As Long
    Dim j As Long
    Dim tot As Double
    Dim totprogr As Double
    uR = Cells(Rows.Count, 1).End(xlUp).Row
    inizio = 3: x = 3
    Do While x <= uR
        For j = x To uR
            If Month(Cells(j, 1)) <> Month(Cells(j + 1, 1)) Then
                fine = j
                Exit For
            End If
        Next
        tot = Application.Sum(Range("G" & inizio & ":G" & fine))
        totprogr = totprogr + tot
        Rows(fine + 1 & ":" & fine + 3).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Cells(fine + 1, 1) = "TOTALE MESE"
        Cells(fine + 2, 1) = "TOTALE PROGRESSIVO"
        Cells(fine + 1, 7) = tot
        Cells(fine + 2, 7) = totprogr
        Range("A" & fine + 1 & ":G" & fine + 2).Interior.ColorIndex = 15
        tot = 0: inizio = j + 4
        If Cells(inizio, 1) = "" Then Exit Do
        uR = uR + 4
        x = j + 4
    Loop
End Sub
 

Allegati

  • Like
Reactions: Vincenzo Damiani

Pedroz 1312

Utente junior
27 Ottobre 2020
35
6
2019
0
Ti posto un codice in base alle tue ultime indicazioni, adattalo alle tue esigenze
Visual Basic:
Sub somma_progressiva()
    Dim uR As Long
    Dim inizio As Long
    Dim fine As Long
    Dim x As Long
    Dim j As Long
    Dim tot As Double
    Dim totprogr As Double
    uR = Cells(Rows.Count, 1).End(xlUp).Row
    inizio = 3: x = 3
    Do While x <= uR
        For j = x To uR
            If Month(Cells(j, 1)) <> Month(Cells(j + 1, 1)) Then
                fine = j
                Exit For
            End If
        Next
        tot = Application.Sum(Range("G" & inizio & ":G" & fine))
        totprogr = totprogr + tot
        Rows(fine + 1 & ":" & fine + 3).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Cells(fine + 1, 1) = "TOTALE MESE"
        Cells(fine + 2, 1) = "TOTALE PROGRESSIVO"
        Cells(fine + 1, 7) = tot
        Cells(fine + 2, 7) = totprogr
        Range("A" & fine + 1 & ":G" & fine + 2).Interior.ColorIndex = 15
        tot = 0: inizio = j + 4
        If Cells(inizio, 1) = "" Then Exit Do
        uR = uR + 4
        x = j + 4
    Loop
End Sub
innanzitutto ti ringrazio per la celere risposta ma vorrei correggere due cose:
1) mi piacerebbe che effettuasse l'inserimento delle righe e dei totali contestualmente in entrambi i fogli. Potrei farlo con questo codice? (non ho la possibilità di testarlo subito)
Visual Basic:
Sheets(Array("CONTO TERZI,"CONTO PROPRIO")).Select
2)Se inserisco un mese di servizi faccio partire il codice e mi genera le righe con i totali. il problema è che se poi successivamente vado a riempire le celle con i dati di vendita del mese nuovo, nel momento in cui finisce il mese e devo inserire i totali mi da questo errore:
errore di run time 13, Tipo non corrispondente e se faccio debug mi evidenzia
Visual Basic:
If Month(Cells(j, 1)) <> Month(Cells(j + 1, 1)) Then
Cioè detto banalmente vorrei poter inserire le righe e i totali mano a mano che finisco il mese di vendita
Grazie mille come sempre
 

ges

Excel/VBA Expert
Amministratore
21 Giugno 2015
29.234
1.865
Como
2011MAC 365WIN
962
1) mi piacerebbe che effettuasse l'inserimento delle righe e dei totali contestualmente in entrambi i fogli. Potrei farlo con questo codice?
No, devi usare un ciclo che prenda in consierazione prima un foglio e poi l'altro.

se poi successivamente vado a riempire le celle con i dati di vendita del mese nuovo, nel momento in cui finisce il mese e devo inserire i totali mi da questo errore:
errore di run time 13, Tipo non corrispondente e se faccio debug mi evidenz
Perchè il codice è scritto per funzionare solo quando non sono inseriti i totali e i totali progressivi.
 

Pedroz 1312

Utente junior
27 Ottobre 2020
35
6
2019
0
ok grazie mille adesso proverò a modificare il codice in modo da inserire i totali solo del mese nuovo che si crea di volta in vlta
 
Ultima modifica di un moderatore:

karug64

Utente abituale
17 Gennaio 2021
312
30
Office 365
39
Scusate se intervengo.
Ma P @Pedroz 1312 , sbaglio o hai cambiato il file che avevi postato all'inizio del tuo intervento ?
Dicevi di dover sommare le colonne C,D,E , ma ora vedo che forse ti basta sommare la colonna "G" ? O sbaglio ?
O vanno sommati anche i N.Contratti e Catetorie ?

Grazie
 

Pedroz 1312

Utente junior
27 Ottobre 2020
35
6
2019
0
esatto all'inizio ho chiesto consiglio su un file generale (perchè poi avrei adattato il codice alla mia userform) poi avendomi chiesto di postare la mia userform ho allegato il file che sto sviluppando (che presenta una struttura leggermente diversa ma la logica è la stessa ovvero quella di determinare i totali in un range dinamico inserendo una riga dei totali alla fine di ogni mese).
Quindi basta che si sommano i valori contenuti nella colonna G.
anche se sto trovando un po di difficolta nell'elaborare un codice corretto
Mi scuso se ho creato un po di confusione
 

karug64

Utente abituale
17 Gennaio 2021
312
30
Office 365
39
Ok.
Ti propongo questa soluzione che ricalca la logica di quella proposta da ges @ges (che saluto e ringrazio), ma aggiunge qualcosina in più nella speranza di renderla ancora più flessibile. (Il codice non è stilisticamente perfetto e sicuramente ridondante, ma spero funzionante ...):

Visual Basic:
Option Explicit
Sub totaliprogr()
Dim uR As Integer
Dim m As Integer, x As Integer
Dim iniz As Integer, fine As Integer
Dim submesi(12) As Long
Dim r As Integer
Dim sm As Integer
Dim sG As String
Dim contaR As Integer
Dim miorange As Range, CEL As Range
Dim ws As Worksheet

For Each ws In Worksheets
If ws.Name <> "CONTO TERZI" And ws.Name <> "CONTO PROPRIO" Then Exit For
ws.Select

uR = ws.Range("A65000").End(xlUp).Row
m = 0
iniz = 3
fine = 0

'Elimino le righe di totali e subtotali già presenti
Do While True
    uR = ws.Range("A65000").End(xlUp).Row
    contaR = 0
    For j = 3 To uR
        If ws.Cells(j, 1).Value = "TOTALE MESE" Or ws.Cells(j, 1).Value = "TOTALE PROGRESSIVO" Then
            contaR = contaR + 1
        End If
    Next j
    If contaR = 0 Then Exit Do

    Set miorange = ws.Range("A1:A" & uR)
    For Each CEL In miorange
        If CEL = "" Then Exit For
            If CEL.Value = "TOTALE MESE" Then
                CEL.EntireRow.EntireRow.Delete
            End If
    Next CEL
    uR = ws.Range("A65000").End(xlUp).Row
    Set miorange = ws.Range("A1:A" & uR)
    For Each CEL In miorange
        If CEL = "" Then Exit For
            If CEL.Value = "TOTALE PROGRESSIVO" Then
                CEL.EntireRow.EntireRow.Delete
            End If
    Next CEL
    uR = ws.Range("A65000").End(xlUp).Row
    Set miorange = ws.Range("A1:A" & uR)
    For Each CEL In miorange
        If CEL.Value = "" Then
            CEL.EntireRow.EntireRow.Delete
        End If
    Next CEL
Loop

uR = ws.Range("A65000").End(xlUp).Row

For r = 3 To 10000
    If ws.Cells(r, 1).Value = "" Then Exit For
    If IsDate(ws.Cells(r, 1).Value) And IsDate(ws.Cells((r - 1), 1).Value) Then
        If Month(ws.Cells(r, 1).Value) <> Month(ws.Cells((r - 1), 1).Value) Then
            ws.Rows(r).EntireRow.Insert Shift:=xlDown
            ws.Cells((r), 1).Value = "TOTALE MESE"
            ws.Range("A" & r & ":I" & r).Interior.ColorIndex = 15
            ws.Range("A" & r & ":I" & r).Font.Bold = True
            ws.Rows((r + 1)).EntireRow.Insert Shift:=xlDown
            ws.Cells((r + 1), 1).Value = "TOTALE PROGRESSIVO"
            ws.Range("A" & (r + 1) & ":I" & (r + 1)).Interior.ColorIndex = 15
            ws.Range("A" & (r + 1) & ":I" & (r + 1)).Font.Bold = True
        End If
    End If
Next r
    uR = ws.Range("A65000").End(xlUp).Row
    ws.Rows(uR + 1).EntireRow.Insert Shift:=xlDown
    ws.Cells((uR + 1), 1).Value = "TOTALE MESE"
    ws.Range("A" & (uR + 1) & ":I" & (uR + 1)).Interior.ColorIndex = 15
    ws.Range("A" & (uR + 1) & ":I" & (uR + 1)).Font.Bold = ture
    ws.Rows((uR + 2)).EntireRow.Insert Shift:=xlDown
    ws.Cells((uR + 2), 1).Value = "TOTALE PROGRESSIVO"
    ws.Range("A" & (uR + 2) & ":I" & (uR + 2)).Interior.ColorIndex = 15
    ws.Range("A" & (uR + 2) & ":I" & (uR + 2)).Font.Bold = True

'Inserisco TOTALI X MESI
uR = ws.Range("A65000").End(xlUp).Row
For r = 3 To uR
If iniz <> 0 And fine <> 0 Then
    ws.Range("G" & (r - 1)).FormulaLocal = "=SOMMA(G" & iniz & ":G" & fine & ")"
    iniz = 0
    fine = 0
End If
    If Left(ws.Cells(r, 1).Value, 3) <> "TOT" Then
    If m = 0 Or iniz = 0 Then
        m = Month(ws.Cells(r, 1).Value)
        If IsNumeric(m) Then
            iniz = r
        End If
    End If
    End If
    If ws.Cells(r, 1).Value = "TOTALE MESE" And fine = 0 Then
        fine = r - 1
    End If
Next r

'Inserisco PROGRESSIVI
sm = 0
For r = 3 To uR
    If ws.Cells(r, 1).Value = "TOTALE MESE" Then
        sm = sm + 1
        submesi(sm) = r
    End If
Next r
sG = "=+"
For x = 1 To 12
    If submesi(x) <> 0 Then
    If x = 1 Then
       sG = sG + "G" & Trim(Str(submesi(x)))
    Else
        sG = sG + "+G" & Trim(Str(submesi(x)))
    End If
    ws.Range("G" & submesi(x) + 1).FormulaLocal = sG
    End If
Next x
Next
MsgBox "Finito."
End Sub
La macro può esssere lanciata tutte le volte che si vuole (...speriamo..) e di fatti fa questo:
- cancella dal foglio tutte le righe già presenti dei totali
- le ricrea inserendo nelle righe le formule corrette

pertanto, dopo averla fatta girare, sarai libero di inserire righe nei mesi (anche a totali e subtotali già calcolati).

Ovviamente alcuni paletti ci sono :
- la tabella deve essere ordinata per data (colonna "A")
- nella colonna "A" devono esserci date "reali"
- Lavora solo sui due foglio "CONTO ..."

potrai tranquillamente inserire il codice per ordinare la tabella dopo la cancellazione delle righe dei totali. Lascio a te il compito.

Ho fatto alcune prove e sembra funzionare.

Ciao
 
  • Like
Reactions: Vincenzo Damiani

Pedroz 1312

Utente junior
27 Ottobre 2020
35
6
2019
0
Sembra funzionare alla perfezione anche se non ho avuto molto tempo per provarla causa lavoro.
L'unico particolare è che se i due fogli, conto terzi e conto proprio, non seguono le stesse righe, nel foglio con meno righe compilate ci sarà la formula dei totali nella cella corrispondente l'ultima riga del foglio con più righe compilate.
Cioè faccio un esempio, nel conto terzi l'ultima riga inserita è A50 ed in conto proprio è A30, in conto proprio ad A50 ci sarà la cifra con la formula per il calcolo dei totali ma credo che, essendo impostata la macro per eliminare le precedenti righe dei totali, non sia un problema.
Oggi pomeriggio che ho un po' di tempo faccio un po' di test.
In ogni caso ti ringrazio di vero cuore mi hai aiutato tantissimo

[overquoting]
 

Pedroz 1312

Utente junior
27 Ottobre 2020
35
6
2019
0
Scusate se approfitto
Facendo vari test ho notato (non so come abbia fatto a non accorgermene prima) che nonostante nella TextBox 1 (colonna Data) abbia inserito il codice:
Visual Basic:
TextBox1.Value = Format(Date, "dd/mm/yyyy")
in Userform_Activate, quando vado ad inserire i dati nel foglio mi riporta invertito il giorno e il mese.
ho provato anche a selezionare direttamente sul foglio excel tutta la colonna data e formattarla ma non è cambiato nulla.
Ho controllato tutti codici ma non mi serba che ci sia qualcosa che vada ad inficiare
 

Allegati

karug64

Utente abituale
17 Gennaio 2021
312
30
Office 365
39
TextBox1.Value = Format(Date, "dd/mm/yyyy") in Userform_Activate, quando vado ad inserire i dati nel foglio mi riporta invertito il giorno e il mese.
La soluzione (ma il perchè dovrà dartela qualcuno esperto di configurazioni di excel, immagino) che a me funziona è questa:
in Userform.Activate metti:
TextBox1.Value = Date

in label9_click()
metti
Sheets(fo).Cells(numriga, 1) = Format(TextBox1.Text, "mm/dd/yyyy") (e non mi chiedere perchè... potrebbe essere una configurazione generale del tuo excel o non so cosa ...)

P.S.
Essendo un nuovo quesito sarebbe stato opportuno aprire un nuovo post. Qualsiasi utente avesse il tuo stesso problema non si accorgerebbe della eventuale soluzione al problema (sia essa la mia o di qualcun altro).

Ciao
 

karug64

Utente abituale
17 Gennaio 2021
312
30
Office 365
39
Ciao, giulianovac @giulianovac ,
devo dirti che ho provato sul mio excel 365 standard su un file creato exnovo, sia sul file di P @Pedroz 1312 è il problema si verifica in entrambi i casi... :dubbioso:
 

giulianovac

Access/VBA Expert
Staff
9 Giugno 2018
4.860
145
Italy
2019
376
devo dirti che ho provato
Io mi riferivo all'istruzione indicata da voi da mettere in Userform_Activate:
TextBox1.Value = Format(Date, "dd/mm/yyyy")
o
TextBox1.Value = Date

Riguardo invece alla copia dei dati da userform a foglio, l'errore è inserire una data come testo, quando invece va inserita sempre come data, ovvero usando la funzione CDate():

Codice:
Sheets(fo).Cells(numriga, 1) = CDate(TextBox1.Text)
 
  • Like
Reactions: karug64

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!