VBA Automatisches Eintragen in bestimmte Zellen
Hallo zusammen!
Ich muss für die Arbeit ein Excel-Sheet anfertigen und brauch dringlichst eure Hilfe!
Ich muss eine Tabelle für Wartungsverträge entwerfen, in der (von links nach rechts) Kunde, Datum von, Datum bis, Umsatz, Ertrag, Monate (quasi Differenz zw. Datum von-bis), Januar 07 (unterteilt in Umsatz, Ertrag), Februar 07 (unterteilt in Umsatz, Ertrag), etc. bis vorerst Dez. 08.
Mein Problem ist nun: Manuell eingetragen wird der Kunde und das Datum sowie Umsatz und Ertrag. VBA soll mir nun mithilfe der durch Excel errechneten Monate den monatlichen Umsatz errechnen und dann in die Monate, die am Anfang stehen, den Umsatz eintragen.
Beispiel: Der Vertrag läuft von Juni 07 bis Juni 08 mit einem Gesamtumsatz von 1100Euro. Der monatl. Umsatz beträgt 100 Euro, da 11 Monate Laufzeit.
Excel soll quasi nur in die Monate Juni 07 bis Juni 08 den Umsatz 100 Euro eintragen. (Anmerkung: Jeder Monat ist unterteilt in Umsatz und Ertrag, da mit Ertrag später das gleiche gemacht werden soll)
mein Ansatz:
Sub Rechne()
Dim zeile As Integer
zeile = 3
While (Tabelle2.Cells(4, zeile) <> "")
Dim anzMonate As Integer
anzMonate = Tabelle2.Cells(6, zeile)
Dim cMonth As Integer
For cMonth = 0 To anzMonate Step 2
Dim dUmsatz As Currency
dUmsatz = Tabelle2.Cells(4, zeile) / anzMonate
Tabelle2.Cells(cMonth + 7, zeile) = dUmsatz
Next
zeile = zeile + 1
Wend
End Sub
Leider tritt oben ein Laufzeitfehler 6: Überlauf auf....
Ich hoffe, ihr könnt mir schnellstmöglich dabei helfen! Danke
Antwort schreiben
Antwort 1 von Teerbaby vom 31.10.2019, 13:40 Options
Sub Rechne()
Dim zeile As Integer
Dim anzMonate As Integer
Dim cMonth As Integer
Dim dUmsatz As Currency
zeile = 3
While (Tabelle2.Cells(4, zeile) <> "")
anzMonate = Tabelle2.Cells(6, zeile)
For cMonth = 0 To anzMonate
dUmsatz = Tabelle2.Cells(4, zeile) / anzMonate
Tabelle2.Cells(cMonth * 2 + 7, zeile) = dUmsatz
Next
zeile = zeile + 1
Wend
End Sub
Falls ich das jetzt richtig verstanden habe.
Antwort 2 von püppi vom 01.11.2019, 14:34 Options
Es erscheint eine Fehlermeldung: "Division durch Null". Demzufolge passiert leider gar nichts ='(
Antwort 3 von Marie vom 02.11.2019, 02:49 Options
Bitte schreibe mal zum einen sämtlihe Dim Anweisungen ganz oben hin und nicht mitten in den Code, so wie Teerbaby Dir das vorgemacht hat, bei deinem Code blickt man ja gar nicht durch.
Dann hast Du Vermutlich zeile und Spalte verwechelt:
Cells(zeile, spalte)???
Ich kenn mich zwar in Excel überhaupt nicht aus, habe aber jetzt mal versucht Deinen Code nachzuvollziehen und wundere mich die ganze Zeit, dass ich bei Zeile 3 eine Leere zeile bekomme, obwohl ich in Zeile 3 einen Umsatz eingegeben habe. Dann habe ich einfach mal mit Zeile=4 angefangen, und siehe da, da bekomme ich Zeile 4 und Spalte 4, deshalb leider immer noch nicht gemerkt wo der fehler liegt. Da lies ich mir den Monat ausgeben und erhalte Umsatz Zeile 6, statt Monat in Spalte 6.
Vielleicht solltest Du Dir ab und an zur Probe doch mal Deinen Code Zeilenweise ansehen (testen im Einzelschritt), dann hättest Du das gemerkt.
Was Du in Spalte Datum von, Datum bis, drinstehen hast, dass Du als Monat eine Integer bekommst, das ist mir unklar, aber spielt ja jetzt keine Rolle mehr, wenn Dein Monat korrekt angezeigt wird.
Gruß Marie
Antwort 4 von Marie vom 02.11.2019, 03:47 Options
Nächster Fehler:
For cMonth = 0 To anzMonate Step 2
Next
Das heisst der Wert cMonth durchläuft, wenn Du 10 Monate hast, die Werte 0, 2,4,6,8 und 10, so wie Du schreibst, die Werte von 0 bis 10 im Zweierschritt (Step 2)
Du willst aber in Wirklichkeit bei 4 Monaten 4 Zahlen eintragen, musst also die for.. next Schleife 4 mal durchlaufen. Dann entweder von 1 bis anzMonate oder von 0 bis anzMonate-1
For cMonth = 0 To anzMonate, wie Teerbaby geschrieben hat, wäre ein Durchlauf mehr als Monate,also ein Eintrag zuviel. (0,1,2,3,4 sind 5 Durchläufe)
ferner wäre mit Spalte cMonth * 2 + 7
cMonth = 0 in Spalte 0*2+7=7 korrekt
cMonth = 1 in Spalte 1*2+7=9 korrekt
cMonth = 2 in Spalte 2*2+7=11 korrekt
cMonth = 3 in Spalte 3*2+7=13 korrekt
cMonth = 4 in Spalte 4*2+7=15 nicht mehr korrekt
Also entweder
For cMonth = 0 To anzMonate-1
........cMonth * 2 + 7
next
oder aber
For cMonth = 1 To anzMonate
........cMonth * 2 + 5
next
Deshalb bitte diesen Code hier nehmen:
Sub Rechne()
Dim zeile As Integer
Dim anzMonate As Integer
Dim cMonth As Integer
Dim dUmsatz As Currency
zeile = 3
' solange Zelle Umsatz nicht leer
While (Tabelle2.Cells(zeile, 4) <> "")
anzMonate = Tabelle2.Cells(zeile, 6)
For cMonth = 1 To anzMonate
dUmsatz = Tabelle2.Cells(zeile, 4) / anzMonate
Tabelle2.Cells(zeile, cMonth * 2 + 5) = dUmsatz
Next
zeile = zeile + 1
Wend
End Sub
Antwort 5 von Marie vom 02.11.2019, 03:55 Options
Wenn dann immer noch eine eine Fehlermeldung: "Division durch Null" erscheint, dann sollte Dir auch klar sein, dass dann 0 Monate gerechnet wurde. Falls also nicht gewährleistet ist, dass überall ein Monat drinsteht, solltest Du noch den Eintrag beschränken auf die Einträge:
Also um die for.. next schleife noch die bedingung, dass Anzahl Monate > 0 sein muss
if anzMonate > 0 then
For cMonth = 1 To anzMonate
dUmsatz = Tabelle2.Cells(zeile, 4) / anzMonate
Tabelle2.Cells(zeile, cMonth * 2 + 5) = dUmsatz
Next
endif
Gruß marie
Antwort 6 von püppi vom 02.11.2019, 08:57 Options
Danke du hast mir super geholfen! Funktioniert auch soweit ganz klasse.
Allerdings beginnt er immer im Januar. Wenn ich z.B. eingebe, er soll im Juni beginnen, beginnt er immer im Januar. Aber immerhin hat er kapiert, dass er nur soviele folgende Monate ausfüllen soll, wie die Zeitspanne dazwischen ist ^^
Aber trotzdem herzlichen Dank dafür! Du hast mich ein ganzes Stück weitergebracht!!!
Antwort 7 von püppi vom 02.11.2019, 09:37 Options
Ich dachte mir, ich stelle mal ein Bild der Tabelle online, zur besseren Veranschaulichung (hier bereits mit Maries richtigem Code, der leider im Januar beginnt):
danke nochmals =)
Antwort 8 von püppi vom 02.11.2019, 11:12 Options
ok, problem soweit gelöst, jetzt aber ein neues: es startet immer im jahr 2007. leider beginnen unsere verträge auch in folgenden jahren...
Sub Rechne()
Dim zeile As Integer
Dim anzMonate As Integer
Dim cMonth As Integer
Dim dUmsatz As Currency
Dim start As Integer
Dim jahr as String
zeile = 4
' solange Zelle Umsatz nicht leer
While (Tabelle2.Cells(zeile, 4) <> "")
anzMonate = Tabelle2.Cells(zeile, 6)
start = Month(Tabelle2.Cells(zeile, 2)) - 1
[b]jahr = Year(Tabelle2.Cells(zeile, 2))[/b]
For cMonth = 1 To anzMonate
dUmsatz = Tabelle2.Cells(zeile, 4) / anzMonate
Tabelle2.Cells(zeile, cMonth * 2 + 5 + (start * 2)) = dUmsatz
Next
zeile = zeile + 1
Wend
End Sub
bei der fett-markierten Zeile bringt er immer die Meldung "falsch" (wenn ich mir das per MsgBox ausspucken lasse).
Warum??
Danke für eure schnelle Hilfe.
Antwort 9 von Marie vom 02.11.2019, 15:39 Options
Weil Du in einer MSGbox nur einen String ausgeben lassen kannst, Also Jahr umeandeln in einen String: Msgbox str$(jahr)
Gruß Marie
Antwort 10 von Marie vom 02.11.2019, 15:44 Options
Na Du wirst hier doch nicht hunderte von Spalten nebeneinandersetzen wollen? Wer soll denn da noch durchblicken?? Vielleicht solltest Du in jedem Jahr mit einem neuen Tabellenblatt anfangen??
Wenn nicht liest Du halt das Jahr aus und wenn das 2008 heisst gehste um 24 Spalten weiter nach rechts. Und jetzt sei so gut und bemüh Dich auch mal selsbt ein wenig, die Grundlagen hast Du doch jetzt.
Gruß marie
Antwort 11 von coros vom 02.11.2019, 16:11 Options
Hallo Marie,
seit wann kann man sich nur Strings in einer MsgBox ansehen? Der Fehler, den püppi gemacht hat, Sie wird versucht haben díe gesamte Zeile hinter dem Befehl "MsgBox" einzutragen. Da die Abfrage, die dadurch entstand, nicht übereinstimmte, kam als Ergebnis False (Falsch) heraus. Wenn Sie nur
[b]
MsgBox Year(Tabelle2.Cells(zeile, 2))[/b]
geschrieben hätte, wäre ihr auch das Jahr aus der Zelle angezeigt worden.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 12 von Marie vom 02.11.2019, 17:22 Options
Ja sorry Coros, hab das verwechselt mit einer Zahl innerhalb eines Strings.
Aber msgbox jahr müste eh auch dann funktioniert haben, da sie jahr als string definiert hat, war also ohnehin noch dazu ein Lesefehler von mir. Normalerweise gehe ich halt ohne hinzuschauen davon aus, dass man eine Jahreszahl als Zahl ausgibt. :-(
Gruß Marie