Fehlercode(400) beim Verstecken von Spalten mit einer Modulfunktion

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von manuelritter.

    Fehlercode(400) beim Verstecken von Spalten mit einer Modulfunktion

    Hallo zusammen :)

    Habe da ein sehr verzwicktes Problem, für das es bestimmt eine Lösung gibt.

    Ich habe zwei ausgelagerte Funktionen in meinem Modul 1:

    Visual Basic-Quellcode

    1. Public Function schuetze(ByVal Protect As Boolean)
    2. Dim password As String
    3. password = ""
    4. If Protect = False Then
    5. Sheets("Bewerbungen").Unprotect (password)
    6. Sheets("Input Neu").Unprotect (password)
    7. Sheets("Archiv").Unprotect (password)
    8. Sheets("Parameter").Unprotect (password)
    9. Else
    10. Sheets("Input Neu").Protect (password)
    11. Sheets("Bewerbungen").Protect (password)
    12. Sheets("Parameter").Protect (password)
    13. Sheets("Archiv").Protect (password)
    14. End If
    15. End Function
    16. Public Function sichtbar(ByVal Hidden As Boolean)
    17. Sheets("Bewerbungen").Range("P:T,X:AC,AJ:BP,BY:CF").EntireColumn.Hidden = Hidden
    18. End Function


    Diese sind wie wahrscheinlich schon bemerkt, dafür zuständig, Sheets zu schützen/freizugeben bzw. Spalten zu verstecken/sichtbar zu machen.

    Nun habe ich zwei weitere Funktionen, die diese benutzen.

    Visual Basic-Quellcode

    1. Sub Output_Click()
    2. Dim Hidden As Boolean
    3. Dim Protect As Boolean
    4. Dim strOldFile As String
    5. Dim strNewFile As String
    6. Dim book As String
    7. Dim zeile As String
    8. Dim GD() As String
    9. Dim GDZ() As String
    10. Dim AD() As String
    11. Dim KD() As String
    12. Dim TD() As String
    13. Dim AKD() As String
    14. Dim BSD() As String
    15. 'Parameter initialisieren
    16. Application.ScreenUpdating = False
    17. 'Flackern unterbinden
    18. zeile = ActiveCell.Row
    19. 'Ausgewählte Zeile hinterlegen
    20. Protect = False
    21. schuetze (Protect)
    22. Hidden = False
    23. sichtbar (Hidden)
    24. 'Entfernen des Blattschutzes und Sichtbarmachung aller Felder
    25. vorlage = "V:\Holding\Personal\Bewerbermanagement\Anwendungen\Vorlagen\BWM_Output_Vorlage.xlsx"
    26. verzeichnis = "V:\Holding\Personal\Bewerbermanagement\Anwendungen\Bewerbungen\"
    27. 'Orginalvorlage & Orginalverzeichnis
    28. GD = leseGD(zeile)
    29. GDZ = leseGDZ(zeile)
    30. AD = leseAD(zeile)
    31. KD = leseKD(zeile)
    32. TD = leseTD(zeile)
    33. AKD = leseAKD(zeile)
    34. BSD = leseBSD(zeile)
    35. 'lesemethoden
    36. StrPath = verzeichnis & GD(0) & "_" & GD(2) & "_" & GD(3) & "\"
    37. 'Erstellung der Verzeichniskennung
    38. If Not fctVerzeichnisExists(StrPath) Then
    39. MkDir StrPath
    40. ordner = "" & GD(0) & "_" & GD(2) & "_" & GD(3) & "\"
    41. Else
    42. ordner = "" & GD(0) & "_" & GD(2) & "_" & GD(3) & "\"
    43. End If
    44. 'Überprüft ob der Pfad existiert, wenn nicht wird er erstellt. Erstellt den Ordnerstring.
    45. book = "BW_" & GD(0) & "_" & GD(9) & "_" & GD(2) & "_" & GD(3) & ".xlsx"
    46. 'Workbook wird hinterlegt.
    47. strNewFile = verzeichnis & ordner & book
    48. 'Vollständiger Verzeichnispfad wird hinterlegt.
    49. FileCopy vorlage, strNewFile
    50. 'Kopiert die Vorlage und fügt sie in das neue Verzeichnis ein.
    51. Workbooks.Open Filename:=strNewFile
    52. 'Öffnet das neue Workbook
    53. password = ""
    54. Workbooks(book).Sheets("Ansicht").Unprotect (password)
    55. schreibeGD GD, book
    56. schreibeGDZ GDZ, book
    57. schreibeAD AD, book
    58. schreibeKD KD, book
    59. schreibeTD TD, book
    60. schreibeAKD AKD, book
    61. schreibeBSD BSD, book
    62. 'schreibemethoden inklusive workbookübergabe.
    63. With Workbooks("BWM_ASAP.xlsm").Sheets("Bewerbungen")
    64. .Hyperlinks.Add Anchor:=.Range("A" & zeile), _
    65. Address:=verzeichnis & ordner, _
    66. TextToDisplay:=GD(0)
    67. End With
    68. 'Erstellt den Hyperlink auf den Ordner
    69. With Workbooks("BWM_ASAP.xlsm").Sheets("Bewerbungen")
    70. .Hyperlinks.Add Anchor:=.Range("C" & zeile), _
    71. Address:=strNewFile, _
    72. TextToDisplay:=GD(2)
    73. End With
    74. 'Erstellt den Hyperlink auf die Datei
    75. With Workbooks(book).Sheets("Ansicht")
    76. .Hyperlinks.Add Anchor:=.Range("B3"), _
    77. Address:=verzeichnis & ordner
    78. End With
    79. Workbooks(book).Sheets("Ansicht").Protect (password)
    80. Workbooks(book).Save
    81. 'Workbooks(book).Sheets("Ansicht").PrintOut
    82. Workbooks(book).Close
    83. 'Speichert und schliesst das Workbook
    84. MsgBox "Datei erfolgreich exportiert!"
    85. Application.Wait (Now + TimeValue("0:00:01"))
    86. Hidden = True
    87. sichtbar (Hidden)
    88. Application.Wait (Now + TimeValue("0:00:01"))
    89. Protect = True
    90. schuetze (Protect)
    91. 'Verstecken von Feldern und Schützen der Sheets
    92. Application.ScreenUpdating = True
    93. 'Ansicht wird aktuallisiert
    94. End Sub


    und

    Visual Basic-Quellcode

    1. Sub Export_Click()
    2. Dim zeilenzahl As Integer
    3. Dim strOldFile As String
    4. Dim strNewFile As String
    5. Dim book As String
    6. Dim Hidden As Boolean
    7. Dim Protect As Boolean
    8. Dim Wert As String
    9. 'Parameter initialisieren
    10. zeilenzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    11. Application.ScreenUpdating = False
    12. 'Flackern unterbinden
    13. Protect = False
    14. schuetze (Protect)
    15. Hidden = False
    16. sichtbar (Hidden)
    17. 'Entfernen des Blattschutzes und Sichtbarmachung aller Felder
    18. vorlage = "V:\Holding\Personal\Bewerbermanagement\Anwendungen\Vorlagen\BWM_Export_Vorlage.xlsm"
    19. verzeichnis = "V:\Holding\Personal\Bewerbermanagement\Anwendungen\Exporte\"
    20. 'Orginalvorlage & Orginalverzeichnis
    21. Wert = InputBox("Bitte Niederlassungskürzel eingeben(Bsp. HN=Heilbronn):", "Niederlassung")
    22. StrPath = verzeichnis & Wert & "\"
    23. 'Erstellung der Verzeichniskennung
    24. If Not fctVerzeichnisExists(StrPath) Then
    25. MkDir StrPath
    26. ordner = "" & Wert & "\"
    27. Else
    28. ordner = "" & Wert & "\"
    29. End If
    30. 'Überprüft ob der Pfad existiert, wenn nicht wird er erstellt. Erstellt den Ordnerstring
    31. book = "BWExport_" & Wert & "_" & Date & ".xlsm"
    32. 'Workbook wird hinterlegt
    33. strNewFile = verzeichnis & ordner & book
    34. 'Vollständiger Verzeichnispfad wird hinterlegt
    35. FileCopy vorlage, strNewFile
    36. 'Kopiert die Vorlage und fügt sie in das neue Verzeichnis ein
    37. Workbooks.Open Filename:=strNewFile
    38. 'Öffnet das neue Workbook
    39. password = ""
    40. Workbooks(book).Sheets("Export").Unprotect (password)
    41. ExportSchreibePartA book, zeilenzahl
    42. ExportSchreibePartB book, zeilenzahl
    43. ExportSchreibePartC book, zeilenzahl
    44. Workbooks(book).Save
    45. Workbooks(book).Close
    46. 'Speichert und schliesst das Workbook
    47. MsgBox "Datei: " & book & " erfolgreich erstellt!"
    48. Hidden = True
    49. sichtbar (Hidden)
    50. Protect = True
    51. schuetze (Protect)
    52. 'Verstecken von Feldern und Schützen der Sheets
    53. Application.ScreenUpdating = True
    54. 'Ansicht wird aktuallisiert
    55. End Sub


    Nun kommt der Fehler:
    Die Export_Click funktioniert tadellos, sie macht was sie soll und führt die 2 Funktionen richtig aus.

    Die Output_Click allerdings bringt einen Fehlercode 400 sobald er die erste Funktion erreicht.

    Wenn ich nun in den Debugmodus gehe und diese 4 Zeilen markiere:

    Hidden = True
    sichtbar (Hidden)
    Protect = True
    schuetze (Protect)

    Dann führt er sie wie vorgesehen aus, ohne fehlercode.

    Was steckt dahinter?

    Info:
    ich habe es schon mit

    Application.Wait (Now + TimeValue("0:00:01"))

    versucht mit den werten 1 Sec, 5 Sec, 10 Sec, um einfach auf Nummer sicher zu gehen, ob der Fehler bei der zu schnellen Abarbeitung liegt.

    Hoffentlich weiss irgendjemand Rat, denn ich weiss keinen mehr =/
    Bei der einen Funktion ist ein Application.Wait dazwischen, bei der anderen nicht.
    Beim Einzelschritt debugging fungiert der Mensch als "Wait". Nach dem Schützen/Sperren muss man vermutlich "warten", bis Excel die gewünschte Aktion beendet hat. Also entweder einen fixen "Wait-Wert" bestimmen, oder herausfinden, wie Excel einem "Bescheid" sagt, wenn eine Aktion beendet wurde.
    Da gebe ich dir teilweise Recht, ich weiss natürlich nicht wie sich das verhält, weil gerade vor ein paar minuten habe ich es mit einer auszeit von 30 sekunden getestet und es funktioniert wieder nicht ....

    Irgendeine Idee, wie ich das Problem in den Griff bekommen kann?
    Sowas ähnliches hatte ich auch mal, beim Debuggen hat es geklappt und beim Code selber nicht. Sechs Stunden später hatte ich war nicht das Problem erkannt, aber eine Lösung: Ich hatte eine Fehlerroutine gebaut mit und das ist der Witz Case Err.Number = 0 mit Resume. Und dann sprang er beim Debuggen in die Fehlerbehandlung - mit 0 (!). Jedenfalls lief es danach.



    Visual Basic-Quellcode

    1. Select Case Err.Number
    2. case 0
    3. Resume
    4. case else
    5. msgbox err.description
    6. end select




    Witzigerweise kommt normalerweise bei 0 "Resume ohne Fehler" als Fehler. In diesem Fall hatte es bei mir geklappt.
    lol, damit hat es nichts zu tun, bei resume next wird die "Fehler"anweisung ja übersprungen. Bei Resume eben noch mal versucht auszuführen. Aber hab mir mal deinen Code genauer angesehen. Du gehst bei deinem Makro davon aus, dass die Hilfsobjekte wie z.B. ActiveSheet korrekt sind. Sicherer ist, das tatsächliche Sheet zu setzen in deiner Schutzroutine. Vermutlich frisst er es beim Debuggen und sofort nach dem Speichern vom anderen Sheet ist gerade kein ActiveSheet verfügbar.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DoSchwob“ ()