Sub Workbook_Open() + Fehler: Index außerhalb des gültigen Bereichs

  • Excel

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

    Sub Workbook_Open() + Fehler: Index außerhalb des gültigen Bereichs

    Hallo Jungs,

    habe ein kleines Problemchen.
    Folgendes Makro habe ich in ein eigenes Modul gesteckt:


    Visual Basic-Quellcode

    1. Sub Bestellschein()
    2. ChDir "C:\" Const Datei = "C:\Bestellschein.xls" Const Datei2 = "C:\Bestellschein_Entwurf.xls"
    3. Workbooks.Open Filename:="C:\Bestellschein.xls"
    4. 'Saubere Bildschirmanzeige bei Makro-Lauf starten
    5. Application.ScreenUpdating = False
    6. Kundennummer = Worksheets("Bestellschein").Range("A2").Value Kundenname = Worksheets("Bestellschein").Range("B2").Value
    7. Windows("Bestellschein_Entwurf.xls").Activate Range("B3:B5").ClearContents
    8. Range("B3").Value = Kundennummer Range("B5").Value = Kundenname
    9. '--------------------------------------------------------------------------------- ' '--------------------------------------------------------------------------------- 'Auf A1 positionieren und letzte Zeile für Leseschleife ermitteln 'Zeile positionieren
    10. Windows("Bestellschein.xls").Activate Range("A1").Select
    11. maxZeilen = Selection.SpecialCells(xlCellTypeLastCell).Row
    12. eintragszeile = 19 'Leseschleife Blatt Bestellschein
    13. schreibzeile = 15 Windows("Bestellschein_Entwurf.xls").Activate Range("A14:G" & maxZeilen).ClearContents Range("A14:G" & maxZeilen).Font.ColorIndex = 1
    14. Windows("Bestellschein.xls").Activate
    15. For zeile = 2 To maxZeilen
    16. Windows("Bestellschein.xls").Activate Artikelnummer = Cells(zeile, 4).Value Teilenummer = Cells(zeile, 5).Value Bezeichnung = Cells(zeile, 6).Value Volumen = Cells(zeile, 7).Value Preis = Cells(zeile, 8).Value Waehrung = Cells(zeile, 10).Value
    17. 'Schreibschleife Blatt Bestellschein_Entwurf
    18. Windows("Bestellschein_Entwurf.xls").Activate
    19. If Volumen = "0" Then Volumen = "" End If
    20. Cells(schreibzeile, 1).Value = Artikelnummer Cells(schreibzeile, 2).Value = Teilenummer Cells(schreibzeile, 3).Value = Bezeichnung Cells(schreibzeile, 4).Value = Volumen Cells(schreibzeile, 5).Value = Preis Cells(schreibzeile, 6).Value = Waehrung
    21. If Cells(schreibzeile - 1, 1).Value = Artikelnummer Then Cells(schreibzeile, 1).Font.ColorIndex = 2 Cells(schreibzeile, 6).Font.ColorIndex = 2 End If If Cells(schreibzeile - 1, 2).Value = Teilenummer Then Cells(schreibzeile, 2).Font.ColorIndex = 2 End If
    22. If Cells(schreibzeile - 1, 5).Value = Preis Then Cells(schreibzeile, 5).Font.ColorIndex = 2 End If '
    23. schreibzeile = schreibzeile + 1 Next zeile
    24. End Sub



    Das Makro läuft auch einwandfrei durch.

    Wenn ich dieses Makro in das Tabellenblatt packe und dies in die Workbook_Open() packe, dann bekomme ich den Laufzeitfehler 9 "Index ausserhabl des gültigen Bereichs".

    Dazu markiert er mir dann die Zeile mit der Kundennummer am Anfang: Kundennummer = Worksheets("Bestellschein").Range("A2").Value

    Visual Basic-Quellcode

    1. ChDir "C:\" Const Datei = "C:\Bestellschein.xls" Const Datei2 = "C:\Bestellschein_Entwurf.xls"
    2. Workbooks.Open Filename:="C:\Bestellschein.xls"
    3. 'Saubere Bildschirmanzeige bei Makro-Lauf starten Application.ScreenUpdating = False
    4. Kundennummer = Worksheets("Bestellschein").Range("A2").Value Kundenname = Worksheets("Bestellschein").Range("B2").Value
    5. Windows("Bestellschein_Entwurf.xls").Activate Range("B3:B5").ClearContents Range("B3").Value = Kundennummer Range("B5").Value = Kundenname



    Weiß jemand Rat?
    Gruß

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „chimperator“ ()

    Du musst der Engine schon sagen, wenn du plötzlich in einem anderen Workbook arbeiten möchtest.
    Default für alle Objektverweise ist nun mal ThisWorkbook.

    Visual Basic-Quellcode

    1. Set MyBook = Workbooks.Open (Filename:="C:\Bestellschein.xls")
    2. Kundennummer = MyBook.Worksheets("Bestellschein").Range("A2").Value
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Hi,

    danke erst einmal für die Antworten, diese haben mich ein kleines Stück näher gebracht.

    Wenn ich jetzt wieder in das andere Workbook springen möchte, dann mache ich das mit folgendem Code:

    Visual Basic-Quellcode

    1. Windows("Bestellschein_Entwurf.xls").Activate



    So, nun das Problem:
    Wenn ich wieder in das erste Workbook springen möchte mache ich das ebenfalls mit diesem Befehl:

    Visual Basic-Quellcode

    1. Windows("Bestellschein.xls").Activate



    Das funktioniert aber wiederum nicht.
    Es erscheint wieder der Laufzeitfehler "9". Index außerhalb des gültigen Bereichs.

    Noch jemand einen kleinen Tipp für mich? ;)

    Gruß
    Das Workbook, in dem der Code läuft, kannst du mit ThisWorkbook adressieren.

    Ein Activate, insbesonders ein Windows.Activate hat in einem Code nichts verloren.
    Ebensowenig wie ein Select.
    Arbeite mit Objekten, dann kann dir völlig egal sein, welches Objekt Excel (oder der User) gerade als aktiv oder ausgewählt betrachtet.
    Und du kannst zwischen den Objekten springen, ohne die Fenster umschalten zu müssen.

    Beispiel:

    Visual Basic-Quellcode

    1. Set wb1 = ThisWorkbook
    2. Set ws1 = wb1.Sheets("Quelle")
    3. Set wb2 = Workbooks.Open ("Ziel.xlsx")
    4. Set ws2 = wb2.Sheets("Ziel")
    5. ws2.Range("A1").Formula = ws1.Range("A1").Value
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --