[Excel] Bei leere Zellen weiter zurück ermitteln

josef24

Erfahrenes Mitglied
Guten Tag. Ich versuche mich an einer Formel für eine qualifizierte Tabelle, die folgendes errechnen soll. =WENN(UND(D3<>"";E3<>"");H$1+D3-E3;"")

Ich habe folgenden Code versucht: =WENN(und([@Saldo](D3<>" ";[@Haben](E3<>““);[@Saldo]H$1+[Soll]D3- [@Haben]E3;““))) der aber kein Ergebnis liefert.

Die Spalten sind folgend bezeichnet:
D = Soll

E = Haben

F = Saldo

Kann mir da viellleicht jemand weiter helfen.

Gruß Josef
 
Ich versteh kein Wort.....
Du willst D3 mit Saldo qualifizieren, D3 steht aber in Spalte SOLL
HABEN und E3 stimmt irgendwie wieder,
H1 mit SALDO wieder nicht

*seufz*

Code:
=WENN(UND(@SOLL<>"";@HABEN<>"");H$1+@SOLL-@HABEN;"")
 
Hallo zusammen, ich komme mal wieder mit einer Frage bezüglich eines VBA Codes, und suche Hilfe bei der Formulierung des Codes. Ich möchte, dass wenn ich Werte in den Spalten D und E eingebe bzw. verändere, in Spalte F das Ergebnis eingefügt wird. Das Gleiche soll sich in den Spalten G, H und I sowie J, K und L wiederholen. Die Schwierigkeit für mich ist, und ich habe schon einiges versucht, wenn in der Auflistung eine Zeile z. B. Spalten D, E und F eine Zeile frei bleibt, und sich die Formel aus der vorigen Zeile den letzten Wert zur Berechnung heranziehen soll. Ich hoffe, mir kann jemand weiterhelfen. Gruß Josef
Visual Basic:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ws As Worksheet
    Dim rowStart As Long
    Dim colD As Long, colE As Long, colF As Long
    Dim colG As Long, colH As Long, colI As Long
    Dim colJ As Long, colK As Long, colL As Long
    Dim r As Long
    Dim previousRow As Long

    ' Initialisierung
    Set ws = Me ' Aktuelles Arbeitsblatt
    rowStart = 4 ' Formel beginnt ab Zeile 4
    colD = 4 ' Spalte D
    colE = 5 ' Spalte E
    colF = 6 ' Spalte F
    colG = 7 ' Spalte G
    colH = 8 ' Spalte H
    colI = 9 ' Spalte I
    colJ = 10 ' Spalte J
    colK = 11 ' Spalte K
    colL = 12 ' Spalte L

    ' Prüfen, ob die Änderung in den relevanten Spalten erfolgt ist
If Intersect(Target, ws.Columns(colD)) Is Nothing _
   Or Intersect(Target, ws.Columns(colE)) Is Nothing _
   Or Intersect(Target, ws.Columns(colF)) Is Nothing _
   Or Intersect(Target, ws.Columns(colG)) Is Nothing _
   Or Intersect(Target, ws.Columns(colH)) Is Nothing _
   Or Intersect(Target, ws.Columns(colI)) Is Nothing _
   Or Intersect(Target, ws.Columns(colJ)) Is Nothing _
   Or Intersect(Target, ws.Columns(colK)) Is Nothing _
   Or Intersect(Target, ws.Columns(colL)) Is Nothing Then Exit Sub

        Exit Sub
'    End If

    Application.EnableEvents = False ' Verhindert Endlosschleifen durch Worksheet_Change

    ' Schleife durch die geänderten Zellen
    For Each Cell In Target
        r = Cell.Row

        ' Nur für Zeilen ab rowStart
        If r >= rowStart Then
            ' Verarbeitung für Spalten D, E, F
            If Not IsEmpty(ws.Cells(r, colD).Value) Or Not IsEmpty(ws.Cells(r, colE).Value) Then
            previousRow = FindLastNonEmptyRow(ws, colF) ' ? Nur zwei Argumente

''                previousRow = FindLastNonEmptyRow(ws, colF, r, rowStart)
                If previousRow > 0 Then

                    ws.Cells(r, colF).Formula = _
                        "=" & ws.Cells(previousRow, colF).Address & "+" & _
                        ws.Cells(r, colE).Address & "-" & ws.Cells(r, colD).Address
Debug.Print "Formel eingetragen für Zeile " & r & ": " & ws.Cells(r, colF).Formula
                        
                        Else
    ws.Cells(r, colF).Formula = _
        "=" & ws.Cells(2, colF).Address & "+" & ws.Cells(r, colE).Address & "-" & ws.Cells(r, colD).Address
End If
            Else
                ws.Cells(r, colF).ClearContents
            End If

            ' Verarbeitung für Spalten G, H, I
            If Not IsEmpty(ws.Cells(r, colG).Value) Or Not IsEmpty(ws.Cells(r, colH).Value) Then
            previousRow = FindLastNonEmptyRow(ws, colI) ' ? Nur zwei Argumente

        ''    previousRow = FindLastNonEmptyRow(ws, colI, r, rowStart)
                If previousRow > 0 Then
                    ws.Cells(r, colI).Formula = _
                        "=" & ws.Cells(previousRow, colI).Address & "+" & _
                        ws.Cells(r, colH).Address & "-" & ws.Cells(r, colG).Address
Debug.Print "Formel eingetragen für Zeile " & r & ": " & ws.Cells(r, colI).Formula
                Else
     ws.Cells(r, colI).Formula = _
        "=" & ws.Cells(2, colI).Address & "+" & ws.Cells(r, colH).Address & "-" & ws.Cells(r, colG).Address
                End If
            Else
                ws.Cells(r, colI).ClearContents
            End If

            ' Verarbeitung für Spalten J, K, L
            If Not IsEmpty(ws.Cells(r, colJ).Value) Or Not IsEmpty(ws.Cells(r, colK).Value) Then
            previousRow = FindLastNonEmptyRow(ws, colL) ' ? Nur zwei Argumente

'                previousRow = FindLastNonEmptyRow(ws, colL, r, rowStart)
                If previousRow > 0 Then
                    ws.Cells(r, colL).Formula = _
                        "=" & ws.Cells(previousRow, colL).Address & "+" & _
                        ws.Cells(r, colK).Address & "-" & ws.Cells(r, colJ).Address
Debug.Print "Formel eingetragen für Zeile " & r & ": " & ws.Cells(r, colL).Formula
                Else
    ws.Cells(r, colL).Formula = _
        "=" & ws.Cells(2, colL).Address & "+" & ws.Cells(r, colK).Address & "-" & ws.Cells(r, colJ).Address
                End If
            Else
                ws.Cells(r, colL).ClearContents
            End If
        End If
    Next Cell

    Application.EnableEvents = True ' Ereignisse wieder aktivieren
End Sub

' Funktion zur Suche der letzten Zeile mit einem tatsächlichen Wert in einer Spalte
Private Function FindLastNonEmptyRow(ws As Worksheet, col As Long) As Long
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).Row
    If lastRow < 4 Then FindLastNonEmptyRow = 4 Else FindLastNonEmptyRow = lastRow
End Function
 
Zurück