Finanzplan bzw. Kontostand mit VBA

D

DasBinIch132

Hallo ihr vielen Programmierer-Spezies,

bis jetzt hab ich immer nur n bisschen mit Excel-Funktionen hantiert, aber jetzt möchte ich einen Kontoplan erstellen, der sich mit den 0815-Formeln nicht mehr realisieren lässt.

Wie gesagt, es soll ein Kontoplan werden.
Im Tabellenblatt 1 habe ich eine Eingabe eingerichtet. D.h.
B3= Datum der Bewegung
D3= Bemerkung
F3= Betrag der Bewegung
H3= Konto der Bewegung

Nun möchte ich, das die Werte anhand des Wertes in H3 in das entsprechende Tabellenblatt eingetragen werden. Z.b. Wert 1 = Sparkasse (=Tabellenblatt 2), Wert 2 = Volksbank (=Tabellenblatt 3) usw.
Das klappt bis jetzt sehr gut.
Auch die Funktion der anschließenden Sortierung habe ich noch hinbekommen.
(D.h. wenn ich eine Bewegung am 01.06. habe und eine am 01.03 die ich im später eintrage, dann ist es in der richtigen zeitlichen Reihenfolge in den entsprechenden TBlättern sortiert.)

Mein Problem: In den Tabellenblättern möchte ich in der Spalte B den aktuellen Kontostand sehen.
Nur nach dem Sortieren muss er dementsprechend jede Zelle B die nach dem neu eingetragenen Datum liegt aktualisieren/neu berechnen.

So solls aussehen:

1 2 3 4
A 01.01.2009 100,-€ Anfangsbestand 0,-€
B 02.02.2009 A2+B4 Bewegung #1 5,-€
C ......

Hier mein derzeitiger Code:

Sub Daten_eintragen()
Dim Zeile
Dim Zeilr
'nur wenn in B3 und D3 etwas drinsteht dann eintragen
If [b3] <> "" And [d3] <> "" Then
'Tabellenblatt ermitteln
If [h3] = "1" Then
Sheets("SPK").Select
'letzte benutzte Zeile ermitteln + 1
Zeile = Cells(Rows.Count, 1).SpecialCells(xlLastCell).Row + 1
Zeilr = Cells(Rows.Count, 1).End(xlUp).Row
'Daten eintragen
Cells(Zeile, 1) = Sheets("Eingabe").Range("b3").Value
Cells(Zeile, 2) = Cells(Zeilr, 2) + Sheets("Eingabe").Range("f3").Value
Cells(Zeile, 3) = Sheets("Eingabe").Range("d3").Value
Cells(Zeile, 4) = Sheets("Eingabe").Range("f3").Value
Cells(Zeile, 5) = Sheets("Eingabe").Range("h3").Value

'Sortieren
Range(Cells(1, 1), Cells(Rows.Count, 5)).Sort _
Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin, DataOption1:=xlSortNormal


'Eingaben löschen
Sheets("Eingabe").Select
[b3] = ""
[d3] = ""
[f3] = ""
[h3] = ""
'letzte Zeile in sichtbaren Bereich holen
Cells(Zeile, 1).Select
Else
'Tabellenblatt ermitteln
If [h3] = "2" Then
Sheets("2.VoBa").Select
........

Habt Ihr ne Idee oder Verbesserungs-/Vereinfachungsvorschlägen?

Vielen Dank im Voraus!

DasBinIch132
 

Noch ne kleine Anmerkung;
für routinierte VBAler scheint das n Kinderspiel zu sein, hab grad folgende Ansatz bekommen:
Code:
FOR x=0 TO dataArray.Ende - 1
    dataArray[x+1][b] = dataArray[x][b] + dataArray[x+1][ c] END FOR
Leider weiß ich nicht ganz wie ich das einsetzen kann bzw. was es letztendlich bewirkt ..

MfG DasBinIch132
 
Gedankenanstoß

Kann man das evtl. auch mit 'ner 0815-Excelformel machen?
Ich könnte doch in die Spalte B die Formel B1+D2 eingeben und das das für jede Spalte bis 65537 eintragen.
Dann müsste ich nur die zwei Bereiche A1:A65537 und C1:E65537 sortieren.
Würde das gehen?

Ich habs gerade probiert, indem ich in die Sortierfunktion ein "&" eingefügt habe.
Allerdings meckert Excel dann... Habe ihr ne Idee?

MfG DasBinIch 132
 
Hab dir zwar keine Lösung, da ich Programmierer und nicht Excel-Bastler bin. Jedoch solltest du dein Code formatiert in [code=vb]...[/code] setzen, damit sie für die Forenuser lesbar sind (formatiert mit sauberem einrücken). Das Zeug ist sonst einfach unlesbar.

FOR .. TO .. END FOR ist eine Schleife. Mach dich mal klug darüber.

Nachtrag
Irgendwie hat dein Code keine END IF......
 
Zuletzt bearbeitet:
VB-Code

Hier mein derzeitiger Code:
Visual Basic:
Sub Daten_eintragen()
Dim Zeile
Dim Zeilr
'nur wenn in B3 und D3 etwas drinsteht dann eintragen
If [b3] <> "" And [d3] <> "" Then
'Tabellenblatt ermitteln
If [h3] = "1" Then
Sheets("SPK").Select
'letzte benutzte Zeile ermitteln + 1
Zeile = Cells(Rows.Count, 1).SpecialCells(xlLastCell).Row + 1
Zeilr = Cells(Rows.Count, 1).End(xlUp).Row
'Daten eintragen
Cells(Zeile, 1) = Sheets("Eingabe").Range("b3").Value
Cells(Zeile, 2) = Cells(Zeilr, 2) + Sheets("Eingabe").Range("f3").Value
Cells(Zeile, 3) = Sheets("Eingabe").Range("d3").Value
Cells(Zeile, 4) = Sheets("Eingabe").Range("f3").Value
Cells(Zeile, 5) = Sheets("Eingabe").Range("h3").Value

'Sortieren
Range(Cells(1, 1), Cells(Rows.Count, 5)).Sort _
Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin, DataOption1:=xlSortNormal


'Eingaben löschen
Sheets("Eingabe").Select
[b3] = ""
[d3] = ""
[f3] = ""
[h3] = ""
'letzte Zeile in sichtbaren Bereich holen
Cells(Zeile, 1).Select
Else
'Tabellenblatt ermitteln
If [h3] = "2" Then
Sheets("2.VoBa").Select
........

Hier meine Idee fürs sortieren (die nicht funktioniert):

Visual Basic:
'Sortieren
Range((Cells(1, 1), Cells(Rows.Count, 1)) & (Cells(Rows.Count, 3), Cells(Rows.Count, 5)).Sort _
Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin, DataOption1:=xlSortNormal

Vielen Dank im Voraus!

DasBinIch132
 
Lösung

Hab die Lösung!!
Visual Basic:
Sub Daten_eintragen()
Dim Zeile As Long, Z As Long
'nur wenn in B3 bis H3 etwas drinsteht dann eintragen
If [b3] = "" Or [d3] = "" Or [f3] = "" Or [h3] = "" Then Exit Sub
'Tabellenblatt ermitteln
With Worksheets(Range("H3").Value)
   'letzte benutzte Zeile ermitteln + 1
   Zeile = .Cells(Rows.Count, 1).End(xlUp).Row + 1
   'Daten eintragen
   .Cells(Zeile, 1) = Range("b3").Value
   .Cells(Zeile, 3) = Range("d3").Value
   .Cells(Zeile, 4) = Range("f3").Value
   'Sortieren
   .Range("A2:D" & Zeile).Sort _
      Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlNo, _
         OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            SortMethod:=xlPinYin, DataOption1:=xlSortNormal
   .Cells(2, 2) = .Cells(2, 4)
   If Zeile <> 2 Then
      .Range("B3:B" & Zeile).Formula = "=B2+D3"
      .Range("b2:B" & Zeile).Value = .Range("b2:B" & Zeile).Value
   Else
      .Range("B2") = .Range("D2")
   End If
   'Eingaben löschen
   Range("B3,D3,F3,H3").ClearContents
   MsgBox "Eingetragen"
   Range("B3").Value = Date
End With
End Sub

Danke für eure Hilfe ... -.-
 

Neue Beiträge

Zurück