VBA Funktionen brechen ohne Fehlermeldung ab

  • Excel

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Patrick.Starfish.

    VBA Funktionen brechen ohne Fehlermeldung ab

    Hallo,

    ich habe mit Hilfe von google ein paar VB-Funktionen geschrieben, welche Überprüfen ob in einer bestimmten Spalte ein Inhalt vorhanden ist und wenn das Zutrifft entsprechten die Inhalte in einer neuen Zeile unter dem Finding neu strukturiert. Ebenfalls werden die Informationen aus den Ausgangsinformationen entfernt. Prinzipiell habe ich etwas zusammengebastellt was glaube funktionieren sollte, aber aus einem unbekannten Grund bricht das Programm an zwei Stellen ab. Bei den Stellen Arbeitet das Skript in den Excel-Workssheets und soll eine leere Zeile erstellen oder in der erstellten Zeile Informationen Schreiben.

    Für Hilfe wäre ich sehr dankbar.

    Hier der Code:

    Nachträglich entfernt aufgrund von Änderung durch die Diskussion!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Patrick.Starfish“ ()

    Du schreibst "Abbruch". D.h. es gibt keine Fehlermeldung? Bist du das Programm mal im Einzelschrittmodus durchgegangen? Haltepunkt setzen und dann mit F8 immer einen Schritt weiter gehen.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hallo,

    pack mal ganz oben in Deinen Code

    Visual Basic-Quellcode

    1. Option Explicit
    .

    Du nutzt (diverse?) Variablen Doppelt / in mehreren Subs / Funktionen. Diese dann auch in jeder Funktion Delakieren.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo Peterfido,

    vielen Dank für deinen Tipp nach der Umsetzung agieren die VBA-Funktionen gar nicht mehr mit dem Excel, aber die Stelle Sheets("FA_SA").Cells(Column + 1, 1).EntireRow.Insert führt nicht mehr zum Abbruch, aber auch zu keinerlei Reaktion. Ich habe die Excel-Datei einmal angehangen.

    Ziel der VBA-Funktionen soll es sein die Signale im Worksheet "FA_SA" in den Spalte "signSignal" oder "addCalcSigna" in eine eigene Zeile zu schreiben in Spalte "signalExtern" und aus den ursprünglichen Zeilen zu eliminieren. Dazu soll im ersten Arbeitsblatt noch ein Button angelegt werden, was noch nicht stattgefunden hat.

    Quellcode

    1. Option Explicit
    2. Public Function AddSignAndCalcSig() 'Hinzufügen der Signale aus signSignal und addCalcSignal
    3. 'Ueberpruefung ob notwendige Spalten im Worksheet "FA_SA" an der richtigen Position sind
    4. Dim ColSignSig As String
    5. Dim ColAddCalcSig As String
    6. ColSignSig = Range("FA_SA!U1")
    7. ColAddCalcSig = Range("FA_SA!W1")
    8. If ColSignSig <> "signSignal" Xor ColAddCalcSig <> "addCalcSignals" Then
    9. 'Fehlerausgabe
    10. MsgBox "'signSignal' nicht in Spalte 'U' und / oder 'addCalcSignals' nicht in Spalte 'W'"
    11. Else
    12. 'Abbruchbedingung fuer Loop festlegen: In der ersten Spalte einer Zeile muss ein Wert enthalten sein und de darf nicht 'TEMPLATE' heissen
    13. Dim ColHasVal As String
    14. ColHasVal = Range("FA_SA!A2")
    15. 'Start der Schleife in Zeile zwei, weil Zeile ein enthaelt Ueberschriften
    16. Dim Iter As Integer
    17. Iter = 2
    18. Do While ColHasVal <> "" And ColHasVal <> "TEMPLATE"
    19. 'Uebergabe der aktuellen Werte in Spalte "signSignal" und "addCalcSignal"
    20. ColSignSig = Range("FA_SA!U" & Iter)
    21. ColAddCalcSig = Range("FA_SA!W" & Iter)
    22. 'Ueberpruefen ob Inhalt vorhanden und wenn ja eine entsprechende Behandelung durchfuehren
    23. If ColSignSig <> "" Then
    24. Call SigExpansion(Iter, True)
    25. End If
    26. If ColAddCalcSig <> "" Then
    27. Call SigExpansion(Iter)
    28. End If
    29. 'Uebergabe des Spaltenwerts der naechsten Zeile
    30. Iter = Iter + 1
    31. ColHasVal = Range("A" & Iter)
    32. Loop
    33. End If
    34. End Function
    35. Private Function SigExpansion(ByVal Column As Long, Optional ByVal SigIsSignSig As Boolean = False)
    36. 'Speichere die Informationen der Zeile aus dem Worksheet
    37. Dim rRowInfo As Variant
    38. rRowInfo = Range("FA_SA!A" & Column & ":FA_SA!AG" & Column)
    39. 'Speichern der Informationen des Objekts in ein zweites Objekt zur gegenseitigen Bearbeitung
    40. Dim wRowInfo As Variant
    41. wRowInfo = rRowInfo
    42. If SigIsSignSig = True Then
    43. 'Uebergabe des Vorzeichensignals in die signalExtern-Spalte des zu schreibenden Objekts
    44. wRowInfo(1, 20) = rRowInfo(1, 21)
    45. 'Loeschen der Vorzeichensignale aus der entsprechenden Spalte der Objekte
    46. rRowInfo(1, 21) = ""
    47. wRowInfo(1, 21) = ""
    48. 'Korrektur des Datentyps des Vorzeichensignals im zu schreibenden Objekt
    49. wRowInfo(1, 6) = "bool"
    50. 'Lege eine neuen Zeile unter der auffaelligen Zeile an
    51. Sheets("FA_SA").Cells(Column + 1, 1).EntireRow.Insert [color=#FF0000]'SPORADISCHER ABBRUCH BEIM ERSTEN AUFRUF, WARUM?[/color]
    52. 'Schreibe das zu schreibende Objekt in den neu erstellte Zeile
    53. Call SigWriting(wRowInfo, Column + 1)
    54. Else
    55. 'Fuehre die Operation so lange durch bis alle Signale in "addCalcSignals" erzeugt wurden
    56. Do While wRowInfo(1, 23) <> ""
    57. 'AddCalcSignals extrahieren
    58. wRowInfo = SigExtraction(wRowInfo)
    59. 'Lege eine neuen Zeile unter der auffaelligen Zeile an
    60. Sheets("FA_SA").Cells(Column + 1, 1).EntireRow.Insert [color=#FF0000]'SPORADISCHER ABBRUCH BEIM ERSTEN AUFRUF, WARUM?[/color]
    61. 'Zwischenspeicher der Ergebnisse in addCalcSignals
    62. Dim StrTemp As String
    63. StrTemp = wRowInfo(1, 23)
    64. wRowInfo(1, 23) = ""
    65. 'Schreibe das zu schreibende Objekt in den neu erstellte Zeile
    66. Call SigWriting(wRowInfo, Column + 1)
    67. wRowInfo(1, 23) = StrTemp
    68. Loop
    69. 'Loeschen der addCalcSignals aus der entsprechenden Spalte des Ausgangsobjektes
    70. rRowInfo(1, 23) = ""
    71. End If
    72. 'Schreibe das gelesenden Objekts in den Ausgangszeile
    73. Call SigWriting(rRowInfo, Column)
    74. End Function
    75. Private Function SigExtraction(ByVal SigInfo As Variant)
    76. Dim StrPos As Integer
    77. 'Suchen der Endposition des Teil- / Gesamtstrings
    78. If InStr(SigInfo(1, 23), ",") < InStr(SigInfo(1, 23), ";") Or (0 < InStr(SigInfo(1, 23), ",") And InStr(SigInfo(1, 23), ";") = 0) Then
    79. StrPos = InStr(SigInfo(1, 23), ",")
    80. ElseIf InStr(SigInfo(1, 23), ";") <> 0 Then
    81. StrPos = InStr(SigInfo(1, 23), ";")
    82. Else
    83. StrPos = Len(Trim(SigInfo(1, 23)))
    84. End If
    85. 'Extrahieren des Teil- / Gesamtstrings
    86. Dim SigName As String
    87. SigName = Left(SigInfo(1, 23), StrPos - 1)
    88. 'Entfernen von Leerzeichen und Zurueckschreiben in die Struktur
    89. SigInfo(1, 20) = Trim(SigName)
    90. 'Entfernen des Teil- / Gesamtstrings aus vorheriger Liste
    91. SigInfo(1, 23) = Trim(Right(SigInfo(1, 23), Len(SigInfo(1, 23)) - StrPos))
    92. SigExtraction = SigInfo
    93. End Function
    94. Private Function SigWriting(ByVal SigInfo As Variant, ByVal Column As Long)
    95. Dim Iter As Integer
    96. 'Schreibe die Informationen des Vectors in die Spalten des Worksheets
    97. For Iter = 1 To 33
    98. Sheets("FA_SA").Cells(Column, Iter).Value = SigInfo(1, Iter) [color=#FF0000]'ABBRUCH BEIM ERSTEN AUFRUF, WARUM?[/color]
    99. Next
    100. End Function

    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Patrick.Starfish“ ()

    Heyho :)

    Kurze Frage meinerseits: Wenn man in VBA etwas programmiert, kommt es meiner Meinung nach recht selten dazu, dass Fehler wirklich ausgespuckt werden. Ich hatte bisher nur wenig damit zu tun - ehr im Sinne von Print-Addin Entwicklung o.ä..
    Hier wurde dann über On Error Goto Errhandler mehr oder Weniger mit Sprungmarken Fehlermessages erzeugt, um zu wissen wo der Fehler liegt.

    Macht das bei Excel auch Sinn? Ist das generell eine gängige Methode oder sollte VBA etc. immer von sich aus Fehlermeldungen werfen?



    Danke schonmal :)


    MfG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:

    Acr0most schrieb:

    Wenn man in VBA etwas programmiert, kommt es meiner Meinung nach recht selten dazu, dass Fehler wirklich ausgespuckt werden
    Das sehe ich anders.
    Fehler werden nur dann nicht ausgespuckt, wenn das Projekt passwortgeschützt ist.
    Ansonsten geht eine Messagebox auf, die als Auswahl "Exit" oder "Debug" bringt.
    Errorhandler sollten nur eingebaut werden, um bewusst ganz bestimmte Fehler zu handeln.

    Undurchsichtig wird es dann, wenn in einer äusseren Routine ein Errorhandler existiert und in einer inneren Routine ein unbehandelter Fehler passiert.
    Dann wird in den Errorhandler der äusseren Routine verzweigt.
    Deswegen während der Entwicklungsphase am besten überhaupt keine Handler einbauen.

    Patrick.Starfish schrieb:

    Weil beim abspeichern gemeckert wurde das xlsm nicht unterstützt wird
    Du meinst, beim Anhängen im Forum?
    xlsm zippen und das ZIP anhängen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Bei mir läuft er nach 19 Rows in Zeile 129 auf Fehler bei

    Visual Basic-Quellcode

    1. SigName = Left(SigInfo(1, 23), StrPos - 1)

    mit SigInfo(1, 23)=s_FDR_PcfPw18; wegen StrPos=0

    Ich habe mir nicht die Mühe gemacht, deinen Algorithmus verstehen zu wollen, aber du solltest dir die Funktion SigExtraction genauer anschauen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --