2016-05-27 36 views
9

Se ho una serie di celle di un foglio di lavoro che voglio aggiungere, posso usare la formula:Utilizzando SUM() in VBA

=SUM(Sheet1!A1:A10) 

di fare questo in un sub, userei:

Sub example1() 
    Dim r As Range, v As Variant 

    Set r = Sheets("Sheet1").Range("A1:A10") 
    v = Application.WorksheetFunction.Sum(r) 
End Sub 

Se, tuttavia, voglio aggiungere una singola cella in molti fogli di lavoro, io uso la formula:

=SUM(Sheet1:Sheet38!B2) 

in VBA questa linea fallisce miseramente, come spiegato in Specify an Excel range across sheets in VBA:

Sub dural() 
    v = Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2") 
End Sub 

Ho due soluzioni. Posso la somma programmando un ciclo:

Sub example2() 
    Dim i As Long 
    Dim v As Variant 

    v = 0 
    For i = 1 To 38 
     v = v + Sheets(i).Range("B2") 
    Next i 
End Sub 

o utilizzando Evaluate():

v = Evaluate("Sum(Sheet1:Sheet3!B2)") 

E 'possibile utilizzare Application.WorksheetFunction.Sum() per questo calcolo, o devo attaccare il ciclo?

+0

Perché non 'valutare'? – findwindow

+0

Non ho fatto nulla di tutto questo da molto tempo, quindi non aggiungerò questo come risposta finché non lo proverai, ma non dovresti usare anche: 'Set r = Sheets (" Sheet1 ") .Range ("Sheet1: Sheet3! B2") 'e quindi esegui' Sum' su 'r'? O simile ... qualsiasi cosa tu abbia bisogno di fare per creare una gamma dai fogli. Probabilmente stai meglio usando uno dei tuoi altri approcci. – gmiley

+1

@findwindow Io uso 'Evaluate()' e funziona bene .... ma se devo calcolare basato su un intervallo dinamico * (uguale su tutti i fogli) *, c'è un passo in più che rende la stringa che devo fornire per 'Evaluate()' –

risposta

2

Credo che il problema con il worksheetfunction.sum sia che ha bisogno di argomenti per valutare non stringa. WorksheetFunction.Sum ("Sheet1! A1: A3") ha esito negativo. Tuttavia, questo succede a

Application.WorksheetFunction.Sum(Sheet1.Range("A1"), Sheet2.Range("A1")) 

Gli intervalli potrebbero essere quello che vuoi.

+0

............. Grazie ............. –

1

È necessario utilizzare il loop per eseguire il calcolo su tutti i fogli, è il modo più efficiente per l'aspetto delle cose. Come menzionato sopra, puoi invece digitare ogni intervallo separatamente.

Potrebbe valere la pena convertire l'intervallo sommato in un doppio (o singolo, intero, ecc.) Perché a volte VBA legge numeri come testo.

v = v + Cdbl(Sheets(i).Range("B2"))

Il motivo per cui hai problemi con Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2") è perché se si digita questa formula in Excel, la gamma 'Foglio1:! Sheet3 B2' non sarà riconosciuto da Excel.

enter image description here

Per utilizzare un Application.WorksheetFunction deve lavorare in excel al di fuori della VBA.

Spero che questo aiuti.

+0

Grazie! ........................... –

+0

Per essere onesti, l'intervallo nello screenshot ha un refuso. C'è un '!' Prima del colon. –