![]() |
VBA Addition - Druckversion +- Office-Fragen.de (https://office-fragen.de) +-- Forum: Microsoft Office (https://office-fragen.de/forum-1.html) +--- Forum: Excel (https://office-fragen.de/forum-2.html) +--- Thema: VBA Addition (/thread-26748.html) |
VBA Addition - Kunoishi - 23.02.2022 Ich möchte die Woche jeweils Addieren und am Monatsende die Gesamtstunden dann haben. mein derzeitiger Stand ist Sub Berechnen() Dim z Dim Woche As Double Woche = 0 arr = Sheets("Legende").Range("C7:N59") For z = 18 To 59 i = indx(Cells(z, 1)) If i > 0 Then If i < 1 Then Exit For Cells(z, 4) = arr(i, 5) Cells(z, 5) = arr(i, 6) Cells(z, 6) = arr(i, 6) - arr(i, 5): If Cells(z, 6) < 0 Then Cells(z, 6) = Cells(z, 6) + 1 Cells(z, 7) = arr(i, 7) Cells(z, 8) = arr(i, 8) Cells(z, 9) = arr(i, 8) - arr(i, 7) Cells(z, 10) = Cells(z, 9) Cells(z, 12) = arr(i, 9) Cells(z, 13) = arr(i, 10) Cells(z, 14) = arr(i, 10) - arr(i, 9): If Cells(z, 14) < 0 Then Cells(z, 14) = Cells(z, 14) + 1 Cells(z, 17) = arr(i, 1) Cells(z, 19) = arr(i, 3) Cells(z, 20) = arr(i, 4) Cells(z, 21) = arr(i, 4) - arr(i, 3): If Cells(z, 21) < 0 Then Cells(z, 21) = Cells(z, 21) + 1 Cells(z, 23) = arr(i, 7) End If Next z End Sub ![]() Eine Beispieldatei kann ich bei euch bestimmt auch Hochladen ![]() Ich werde es finden ![]() Eine Nachberechnung habe ich DANK des Internet's auch schon jedoch wollte ich das in der Sub Berechnung integrieren Hier meine Nachberechnung Sub Schicht_nachberechnen() Dim R As Long 'R wie Row Dim SumWoche Dim SumMonat With ActiveSheet For R = 18 To 59 Select Case .Cells(R, "C") Case "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" .Cells(R, "F") = .Cells(R, "E") - .Cells(R, "D") + IIf(.Cells(R, "E") < .Cells(R, "D"), 1, 0) SumWoche = SumWoche + .Cells(R, "F") SumMonat = SumMonat + .Cells(R, "F") Case Else .Cells(R, "F") = SumWoche SumWoche = 0 End Select Next .Cells(60, "F") = SumMonat End With End Sub Mein Lösungsansatz war der Sub Addition() Dim Spalte As Integer Dim x As Integer Spalte = 6 For M = 1 To 20 Cells(10, Spalte).Value = Summe(Spalte) Spalte = Spalte + 1 Next M End Sub Function Summe(Spalte As Integer) Spalte1 = Spalte Zeile1 = 3 With ActiveSheet For N = 1 To 7 Summe = .Cells(Zeile1, Spalte1).Value + Summe Zeile1 = Zeile1 + 1 Next N End With End Function RE: VBA Addition - redeagle56 - 23.02.2022 Hallo, warum willst du das mit VBA machen, geht sicher auch einfacher. Tabelle mit Wunschergebnis würde helfen. MfG Günter RE: VBA Addition - Kunoishi - 23.02.2022 Hallo redeagle56 Ich will VBA mal irgendwie verstehen :-) Ja es geht auch einfacher, aber ich bin nie den einfachen Weg gegangen. Wie kann ich den bei Euch eine Datei hochladen?? MfG Kuno RE: VBA Addition - RPP63 - 24.02.2022 (23.02.2022, 22:37)Kunoishi schrieb: Wie kann ich den bei Euch eine Datei hochladen?? Klicke auf Beitragsvorschau und dann ins Feld Attachments. Aus dem eigentlichen Thema hier halte ich mich aber raus. Gruß Ralf RE: VBA Addition - Kunoishi - 24.02.2022 Danke RPP63 Beim Makro UNIT hab ich schon mal wieder angefangen zu Üben ![]() ![]() Danke an die Runde MfG Kuno RE: VBA Addition - maninweb - 26.02.2022 Hallo, ich hätte ein paar Anmerkungen zum Handwerklichen; unsortiert. Im Code zu Schicht_berechnen() hast Du If i < 1 Then Exit For drin. Das macht keinen Sinn, da Du zuvor auf > 0 geprüft hattest. Im Code zur Funktion indx könntest Du die For-Schleife verlassen, wenn der Wert gefunden wurde. Du referenzierst mit Cells(...), wodurch Du implizit das aktive Blatt adressierst. Es ist sauberer , eine vollständige Referenzierung zu verwenden - beispielsweise ThisWorkbook.Worksheets("Januar").Cells(...) und ggf. mit Verwendung von With. Das eliminiert mögliche Fehler. Du deklarierst eine (unnötige) globale Variable arr, zudem noch in einem anderem Modul. Das macht es (später, wenn es mal komplexer wird) schwerer lesbar. Zudem lassen sich Variablen (auch Arrays) an Prozeduren/Funktionen übergeben. Du typisiert einige Variablen und andere wiederum nicht. Warum? Besser wäre es, das einheitlich zu gestalten und allen Variablen einen Typ zu geben, wie Dim z As Long. Integer brauchst Du in der Regel nicht mehr, nimm Long. Nicht verwendete Variablen sollten besser entfernt werden z.B. in Woche in Schicht_berechnen. Schreibe ganz oben im Modul als erste Zeile Option Explicit rein, was z.B. die Deklarieren von Variablen erfordert und auch vor Tippfehler schützt. Nutze dann auch aus dem Menü Debuggen / Kompilieren. Einrückungen sind gut und machen den Code lesbarer. Das würde ich dann aber konsequent in gleicher Form überall machen. Gruß RE: VBA Addition - Kunoishi - 26.02.2022 Hallo maninweb Danke für die Anregungen !!!! Ein oder zwei kann ich mehr oder weniger gleich umsetzen. Bei den anderen könnte ich weitere Hilfe gebrauchen. Ich freue mich auf jeden Fall über EURE weitere Unterstützung. Mit den VBA bin ich erst seit kurzem auf Erkundungstur und es macht SPASS und wenn ich hier und da jemanden finde, der mir was erklären kann um so mehr. Wie mache ich das mit dem Wochenweise Addieren ? Mfg Kuno RE: VBA Addition - Kunoishi - 26.02.2022 (26.02.2022, 11:40)maninweb schrieb: Du referenzierst mit Cells(...), wodurch Du implizit das aktive Blatt adressierst. Es ist sauberer , eine vollständige Referenzierung Das verstehe ich nicht ganz (vieleicht Wissenslücke von mir) ![]() Kannst du diesbezüglich naher darauf eingehen ![]() Ich habe dafür mein Beispiel schon mit hochgeladen Danke RE: VBA Addition - maninweb - 27.02.2022 Hallo, ich habe Dir mal ein Modul erstellt (Schichtberechnungen), der das Berechnen und Nachberechnen der Schichten etwas sauberer implementiert. Basierend auf Deinem Algorithmus. Der ist nicht optimal, aber das wäre ja hier erstmal egal. Bspw. ist das einzelne Beschreiben viele Zellen langsam. Folgendes solltest Du noch berücksichtigen: - Benenne bitte Deine Module, sodass Du auch später mal weisst, wo was ist. - Bitte vollständig zu referenzieren, also auch Cells(...).Value statt nur Cells(...), auch wenn .Value dann die Standardeigenschaft ist. - AutoOpen sollte nicht mehr verwendet werden, sondern Workbook_Open in DieseArbeitsmappe. - Die Typen Deiner Variablen sollten korrekt sein, also z.B. kein Double wenn es eine Ganzzahl ist (Long). - Mischen zwischen Cells(1,"C") und Cells(1,3) würde ich persönlich vermeiden. Einen VBA-Kurs kann ich Dir an dieser Stelle nicht geben - mein persönlicher Eindruck ist, dass es Dir an Wissen in Bezug zu Datentypen, Prozeduren & Variablen sowie insbesondere zu dem Excel-Objektmodell fehlt. Ohne Dein beachtliches Engagement schmählern zu wollen, würde ich aber empfehlen, vielleicht ein Buch zu kaufen, wo didaktisch an VBA rangegangen wird. ![]() Gruß RE: VBA Addition - Kunoishi - 27.02.2022 Hallo maninweb Ich bin ein wenig sprachlos und das sogar im Ganzen. DANKE reicht eigentlich gar nicht. Sie haben mir bestens geholfen und die Beschreibung zum Quelltext ist auch KLASSE. Da kann selbst ich mich rein denken und ich bin manchmal nicht einfach. Ich werde mit freude an diesem Projekt weitermachen und mich hier bestimmt wieder Melden ![]() mit freundlichen Gruß Kunoishi PS Soshite mōichido kansha shimasu ![]() |