VBA springt wild im Code herum ohne Ersichtlichen Grund

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Kathleen.

    VBA springt wild im Code herum ohne Ersichtlichen Grund

    Hallo zusammen,

    das Problem ist, dass ich vom Excel Arbeitsblatt auf VBA verweisen möchte und wenn man es dann schafft in den code zu kommen, hüpft der nach zwei variablendefinitionen in ein anderes Sub. Code:

    Function Test(ByRef a As Range, ByRef Datum As Range) As Variant
    Dim Answer1 As Variant
    Dim Answer2 As Variant
    Dim b As Range
    Dim Wert As Long
    Dim NeuePos As Range

    Test = " "
    NeuePos = a.Column + 3
    b = Application.Cells(5, NeuePos)
    Wert = a.Value
    If Eingabe = True Then
    Answer1 = InputBox("Bitte geben Sie Ihre tatsächliche Arbeitszeit vom " & Datum.Value & " ein." & (Chr(13)) & "[hh]:[mm]", "Zeitabfrage", Wert)
    If Answer1 <> "" Then
    Answer2 = Left(Answer1, 2) & ":" & Mid(Answer1, 4, 2)
    Else
    Eingabe = False
    End If
    End If
    Test = Answer2
    End Function

    Sub Aktualisieren_Klicken()
    Dim objRange As Range

    'Set objRange = Application.Range(Cells(3, 26), Cells(33, 26))
    Set objRange = Application.Cells(3, 26)
    objRange.Dirty

    Set objRange = Application.Cells(4, 26)
    objRange.Dirty

    Set objRange = Application.Cells(5, 26)
    objRange.Dirty

    Set objRange = Application.Cells(6, 26)
    objRange.Dirty

    Set objRange = Application.Cells(7, 26)
    objRange.Dirty

    Set objRange = Application.Cells(8, 26)
    objRange.Dirty

    Eingabe = True
    End Sub

    In VBA läuft der erstmal in diese Befehle:

    Test = " "
    NeuePos = a.Column + 3

    und hier beginnt das wilde springen. Nach bisher ungeklärtem Schema springt der nun nach hier:

    Set objRange = Application.Cells(4, 26)
    objRange.Dirty

    oder hier:

    Set objRange = Application.Cells(6, 26)
    objRange.Dirty

    dann läuft der ganz ruhig das Sub Aktualisieren durch (Was übrigens eigentlich nur ein Button ist, der Spalte Z kontrollieren soll ob bereits ein Wert eingetragen wurde und variable "Eingabe" auf Wahr setzt. Die ist übrigens im Option Explicit deklariert, was vor einer Zeit kein Problem war. Wenn der nun die Sub eigentlich zuende hat, springt der willkürlich wieder zum Sub Anfang und läuft durch bis zu seinem Anfangspunkt. Aber anstatt wieder in die erste Function zu springen und endlich zu machen was er soll hört der einfach auf und gibt in der Zelle einen Wert Fehler aus.
    Die Formel kann es eigentlich nicht sein, weil alles was die macht ist prüfen ob die Zelle VBA also den Benutzer braucht und ob der Wert von der Spalte wo auf die Function verweist mit =Wenn(Länge(Z3)=4;;Z3) zu beauftragen. Aber es kommt kein Ergebnis sondern wie gesagt nur Wert.
    In Z3 steht folgendes:=Test(A3;'T&A Tagesbericht'!F3) was ja nur Variablenwerte übergibt.

    Zwischenzeitlich hat es mal soweit funktioniert, dass der das Input fenster aufruft, aber das macht der wie gesagt nicht mehr und ich habe keine Ahnung, was nun dazu geführt hat.

    Ich bin ratlos, bitte helft mir, da sitze ich schon ein halbes Jahr dran ohne Erfolg.

    Viele Grüße
    Träumerin
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    Es wäre schön, wenn du deinen Code hier via VB-BBCode einfügen würdest, damit dieser eingefärbt wird. Dadurch bleiben auch die Einrückungen bestehen, falls überhaupt vorhanden (falls nein, solltest du das nachholen ;) ).

    Gibt es im VBA-Editor einen Einzelschrittmodus? Und wenn ja, kann man damit das beschriebene Verhalten sehen?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    application.cells wurde von mir bisher noch nie benutzt. Da liegt bestimmt der Pfeffer im Hase. Oben mal option explicit mit angeben, und alle Variablen einen korrekten Typen geben.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Die Ursache für "wild im Code springen" ist häufig bei Neuberechnungen, wenn UDFs (User Defined Functions) verwendet werden.
    Schalt mal Update und Berechnung testweise aus, ob er dann immer noch springt).

    Im Übrigen gebe ich peterfido recht.
    Application.Cells ist nichts, was ich freiwillig verwenden würde.
    Verwende die Cells-Collection eines bestimmten Arbeitsblattes.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim Eingabe As Boolean
    3. Function Test(ByRef a As Range, ByRef Datum As Range) As Variant
    4. Dim Answer1 As Variant
    5. Dim Answer2 As Variant
    6. Dim b As Range
    7. Dim Wert As Long
    8. Dim NeuePos As Range
    9. 'Test = " "
    10. 'NeuePos = a.Column + 3
    11. 'b = Application.Cells(5, NeuePos)
    12. Wert = a.Value
    13. If Eingabe = True Then
    14. Answer1 = InputBox("Bitte geben Sie Ihre tatsächliche Arbeitszeit vom " & Datum.Value & " ein." & (Chr(13)) & "[hh]:[mm]", "Zeitabfrage", Wert)
    15. If Answer1 <> "" Then
    16. Answer2 = Left(Answer1, 2) & ":" & Mid(Answer1, 4, 2)
    17. Else
    18. Eingabe = False
    19. End If
    20. End If
    21. Test = Answer2
    22. End Function
    23. Sub Aktualisieren_Klicken()
    24. Dim objRange As Range
    25. 'Set objRange = Application.Range(Cells(3, 26), Cells(33, 26))
    26. Set objRange = Application.Cells(3, 26)
    27. objRange.Dirty
    28. Set objRange = Application.Cells(4, 26)
    29. objRange.Dirty
    30. Set objRange = Application.Cells(5, 26)
    31. objRange.Dirty
    32. Set objRange = Application.Cells(6, 26)
    33. objRange.Dirty
    34. Set objRange = Application.Cells(7, 26)
    35. objRange.Dirty
    36. Set objRange = Application.Cells(8, 26)
    37. objRange.Dirty
    38. Eingabe = True
    39. End Sub


    Hoffe es hat geklappt.
    Habe in der Zwischenzeit noch ein paar leute befragt und eine alte Version meiner Datei gefunden, wo nur ein paar weniger schlimme Fehler drin waren. Die konnte ich mit ein wenig Hilfe beheben und schlage mich nun nur noch mit den nächsten Formeln rum, wo ich mich aber noch nicht entschieden habe, was die eigentlich so können sollen. Hier auch noch der jetzige funktionierende Code:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim Eingabe As Boolean
    3. Function Test(Datum As Range, Ursprungszeit As Range) As Variant
    4. Dim Answer1 As Variant
    5. Dim Answer2 As Variant
    6. If Eingabe = True Then
    7. Answer1 = InputBox("Bitte geben Sie Ihre tatsächliche Arbeitszeit vom " & Datum.Value & " ein." & (Chr(13)) & "[hh]:[mm]")
    8. If Answer1 <> "" Then
    9. Answer2 = Left(Answer1, 2) & ":" & Mid(Answer1, 4, 2)
    10. Else
    11. Eingabe = False
    12. End If
    13. End If
    14. Test = Answer2
    15. End Function
    16. Sub Aktualisieren_Klicken()
    17. Dim objRange As Range
    18. Dim i As Integer
    19. 'Set objRange = Application.Range(Cells(3, 26), Cells(33, 26))
    20. 'Set objRange = Application.Cells(3, 26)
    21. 'objRange.Dirty
    22. For i = 3 To 30 Step 1
    23. If Application.Cells(i, 27).Value <> "x" Then 'Inhalt der Zelle rechts neben dem Wert auf "x" prüfen > wenn ungleich "x"
    24. Application.Cells(i, 26).Dirty 'erzwingt die Berechnung neu auszuführen (dirty)
    25. If Eingabe = True Then 'Wenn die Variable "Eingabe" Wahr entspricht
    26. Application.Cells(i, 27).Value = "x" 'setzte die Zelle rechts neben dem Wert auf "x" und verhindert somit die Löschung und Neuberechnung
    27. End If
    28. ElseIf Application.Cells(i, 27).Value <> "x" Then
    29. End If
    30. Next i
    31. Eingabe = True '"Eingabe" wird auf Wahr gesetzt
    32. End Sub
    33. Function Bitte_Aktualisieren()
    34. MsgBox "Bitte klicken Sie auf Aktualisieren", vbCritical, "Es fehlt ein Wert"
    35. End Function



    Trotzdem vielen vielen Dank für eure Mühe

    Viele Grüße
    Kathleen
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True