Post by SandroCiao 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