Supportnet / Forum / Tabellenkalkulation
VBA Automatisches Eintragen in bestimmte Zellen
Frage
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:
[b]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[/b]
Leider tritt oben ein Laufzeitfehler 6: Überlauf auf....
Ich hoffe, ihr könnt mir schnellstmöglich dabei helfen! Danke
Antwort 1 von Teerbaby
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 SubFalls ich das jetzt richtig verstanden habe.
Antwort 2 von püppi
Es erscheint eine Fehlermeldung: "Division durch Null". Demzufolge passiert leider gar nichts ='(
Antwort 3 von Marie
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
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
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
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
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
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
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!!!
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
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):
[img=http://img261.imageshack.us/img261/8444/beispielexcelhp1.th.png]
danke nochmals =)
[img=http://img261.imageshack.us/img261/8444/beispielexcelhp1.th.png]
danke nochmals =)
Antwort 8 von püppi
ok, problem soweit gelöst, jetzt aber ein neues: es startet immer im jahr 2007. leider beginnen unsere verträge auch in folgenden jahren...
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.
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
jahr = Year(Tabelle2.Cells(zeile, 2))
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 Subbei 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
Weil Du in einer MSGbox nur einen String ausgeben lassen kannst, Also Jahr umeandeln in einen String: Msgbox str$(jahr)
Gruß Marie
Gruß Marie
Antwort 10 von Marie
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
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
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
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.
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
MsgBox Year(Tabelle2.Cells(zeile, 2))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
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
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

