online 1
gast (50)

/ Forum / Tabellenkalkulation

TabellenkalkulationTabellenkalkulation

Fragevon püppi vom 31.10.2019, 13:14 Options

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

Ähnliche Themen

Automatischer Email-Versand bei einem best. Wert
Mandy_Gray  15.01.2007 - 84 Hits -

Formel per VBA in Zelle schreiben
Kauz  17.04.2008 - 82 Hits - 2 Antworten

Makro-bestimmt Zellen löschen
musiker021  06.05.2008 - 87 Hits - 3 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Sun Jan 25 18:15:21 2026