Hallo! Ich habe da ne "kleinere Prblematik" und hoffe wieder mal auf Hilfe. Also folgendes: normale Exceltabellenblatt ( Office 2013) A1 bis A13 normale Datumseingabe; in B1 bis B13 sind Geldbeträge, da aber unterschiedliche farbige Zellen ( rot, gelb grün, braun usw.) eingetragen. Nun möchte ich aber z.B. in B14 nur die Summe der Zahlen/Beträge von B1 bis B13, die in der roten Zellen hinterlegt sind, in B15 die in den gelben Kästchen eingetragen sind usw. Wie macht man das? Vielen Dank schon mal imvoraus.
Office - Word, Excel und Co. 9.744 Themen, 41.408 Beiträge
Hört die unart, alles vorher zu .Select en denn nie auf?!
sub summe1()
Dim i As Integer
Dim summe1 As Single
i=1
For i = 1 To 13
If Cells(i, 2).Interior.Colorindex = 3 Then
summe1 = summe1 + Cells(i, 2)
End If
Next
Cells(14, 2)= summe1
End Sub
Ob die neu gestaltete If Anweisung so funktioniert, kann ich jetzt und hier nicht mit letzter Bestimmheit sagen (ich meine aber: ja, denn auch "Cells" kennt "Interior".
Die "Formula" anweisung hinter dem letzten Cells ist überflüssig.
Übrigens lässt sich das noch etwas eleganter schreiben
sub summe2
Dim summe2 as Single
Dim tws As Worksheet
Dim zelle As Range
Set tws = ThisWorkbook.Worksheet("Tabelle1")
For Each zelle IN tws.Range("B1:B13")
if zelle.interior.colorindex=3 Then
summe2 =summe 2 + zelle
End If
Next zelle
tws.Range("A14")=summe2
End Sub
Zur Erklärung:
die zweite DIM Anweisung dimensioniert die Variable tws als Variable vom Typ "Worksheet" - sie nimmt also ein Worksheet auf.
Die zweite DIM Anweisung dimensioniert die Variable als eine vom Typ Range - sie kann also einen beliebigen Zellbereich aufnehmen.
Die Zeile:
Set tws = ThisWorkbook.Worksheet("Tabelle1")
weist der Variablen tws das in klammern hinter .Worksheet angegebenene Arbeitsblatt zu.
Ich habe hier Tabelle1 reingeschrieben, der name ist den tatsächlichen Gegebenheiten anzupassen.
Mit der nachstehenden For Each ... IN ... NEXT Schleife durchlaufen wir den in ""Range" espeicherten Zellbereich Zelle für Zelle.
Die letzte Anweisung weist der Zelle B14 den in summe2 enthaltenen Wert zu.
Vollständig würde diese Anweisung lauten:
tws.Range("A14").Value=summe2
.Value ist aber die Standardmethode der .Range-Methode, d.h. wenn nichts näher spezifiziert wird wird automatisch ".Value" ausgeführt - dieses Verhalten habe ich hier genutzt.
Ansonsten gilt:
Faustregel: in VBA nur dann "Activate"n und/oder "Select"en, wenn es unvermeidlich und absolut nötig ist - beide Methoden kosten unnötig Zeit - die sich bei solch einem kleinen Projekt nicht bemerkbar macht, bei größeren Tabellen aber sehrwohl, auch bei kleinen Routinen.
Aus meiner sicht ist die Nutzung dieser Methoden schlechter Programmierstil, weil sie in den allermeisten Fällen eben gerade nicht nötig sind - sie zeigen meist nur, dass sich der Programmierer mit den Objekten und deren Methoden nicht genügend auseinandergesetzt hat.