Condividi tramite

Somma range variabile

Anonimo
2010-10-16T16:07:18+00:00

Con la seguente partendo dalla colonna E determino la prima colonna vuota e inserisco la dicitura "TOTALE" come intestazione:

    Dim iCol As Integer

    iCol = 5

    While Sheets("Totali").Cells(1, iCol) <> ""

    iCol = iCol + 1

    Wend

    Sheets("Totali").Cells(1, iCol).Value = "TOTALE"

dopodichè dovrei fare il totale per riga (dalla riga 2 in poi, se diversa da vuota) partendo dalla colonna E fino a quela precedente  a "TOTALE" (che è variabile)

Ad esempio se la colonna TOTALE è la N devo sommare E2:M2, E3:M3, ecc. fino a che non trova riga vuota.

Non riesco a implementare il codice, potreste darmi una mano? Grazie e un saluto a tutti.

Ciao

Antonio

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-10-18T08:10:17+00:00

Ciao mauro, grazie del codice, ho apportato qualche modifica per mie esigenze:

<cut>

Non sapendo mettere le mani sul tuo codice ho creato due macro a parte, con la prima effettuo un controllo se la colonna "TOTALE" già esiste la cancella e poi prosegue con somme (altrimenti se per sbaglio lancio due o più volte mi ritrovo con diverse colonne "TOTALE" ripetute), la seconda riporta i valori al posto delle formule (preferisco avere direttamente il risultato nellacolonna "TOTALE") e togli gli zero di troppo, dove alla colonna A la cella è vuota.

Grazie ancora per l'aiuto e buona Domenica.

Ciao

Antonio

Forse, più semplicemente:

Public Sub m()

    Dim shTot As Worksheet

    Dim lCol As Long

    Dim lRiga As Long

    Dim s As String

    Application.ScreenUpdating = False

    Set shTot = Worksheets("Totale")

    With shTot

        .Select

        lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

        If .Cells(1, lCol).Value = "Totale" Then Exit Sub   '<<<<<<========== Se serve solo impedire una nuova colonna

        lRiga = .Range("E" & .Rows.Count).End(xlUp).Row

        .Cells(1, lCol + 1).Value = "Totale"

        With .Cells(2, lCol + 1)

            .Select

            s = "=SUM(E2:" & f(lCol) & 2 & ")"

            .Value = s

            Selection.AutoFill Destination:=Range(f(lCol + 1) & _

                "2:" & f(lCol + 1) & lRiga), Type:=xlFillDefault

        End With

        .Range(f(lCol + 1) & _

            "2:" & f(lCol + 1) & lRiga).Value = _

            .Range(f(lCol + 1) & _

            "2:" & f(lCol + 1) & lRiga).Value

    End With

    Application.ScreenUpdating = True

    Set shTot = Nothing

End Sub

Public Function f(ByVal lng As Long) As String

    f = Split(Cells(1, lng).Address( _

        True, False, xlA1, False), "$")(0)

End Function

Public Sub mm()

    Dim s As String

    s = "Nome etichetta foglio:" & ActiveSheet.Name _

        & vbNewLine & "Nome codice: " & ActiveSheet.CodeName

    MsgBox s

End Sub


--

La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

--

Mauro Gamberini - Microsoft© MVP(Excel)

http://www.maurogsc.eu/

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-10-16T20:28:38+00:00

Con la seguente partendo dalla colonna E determino la prima colonna vuota e inserisco la dicitura "TOTALE" come intestazione:

    Dim iCol As Integer

    iCol = 5

    While Sheets("Totali").Cells(1, iCol) <> ""

    iCol = iCol + 1

    Wend

    Sheets("Totali").Cells(1, iCol).Value = "TOTALE"

dopodichè dovrei fare il totale per riga (dalla riga 2 in poi, se diversa da vuota) partendo dalla colonna E fino a quela precedente  a "TOTALE" (che è variabile)

Ad esempio se la colonna TOTALE è la N devo sommare E2:M2, E3:M3, ecc. fino a che non trova riga vuota.

Non riesco a implementare il codice, potreste darmi una mano? Grazie e un saluto a tutti.

Ciao

Antonio

Se ho capito quello che vuoi:

Public Sub m()

    Dim shTot As Worksheet

    Dim lCol As Long

    Dim lRiga As Long

    Dim s As String

    Application.ScreenUpdating = False

    Set shTot = Worksheets("Totale")

    With shTot

        .Select

        lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

        lRiga = .Range("E" & .Rows.Count).End(xlUp).Row

        .Cells(1, lCol + 1).Value = "Totale"

        With .Cells(2, lCol + 1)

            .Select

            s = "=SUM(E2:" & f(lCol) & 2 & ")"

            .Value = s

            Selection.AutoFill Destination:=Range(f(lCol + 1) & _

                "2:" & f(lCol + 1) & lRiga), Type:=xlFillDefault

        End With

    End With

    Application.ScreenUpdating = True

    Set shTot = Nothing

End Sub

Public Function f(ByVal lng As Long) As String

    f = Split(Cells(1, lng).Address( _

        True, False, xlA1, False), "$")(0)

End Function


--

La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

--

Mauro Gamberini - Microsoft© MVP(Excel)

http://www.maurogsc.eu/

La risposta è stata utile?

0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-10-18T19:18:40+00:00

    Ciao Mauro, ti ringrazio della correzione, ... "Forse, più semplicemente" ... non per me purtroppo :-((

    Ciao

    Antonio

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Eliminata

    Questa risposta è stata eliminata a causa di una violazione del codice di comportamento. La risposta è stata segnalata manualmente o identificata tramite il rilevamento automatizzato prima dell'esecuzione dell'azione. Per ulteriori informazioni, fai riferimento al codice di comportamento.


    I commenti sono stati disattivati. Ulteriori informazioni

  3. Anonimo
    2010-10-17T00:09:28+00:00

    Ciao mauro, grazie del codice, ho apportato qualche modifica per mie esigenze:

    Public Sub m()

    '<------------

    Call Controllo

    '<------------

        Dim shTot As Worksheet

        Dim lCol As Long

        Dim lRiga As Long

        Dim s As String

        Application.ScreenUpdating = False   

        Set shTot = Worksheets("Totali")

        With shTot

            .Select

            lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

            lRiga = .Range("E" & .Rows.Count).End(xlUp).Row

            .Cells(1, lCol + 1).Value = "TOTALE"

            With .Cells(2, lCol + 1)

                .Select

                s = "=SUM(E2:" & f(lCol) & 2 & ")"

                .Value = s

                Selection.AutoFill Destination:=Range(f(lCol + 1) & _

                    "2:" & f(lCol + 1) & lRiga), Type:=xlFillDefault

            End With

        End With

        Application.ScreenUpdating = True   

        Set shTot = Nothing

        '<------------

        Call CopiaValori

        '<------------

    End Sub

    Public Function f(ByVal lng As Long) As String

        f = Split(Cells(1, lng).Address( _

            True, False, xlA1, False), "$")(0)

    End Function

        '<------------

    Sub Controllo()

        Dim lCol As Integer

        lCol = 5

        While Sheets("Totali").Cells(1, lCol) <> ""

        lCol = lCol + 1

        Wend

        If Cells(1, lCol - 1) = "TOTALE" Then

        Sheets("Totali").Columns(lCol - 1).ClearContents

        End If

    End Sub

        '<------------

        '<------------

    Sub CopiaValori()

        Dim lCol As Integer

        lCol = 5

        While Sheets("Totali").Cells(1, lCol) <> ""

        lCol = lCol + 1

        Wend

        x = lCol - 1

        Sheets("Totali").Columns(lCol - 1).Select

        Selection.Copy

        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

            :=False, Transpose:=False

        Application.CutCopyMode = False

    For I = 2 To 10000

    If Cells(I, 1) = "" Then

    Cells(I, x) = ""

    End If

    Next I

    End Sub

        '<------------

    Non sapendo mettere le mani sul tuo codice ho creato due macro a parte, con la prima effettuo un controllo se la colonna "TOTALE" già esiste la cancella e poi prosegue con somme (altrimenti se per sbaglio lancio due o più volte mi ritrovo con diverse colonne "TOTALE" ripetute), la seconda riporta i valori al posto delle formule (preferisco avere direttamente il risultato nellacolonna "TOTALE") e togli gli zero di troppo, dove alla colonna A la cella è vuota.

    Grazie ancora per l'aiuto e buona Domenica.

    Ciao

    Antonio

    La risposta è stata utile?

    0 commenti Nessun commento