Alle Zellen eines Arbeitsblattes addieren

Hallo,

ich möchte gerne alle Zellenwerte eines Arbeitsblattes addieren.

Gibt es eine bessere Lösung als diese ->

With ActiveSheet
For xRows = 1 To 10 '10 Zeilen
For xCols = 1 To 10 '10 Spalten
sWert = .Cells(xRows, xCols)
'Hier kannst du noch Berechnungen durchführen
Next xCols
Next xRows
End With

Für Tips wäre ich sehr dankbar ! (Excel 2006)

Hallo Anyone,

So funktioniert dein Code nicht. Am Ende steht in sWert der Wert von Zelle J10.

Wie wär’s so:
sWert = WorksheetFunction.Sum(ActiveSheet.Range(„A1:J10“))

Gruß, Andreas

Hi,
danke für deine Antwort.

Gibt es die Möglichkeit statt Range(X,Y) alle Felder des Datenblattes auszuwählen ?

Danke,
Julius

Gibt es die Möglichkeit statt Range(X,Y) alle Felder des
Datenblattes auszuwählen ?

Hallo Julius,

MsgBox Application.Sum(Cells)

Gruß
Reinhard

Gibt es die Möglichkeit statt Range(X,Y) alle Felder des
Datenblattes auszuwählen ?

Danke,
Julius

Hallo Julius,

das müsste so gehen:

sWert = WorksheetFunction.Sum(ActiveSheet.Cells)

Gruß, Andreas

Hallo Reinhard,

was war noch mal der Unterschied zwischen

Application.Sum

und

WorksheetFunction.Sum ?

Gruß, Andreas

WorkSheetfunction benutzen oder nur Application

was war noch mal der Unterschied zwischen
Application.Sum
und
WorksheetFunction.Sum ?

Hallo Andreas,

ein Unterschied besteht der für sich allein gesehen für
Application.WorksheetFunction.Sum
spräche.
Die IntelliSense hilft in dieser Konstellation und listet dir alle Funktionen auf.

Vor Jahren habe ich mal weil ich das auch wie du wissen wollte, recherchiert, vielleicht auch nachgefragt,
jedenfalls ergab sich damals ein Aspekt den ich jetzt nicht wehr weiß und seitdem benutze ich nur noch Application.Sum.

Jetzt auf die Schnelle habe ich im I-Net zu dem Thema nur eine Beitragsfolge gefunden wo es um die Funktion VLookup geht.
Hier ist die Antwort einer Frau die um viele Klassen besser als ich in VBA ist:
(mit „dieser Syntax“ bezieht sie sich auf Worksheetfunction.VLookup)

Hallo,
ich weiß, dass es Probleme mit dieser Syntax gab und vielleicht noch
immer gibt. Leider kann ich dir auch nicht sagen, in welcher Version
das war. Auf jeden Fall bist du auf der sicheren Seite,
wenn du Excelfunktionen immer mit Application aufrufst, da hatte
ich noch nie Probleme, einerlei, was die Hilfe sagt.
Gruß K.Rola

Gruß
Reinhard

Hallo Reinhard,

vielen Dank für deine Recherche. Ich habe gerade auch deinen Thread von damals gefunden:
/t/mit-oder-ohne-worksheetfunction/6013100
Da wird es auch noch mal klarer.

Gruß, Andreas

vielen Dank für deine Recherche. Ich habe gerade auch deinen
Thread von damals gefunden:
/t/mit-oder-ohne-worksheetfunction/6013100
Da wird es auch noch mal klarer.

Hallo Andreas,

ui, das war erst 2010 *staun*, naja, mein Zeitgefühl ist so miserabel wie mein Englisch :smile:
Kannst du vielleicht mal den dortigen englischen Text besser übersetzen?

Letztlich egal, ich bleibe bei der Weglassung von Worksheetfunction.
Außer vielleicht ich lese mal durch Zufall irgendwo warum eigentlich da ein Fehler geschehen kann.
Dann bewerte ich neu welche Variante ich benutze.

Gruß
Reinhard

Gruß
Reinhard

Übersetzungsversuch
Hallo Reinhard,

so ganz toll ist mein Englisch auch nicht, aber ich versuch’s mal.

They are pretty much exactly the same. However, using worksheetfunction, if it errors, your code actually stops and debugs. If you don’t put in WorksheetFunction, The result will still be an error, but the code will not stop and debug. Also, if you don’t use worksheetfunction, you don’t get the little screen tip listing available functions as you type.

Sie sind eigentlich genau gleich. Aber, wenn man WorksheetFunction benutzt und es gibt einen Fehler, hält der Code an und geht in den Debugger (schönes deutsches Wort. Anmerkung des Übersetzers).
Wenn man es (Sum) nicht in WorksheetFunction benutzt, bleibt zwar der Fehler bestehen, aber Code hält nicht an und geht nicht in den Debugger.
Weiterhin, wenn man Worksheetfunction nicht benutzt, funktioniert Intellisense nicht (der letzte Satz war jetzt sehr frei übersetzt).

Gruß, Andreas

They are pretty much exactly the same. However, using
worksheetfunction, if it errors, your code actually stops and
debugs. If you don’t put in WorksheetFunction, The result will
still be an error, but the code will not stop and debug. Also,
if you don’t use worksheetfunction, you don’t get the little
screen tip listing available functions as you type.

Sie sind eigentlich genau gleich. Aber, wenn man
WorksheetFunction benutzt und es gibt einen Fehler, hält der
Code an und geht in den Debugger (schönes deutsches Wort.
Anmerkung des Übersetzers).
Wenn man es (Sum) nicht in WorksheetFunction benutzt, bleibt
zwar der Fehler bestehen, aber Code hält nicht an und geht
nicht in den Debugger.
Weiterhin, wenn man Worksheetfunction nicht benutzt,
funktioniert Intellisense nicht (der letzte Satz war jetzt
sehr frei übersetzt).

Hallo Andreas,

danke. Dann hab ichs doch gar nicht soooo falsch übersetzt.
Ist ja auch wurscht wie gut ich übersetzt habe, so oder so ist der Frechling *gg* smallbop „reif“ wenn er mal hier eine Vba-Anfrage stellt dann mokiere ich mich mal über seine Vba-kenntnisse :smile:))
Okay, mach ich natürlich nicht.

Zum eigentlichen Thema, Worksheetfunction oder nicht, da hilft der englische Text m.E. leider nicht weiter.
Nimm mal eine neue leere Mappe und lass diesen Code laufen:

Sub test()
MsgBox Application.Sum(Range(„A1:A5“))
MsgBox Application.WorksheetFunction.Sum(Range(„A1:A5“))
End Sub

Es wird zweimal die 0 angezeigt.
Jetzt schreib mal in A2 rein
=1/0
und lass den Code laufen.
Bei beiden Varianten kommt ein Fehler wenn auch jeweils ein anderer.
Somit sind sie bei diesem fehler gleich im Verhalten im Gegensatz zu dem was im engl. Text steht.

Ergo muß es um „andere“ Fehler gehen wenn der engl. Text Recht hat.
Welche, wann treten sie auf, wie kann man sie „nachstellen“ um das zu testen?

Gruß
Reinhard

Hallo Reinhard,

bei deinem Code kriege ich das selbe wie du (Excel2003).

ich habs jetzt mal damit versucht:

Sub test()
MsgBox Application.Sum(Range(„A1:A5“))
MsgBox WorksheetFunction.Sum(Range(„A1:A5“))
End Sub

Also ohne Application vor Worksheetfunction (so benutze ich das normalerweise)

Wenn ich das in VBA-Editor mit F8 laufen lasse, kommt folgendes:
Bei der ersten Variante Laufzeitfehler 13: Typen unverträglich.
Bei der zweiten Variante Laufzeitfehler 1004: Anwednungs- oder obejktdefinierter Fehler

Wenn ich’s asu der Tabelle mit ALT-F8 laufen lasse, kommt bei der ersten Variante „Typen unverträglich“, bei der zweiten Variante Fehler 400.

Irgendwie scheint er also da doch Unterschiede zu machen.
In keinem Fall geht er aber in den Debugger-Modus (gelbe Zeile).

Na, ich denk, ich werde da erst mal nicht weiter graben. Führt ja eigentlich zu nix.

Gruß und schönen Abend,

Andreas

Hallo Andreas,

Also ohne Application vor Worksheetfunction (so benutze ich
das normalerweise)

okay, ich hab Application davor aus Gewohnheit benutzt ohne geringstes Wissen, gehörten Andeutungen daß da ein Unterschied ist.

Wenn ich das in VBA-Editor mit F8 laufen lasse, kommt
folgendes:

Ja, wie ich sagte zwei versch. Fehlermeldungen. Warum das so ist da könnte man nachbohren aber ich nicht, da hier ohne Belang :smile:

Irgendwie scheint er also da doch Unterschiede zu machen.
In keinem Fall geht er aber in den Debugger-Modus (gelbe
Zeile).

? Bei mir schon wenn ich den Code über eine Schaltfläche starte.

Na, ich denk, ich werde da erst mal nicht weiter graben. Führt
ja eigentlich zu nix.

Jain. Das ziel ist ja wohl Code zu basteln der funktioniert.
Da ist es schon beunruhigend im Code Anweisungen zu haben die ggfs., warum auch immer, nicht korrekt funktionieren.

Da sollte/muß man schon aus Eigeninteresse „graben“.
Aber aus Effektivitätsgründen nicht jahrelang *gg*

Habe ich eine Mappe wo irgendwas, egal Vba, Excelfunktionen nicht so funktionieren wie sie sollten und wenn es bakannte Dinge sind die ich oft benutze so ist eines der Dinge die ich tue, den Inhalt der mappe in eine neue mappe zu überführen.

Wenn es dann dort klappt so isses gut. Dann war die alte mappe marode und fertig. „Den“ Fehler in der alten mappe kann man sehr möglicherweis auch herausfinden aber mit mit gewltigem Aufwand.
Da müßte ich mir ja Wissen aneignen wie denn Edxcel als datei so innerbetrieblich beschaffen ist, quasi jedes Byte prüfen o.ä.
Für dieses Wissen brauch ich ja schon Monate.

In beiden Fällen, marode Mappen und Worksheet oder nicht habe ich schon „angegraben“.
Erkenntnis ist, abhaken und im einen Fall mit der neuen mappe arbeiten im anderen Fall auf Worksheet verzichten.

Gruß
Reinhard

Hallo Reinhard,

ich denke, mit dem Wissen, dass es einen Unterschied macht, ob man Application oder Worksheetfunction benutzt, kann man leben.
Wenn’s Probleme gibt, benutzt man dann eben entsprechend das andere.

Danke für die nette Diskussion und Gruß,
Andreas

Hallo Andreas,

ich möchte nur die Werte von Zellen addieren, welche bestimmte Eigenschaften aufweisen.

Mein bisheriger Code:

Dim Zelle As Range, Wert As Double
'Hier müßte der ganze Bereich eingeben werden
For Each Zelle In ActiveSheet.Range(„A1:J10“)
If IsNumeric(Zelle.Value) Then
If Zelle.Interior.ColorIndex = 3 And Zelle.Font.ColorIndex = 1 Then Wert = Wert + Zelle.Value
End If
Next Zelle

Leider resultiert das mit deinem Code in einer Endlosschleife (und somit Absturz)

Dim Zelle As Range, Wert As Double

For Each Zelle In ActiveSheet.Cells '!!!
If IsNumeric(Zelle.Value) Then
If Zelle.Interior.ColorIndex = 3 And Zelle.Font.ColorIndex = 1 Then Wert = Wert + Zelle.Value
End If
Next Zelle

Was mache ich falsch ? Danke schonmal !

Guten Tag,

Hallo Andreas,

ich möchte nur die Werte von Zellen addieren, welche bestimmte
Eigenschaften aufweisen.

Dim Zelle As Range, Wert As Double

For Each Zelle In ActiveSheet.Cells '!!!
If IsNumeric(Zelle.Value) Then
If Zelle.Interior.ColorIndex = 3 And Zelle.Font.ColorIndex = 1
Then Wert = Wert + Zelle.Value
End If
Next Zelle

Was mache ich falsch ? Danke schonmal !

Hallo Julius,

ich denke, dein Code ist OK. Du musst ihm halt nur genügend Zeit geben.
Eine Tabelle hat (bei Excel2003) 256 x 65536 = 16.777.216 Zellen.
Ich habe den Code eben mal laufen lassen und habe einen Zähler eingebaut (klar, dass verlangsamt etwas).
Nach 2 min. war er bei mir bei ca. 5 Mio Zellen. Ich schätze also, er hätte ca. 7 min. gebraucht.
Durch die doppelte If-Abfrage wird das ganze recht langsam.
Lass ihm mal viel viel Zeit. Dann sollte es klappen.

Du solltest aber auch überlegen, ob du den Bereich nicht enger fassen kannst. Wird denn wirklich die komplette Tabelle benutzt? Kann ich mir kaum vorstellen.

Es gibt hier aber auch den ein oder anderen wirklichen Experten. Die können vielleicht den Code noch optimieren. DA habe ich zu wenig Erfahrung.

Gruß, Andreas

1 „Gefällt mir“

ich möchte nur die Werte von Zellen addieren, welche bestimmte
Eigenschaften aufweisen.

Hallo any1,

du sagst du hast XL 2006, ich find das hier aber nicht:
http://de.wikipedia.org/wiki/Microsoft_Excel

Ich sehe in deinen Codes keinen Grund warum da was abstürzen sollte.
Bei XL Versionen mit 256 Spalten hast du 16 Mio Zellen, das dauert die alle einzeln „abzuklappern“.
Bei höheren XL-Versionen nochmal viel länger.

Beschleunigen kann man das wie nachstehend im Code gezeigt durch Beschränkung auf den benutzten Zellbereich.

Eine leere zelle im benutzten bereich ergibt bei Isnumeric(zelle) auch wahr.
Um quasi den Code noch weiter zu beschleunigen kann man die leeren zellen theoretisch ausschließen, liegt aber an deinen daten.
Dann würde die entsprechende Codezeile so aussehen:
For Each Zelle In ActiveSheet.UsedRange.specialcells(Argument)

Die Argumente für Specialcells findest du in Hilfe.
Je nach Aufbau deiner Zellwerte, Werte oder Formeln, kann man dann die Sache beschleunigen.

Testen kannst kannste das schnell dadurch:
Sub nn()
msgbox ActiveSheet.UsedRange.specialcells(Argument).Address
end sub

Ohne specialcells vielleicht so:

Achja, wenn du Codeschnipsel postest dann bitte also als komplette Sub
so wie ich, danke.

Sub ttt()
Dim Zelle As Range, Wert As Double
For Each Zelle In ActiveSheet.UsedRange.Cells 
 If IsNumeric(Zelle.Value) Then
 If Zelle.Interior.ColorIndex = 3 And Zelle.Font.ColorIndex = 1 Then Wert = Wert + Zelle.Value
 End If
Next Zelle
MsgBox Wert
End Sub

Gruß
Reinhard

1 „Gefällt mir“

Hi,

danke für deine Antwort.

ActiveSheet.UsedRange.Cells ist genau das was ich suchte !

Ciao,
Julius

Hi,

die Lösung von Reinhard mit ActiveSheet.UsedRange.Cells ist genau das richtige.

Danke dir !