Discussione:
VBA - Ottenere il totale dei valori in range
(troppo vecchio per rispondere)
nicola
2005-03-13 08:49:14 UTC
Permalink
Ciao.
Oltre a sommare i diversi .value delle celle comprese in
un dato range c'è un modo più veloce di operare per
ottenere quanto in oggetto?
In pratica vorrei evitare di fare worksheets(1).range
("A1").value + worksheets(1).range("A2").value ...
("C4").value.
Grazie.
Nicola
Mauro Gamberini
2005-03-13 09:54:26 UTC
Permalink
Oltre a sommare i diversi .value delle celle comprese in
un dato range c'è un modo più veloce di operare per
ottenere quanto in oggetto?
In pratica vorrei evitare di fare worksheets(1).range
("A1").value + worksheets(1).range("A2").value ...
("C4").value.
***************************************

Non so se ho capito bene...
Dati da sommare in A1:A3

Public Sub m()

With Worksheets("Foglio2")

.Range("A4").Formula = "=SUM(A1:A3)"

End With

End Sub
--
----------------------------
Mauro Gamberini
nicola
2005-03-13 11:11:25 UTC
Permalink
Grazie.
Dover "sprecare" una cella, anche se temporaneamente, per
inserirvi la formula e poi prelevare il risultato (meglio
usare prima un .Calculate a scanso equivoci?) è già molto
rispetto a come operavo prima...
Pensavo però ci fosse anche qualcosa di più elegante...
Non è che da VBA si può accedere alla porzione di barra di
stato in cui si può automaticamente visualizzare (somma,
min, max, media ecc). Così, selezionando un dato Range
potrei recuperare la somma senza dover scrivere Formule...
Si potrebbe fare?
Nicola
-----Messaggio originale---
Oltre a sommare i diversi .value delle celle comprese in
un dato range c'è un modo più veloce di operare per
ottenere quanto in oggetto?
In pratica vorrei evitare di fare worksheets(1).range
("A1").value + worksheets(1).range("A2").value ...
("C4").value.
***************************************
Non so se ho capito bene...
Dati da sommare in A1:A3
Public Sub m()
With Worksheets("Foglio2")
.Range("A4").Formula = "=SUM(A1:A3)"
End With
End Sub
--
----------------------------
Mauro Gamberini
.
Ignazio
2005-03-13 11:37:29 UTC
Permalink
"nicola" <***@discussions.microsoft.com> ha scritto nel messaggio news:7a9a01c527bd$659b5cb0$***@phx.gbl...

Dover "sprecare" una cella, anche se temporaneamente, per
inserirvi la formula e poi prelevare il risultato (meglio
usare prima un .Calculate a scanso equivoci?) è già molto
rispetto a come operavo prima...
Pensavo però ci fosse anche qualcosa di più elegante...
Non è che da VBA si può accedere alla porzione di barra di
stato in cui si può automaticamente visualizzare (somma,
min, max, media ecc). Così, selezionando un dato Range
potrei recuperare la somma senza dover scrivere Formule...

----------------
RISPOSTA
Ciao Nicola,
dall'oggetto del post non si capiva se il risultato lo volevi in una cella
del foglio di lavoro o in una variabile.
La soluzione indicata da Mauro si rifà (credo) alla prima interpretazione.
Per quello che invece vuoi fare tu puoi usare le funzioni Excel da VBA:

Sub TestSomma()
Dim Totale As Double, myRange As Range
With Worksheets(1)
Set myRange = .Range("A1:A2,C4")
End With
Totale = Application.WorksheetFunction.Sum(myRange)
myRange.Select
MsgBox "La somma delle celle selezionate è: " & Totale
End Sub

da testare con il Worksheets(1) attivo.
--
Ciao
Ignazio
Sandro
2005-03-13 12:30:32 UTC
Permalink
Post by nicola
Dover "sprecare" una cella, anche se temporaneamente, per
inserirvi la formula e poi prelevare il risultato (meglio
usare prima un .Calculate a scanso equivoci?) è già molto
rispetto a come operavo prima...
Pensavo però ci fosse anche qualcosa di più elegante...
Non è che da VBA si può accedere alla porzione di barra di
stato in cui si può automaticamente visualizzare (somma,
min, max, media ecc). Così, selezionando un dato Range
potrei recuperare la somma senza dover scrivere Formule...
Ciao Ignazio, la seguente routine controlla che i valori nelle celle siano
numerici prima di effettuarne la somma:

'-----------------------------------------

Public Sub Somma_Range()

Dim somma As Double
Dim cella As Range
Dim objRng As Range
somma = 0
Set objRng = Worksheets(1).Range("A1:A100")

For Each cella In objRng

If Not IsNumeric(cella.Value) Then

MsgBox "Valore non numerico in " & cella.Address
Exit Sub

End If

somma = somma + cella.Value

Next

End Sub
'---------------------------------------------

Vorrei pero', un tuo parere, riguardo la velocita' e convenienza di questa
routine rispetto alla precedente, che utilizza direttamente la funzione
"Sum" del foglio di lavoro.

Ciao
Sandro
Ignazio
2005-03-13 23:31:24 UTC
Permalink
Post by Sandro
Ciao Ignazio, la seguente routine controlla che i valori nelle celle siano
'-----------------------------------------
Public Sub Somma_Range()
Dim somma As Double
Dim cella As Range
Dim objRng As Range
somma = 0
Set objRng = Worksheets(1).Range("A1:A100")
For Each cella In objRng
If Not IsNumeric(cella.Value) Then
MsgBox "Valore non numerico in " & cella.Address
Exit Sub
End If
somma = somma + cella.Value
Next
End Sub
'---------------------------------------------
Vorrei pero', un tuo parere, riguardo la velocita' e convenienza di questa
routine rispetto alla precedente, che utilizza direttamente la funzione
"Sum" del foglio di lavoro.
Ciao Sandro,
usare le funzioni Excel da VBA fa scivere un codice sicuramente più veloce.
Per rendertene conto, riempi di 1 la colonna A (seleziona la colonna A,
digita 1 e premi Ctrl+Invio), quindi confronta le due routine assegnando
prima:
Worksheets(1).Range("A1:A100")
e dopo:
Worksheets(1).Range("A1:A65536")
(testale anche dopo aver inserito un testo, ad esempio, nella cella A60000).
A me sembra che l'esecuzione della routine che usa la funzione "Sum" ha lo
stesso tempo di esecuzione nei due casi.

Cosa poi sia più conveniente ... dipende da cosa si vuol fare.
Ho notato che la routine che hai postato non esegue la somma se trova un
dato non numerico ed avvisa della cosa l'utente (presumo affinchè esegua le
dovute correzioni).
Come sicuramente saprai, la funzione SOMMA ignora valori non numerici (celle
vuote, testo, ...).
Quindi, se da VBA usi la funzione "Sum", non potresti avere questo tipo di
controllo ed il conseguente messaggio di allerta.

Comunque, per continuare a valutare l'efficenza delle funzioni Excel nella
scrittura di codice VBA, prova a testare la routine seguente, che continua
ad eseguire i controlli contenuti nella routine che proponi, ma facendo uso
delle funzioni Excel CONTA.NUMERI e CONTA.VALORI:
------
Sub TestSommaConAvviso()
Dim Totale As Double, myRange As Range
With Worksheets(1)
Set myRange = .Range("A1:A65536")
End With
With Application.WorksheetFunction
If .Count(myRange) = .CountA(myRange) Then
Totale = .Sum(myRange)
myRange.Select
MsgBox "La somma delle celle selezionate è: " & Totale
Else
MsgBox "Non ci sono solo numeri in: " & myRange.Address
End If
End With
End Sub
------
Fa sapere le tue impressioni.
--
Ciao
Ignazio
Sandro
2005-03-14 20:52:12 UTC
Permalink
Post by Ignazio
Post by Sandro
Ciao Ignazio, la seguente routine controlla che i valori nelle celle siano
'-----------------------------------------
Public Sub Somma_Range()
Dim somma As Double
Dim cella As Range
Dim objRng As Range
somma = 0
Set objRng = Worksheets(1).Range("A1:A100")
For Each cella In objRng
If Not IsNumeric(cella.Value) Then
MsgBox "Valore non numerico in " & cella.Address
Exit Sub
End If
somma = somma + cella.Value
Next
End Sub
'---------------------------------------------
Come sicuramente saprai, la funzione SOMMA ignora valori non numerici (celle
vuote, testo, ...).
Quindi, se da VBA usi la funzione "Sum", non potresti avere questo tipo di
controllo ed il conseguente messaggio di allerta.
Infatti, proprio per inserire questo tipo di controllo, avevo pensato in
alternativa, alla suddetta routine che *non* usa la *funzione Sum* del
foglio di lavoro.

La seguente routine, che utilizza ancora le funzioni Excel, da te proposta e
a cui *non* avevo affatto pensato, risolve *brillantemente* il problema.
Post by Ignazio
------
Sub TestSommaConAvviso()
Dim Totale As Double, myRange As Range
With Worksheets(1)
Set myRange = .Range("A1:A65536")
End With
With Application.WorksheetFunction
If .Count(myRange) = .CountA(myRange) Then
Totale = .Sum(myRange)
myRange.Select
MsgBox "La somma delle celle selezionate è: " & Totale
Else
MsgBox "Non ci sono solo numeri in: " & myRange.Address
End If
End With
End Sub
------
Fa sapere le tue impressioni.
Non c'e' paragone, ho fatto delle prove con il mio vecchio pc (Pentium 133
Mhz con 32MB Ram) *senza* utilizzare le *funzioni* del foglio Excel e per
eseguire la somma di 65536 celle con valore all'interno unitario, ha
impiegato un tempo di ben 37 secondi!!!

Utilizzando invece, le funzioni del foglio Excel e nelle stesse codizioni
sopra riportate, la risposta e' stata *immediata*!!!!!

Ciao e grazie mille
Sandro

Tiziano Marmiroli
2005-03-13 19:04:24 UTC
Permalink
Post by nicola
Dover "sprecare" una cella, anche se temporaneamente, per
inserirvi la formula e poi prelevare il risultato (meglio
usare prima un .Calculate a scanso equivoci?) è già molto
rispetto a come operavo prima...
Pensavo però ci fosse anche qualcosa di più elegante...
Non è che da VBA si può accedere alla porzione di barra di
stato in cui si può automaticamente visualizzare (somma,
min, max, media ecc). Così, selezionando un dato Range
potrei recuperare la somma senza dover scrivere Formule...
AFAIK da VBA puoi solo scegliere di mostrare o nascondere la barra di
stato, non puoi impostare quale formula viene utilizzata.
Da VBA puoi però scrivere quello che ti pare nell'altra 'porzione' della
barra di stato. E' molto interessante il seguente esempio:

Macro to simulate StatusBar Reporting (#simulation)
http://www.mvps.org/dmcritchie/excel/statusbar.htm#simulation
--
Tiziano Marmiroli
Microsoft MVP - Office
Sandro
2005-03-13 11:43:48 UTC
Permalink
"nicola" <***@discussions.microsoft.com> ha scritto nel messaggio news:663401c527a9$88cf4b10$***@phx.gbl...
Ciao.
Oltre a sommare i diversi .value delle celle comprese in
un dato range c'è un modo più veloce di operare per
ottenere quanto in oggetto?
In pratica vorrei evitare di fare worksheets(1).range
("A1").value + worksheets(1).range("A2").value ...
("C4").value.

Prova con la seguente routine:

'-------------------------------------------
Public Sub Somma_Range()

Dim somma As Double

Dim objRng As Range

Set objRng = Worksheets(1).Range("A1:A100")

'Salva il risultato della funzione Sum nella
'variabile somma

somma = Application.WorksheetFunction.Sum(objRng)

End Sub
'-------------------------

Dovresti essere un po' piu' chiaro, cmq spero di aver capito bene quello che
vuoi ottenere.

Ciao
Sandro
Loading...