VBA Code Zelle +1 addieren?
Guten Morgen. Habe ein falsches Ergebnis mit folgender Formel. Es sind ca. 250 Zeilen worauf die Formel angewendet wird. Dabei wird immer ein Datensatz zu wenig addiert. Kann und wenn ja wie die Gausche Formel etwas bewirken. Habe darüber gelesen, kann sie aber nicht korrekt einfügen. Hat da vielleicht jemand eine Lösung parat. Gruß Emilian
4 Antworten
Geb mal hier den kompletten Code ein. Hoffe man kann etwas damit anfangen. Gruß Emilian
Option Explicit
Private Sub CommandButton1_Click()
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
Dim zeile As Long
Dim zeilemax As Long
Dim i As Long
Dim lngZeile As Long, lngSpalte As Long
Dim LetzteZeile As Long
lngZeile = Worksheets("ArbTab").UsedRange.SpecialCells(xlCellTypeLastCell).Row
lngSpalte = Worksheets("ArbTab").UsedRange.SpecialCells(xlCellTypeLastCell).Column
With Worksheets("ArbTab")
LetzteZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
With Worksheets("TabStat")
Worksheets("TabStat").Range("B1:B60").ClearContents ' LÖSCHEN der alten Daten???????
Worksheets("TabStat").Range("b1").FormulaLocal = "=(Jahr(Heute()))"
Worksheets("TabStat").Range("b2").FormulaLocal = "=SUMMENPRODUKT(((ArbTab!$C$2:$C$" & LetzteZeile & "=""Herr"")+(ArbTab!$C$2:$C$" & LetzteZeile & "=""Frau""))/ZÄHLENWENN(ArbTab!$B$2:$B$" & LetzteZeile & ";ArbTab!$B$2:$B$" & LetzteZeile & "))"
Worksheets("TabStat").Range("b3").FormulaLocal = "=SUMMENPRODUKT((ArbTab!$C$2:$C$" & LetzteZeile & "=""Herr"")/ZÄHLENWENN(ArbTab!$B$2:$B$" & LetzteZeile & ";ArbTab!$B$2:$B$" & LetzteZeile & "))"
Worksheets("TabStat").Range("b4").FormulaLocal = "=SUMMENPRODUKT((ArbTab!$C$2:$C$" & LetzteZeile & "=""Frau"")/ZÄHLENWENN(ArbTab!$B$2:$B$" & LetzteZeile & ";ArbTab!$B$2:$B$" & LetzteZeile & "))"
End With
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = True
End With
End Sub
Es soll doch soweit ich verstanden hab einfach nur die Frau und Mann zählen?
Du generierst hier künstlich 2 Arrays wobei das letzte logischerweise nur aus Einsen bestehen kann, beziehst dich hier aber nicht mal auf die Herr/Frau Spalte.
Wie gesagt es wäre hilfreich zu wissen was rauskommen soll.
Es ist so, das ich in der Tabelle Personen habe die in zwei Zeilen vorkommen "könnten" aber auch einzelne Personen sind natürlich gelistet. Hier soll das Summenprodukt die anzahl Personen zählen. Bei doppelter Zeile einer Person aber nur einmal. Ferner soll automatisch bis zur letzten Zeile erfasst werden. In echt sind es ca. 250 Zeilen die erfasst werden sollen. Der Code läuft, allerdings es fehlt immer ein Zähler in der Summe. Danke und Gruß Emilian
Leider kann ich das Problem nicht nachvollziehen, klappt bei mir einwandfrei.
Warum "Dim"st du oben zig Variablen die du gar nicht mehr benutzt?
Hast du die ZÄHLENWENN-Ausdrücke schon mal für sich ausprobiert, ob die das Gewünschte liefern?
(Übrigens ist mir beim Code aufgefallen, dass du am Ende nur Application.EnableEvents wieder zurücksetzt, .ScreenUpdating und .Calculation aber nicht.)
Wozu verwendest du überhaupt ein Makro und verwendest nicht ein BEREICH.VERSCHIEBEN o. ä.? (Vielleicht, weil BEREICH.VERSCHIEBEN langsam ist?
Oder - Wenn du schon ein Makro verwendest: Man kann auch eigene Funktionen in Makros definieren und wie eingebaute Funktionen in der Tabelle verwenden.
Das geht allerdings nicht im Code für eine Tabelle, du brauchst dafür ein Makro (falls noch keins existiert, im VBA-Fenster Rechtsklick auf den Namen deiner Arbeitsmappe und "Einfügen" -> "Modul" oder Menü "Einfügen" -> "Modul"). Quelltext im Menü z. B.
Option Explicit
Public Function HALLOWELT() As String
HALLOWELT = "Hallo, Welt!"
End Function
Public Function GRUSS(Name) As String
GRUSS = "Hallo, " & Name
End Function
Dann kannst du in irgendeiner Zelle eintragen
=HALLOWELT()
, um dort "Hallo, Welt!" anzeigen zu lassen, oder z. B. in B1 "Jens" und in B2
=GRUSS(B1)
eintragen, um in B2 "Hallo, Jens" anzuzeigen.
Solche Funktionen kannst du beliebig "aufbohren"; der Unterschied zu einer Sub besteht allein darin, dass eine Funktion einen Rückgabewert hat und damit z. B. ein "=FUNKTIONSNAME(Argumentliste)" ermöglicht.
-----
(Kleiner Schönheitsfehler von Excel: Excel merkt sich die erste Groß-/Kleinschreibung einer selbstdefinierten Funktion. Wenn du z. B.
=gRuSs("Alfons")
eingibst und später in irgendeine Zelle
=GRUSS("Bertha")
, ändert Excel die Formel ab in
=gRuSs("Bertha")
, egal, wie die Groß-/Kleinschreibung der Funktion im Makro ist, was mich persönlich stört.
wenn ich mich recht erinnere, kann man die Funktion im Modul auskommentieren (evtl in der Liste löschen? weiß nicht mehr), speichern, xl schließen und wieder neu öffnen. Dann die Fkt im Modul richtig schreiben, aktivieren und in gewünschter Schreibung einsetzen. (zumindest so ähnlich hab ichs mal gemacht)
Ohne Deine Anlage wirklich zu durchschauen:
Könnte es sein, dass Du durch den Zählbeginn in Zeile2 bis Letzte Zeile eine Zeile zuwenig bekommst? Und sich dadurch dioe Ergebnisse alle nach oben verschieben?
Danke, aber deine Vermutung trifft in dem Fall nicht zu. Kann leider die Datei nicht anhängen, oder ich weiß nicht wie. Bei einfach rein kopieren würde man den Überblick verlieren. Gruß Emilian
Man kann hier leider keine xl-Datei reinstellen, nur Screenshots. (oft nur Ausschnitte sinnvoll) Dabei aber immer Spalten. und Zeilenköpfe zeigen. (Makros gehen, sind ja Text)
Ohne den Aufbau Deiner Tabelle zu kennen ist das schwer. Aber was ist denn, wenn Du
LetzteZeile
durch
LetzteZeile+1
ersetzt?
Oder WO liegt das Problem genau?
Was Gauß damit zu tun hat erschließt sich mir nicht.
Danke, aber deine Vermutung trifft in dem Fall nicht zu. Kann leider die Datei nicht anhängen, oder ich weiß nicht wie. Bei einfach rein kopieren würde man den Überblick verlieren. Gruß Emilian
Hab mir den Code jetzt angeschaut. Die Summenproduktformel gibt meiner Meinung nach keinen Sinn, Was willst du hier erreichen?