lordasriel
Goto Top

Lesefehler 9

Mahlzeit,

als ein Kollege im Excel 2003 eine Tabelle speichern wollte, kam eine Fehlermeldung:


Microsoft Visual Basic

Laufzeitfehler '9':

Index außerhalb des gültigen Bereichs

Fortfahren Beenden Debuggen Hilfe



nun wollte ich mal wissen woran das liegen könnte und was ich dagegn machen kann? Ich hab schon mal probiert die Datei unter einem anderen Namen zu speichern da kam auch dieser Fehler Excel hat es dann aber trozdem gespeichert.

Vielen Dank für Antworten

MfG

PS: Das Betriebssystem ist Windows XP

Content-ID: 60518

Url: https://administrator.de/contentid/60518

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

LordAsriel
LordAsriel 04.06.2007 um 14:36:27 Uhr
Goto Top
Ich hab mir die Datei gerade noch mal ins Netzwerk gelegt und von meinem Rechner probiert da kommt genau der gleiche Fehler

MfG
bastla
bastla 04.06.2007 um 19:36:37 Uhr
Goto Top
Hallo HackerX!

Hört sich nach einer VBA-Fehlermeldung wie etwa beim versuchten Zugriff auf ein inzwischen umbenanntes Tabellenblatt durch ein Autostart-Makro an.

Schau mal mit Alt-F11 in den VBA-Editor und dort per Doppelklick auf "Diese Arbeitsmappe" (links oben unter "Projekt - VBAProjekt"), ob ein "Private Sub Workbook_Open()" existiert. Eine weitere Möglichkeit wäre ein "Sub auto_open()" in einem Modul.

Grüße
bastla
LordAsriel
LordAsriel 05.06.2007 um 07:56:04 Uhr
Goto Top
Guten morgen und Danke für die Antwort. Kann es sein das es auch durch diese Zeile hervorgerufen wird:


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)


weil Private Sub Workbook_Open() hab ich so jetzt nicht gesehen, aber die Zeile die ich oben eingefügt hab stand bei ThisWorkbook30 gleich ganz oben.

Was kann ich machen um den Laufzeitfehler wegzubekommen?

MfG
bastla
bastla 05.06.2007 um 08:20:58 Uhr
Goto Top
Hallo HackerX!

Wenn ich "speichern" von "öffnen" unterscheiden könnte, hätte ich Deine Frage oben gleich richtig interpretiert ... face-sad

Ja, der Fehler wird mit größter Wahrscheinlichkeit im von Dir angegebenen Sub zu finden sein, wobei es neben dem genannten Beispiel "nicht (mehr) existente Tabelle" noch mehrere Möglichkeiten für einen "Index außerhalb des gültigen Bereichs" gibt - am Besten, Du stellst einmal den Code herein.

Grüße
bastla
LordAsriel
LordAsriel 05.06.2007 um 09:09:41 Uhr
Goto Top
Hier ist der Quellcode von dem Sub:


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim SheetNow, ErsteLeereSp As Double, ErsteLeereZ As Double, LetzteLeereSp As Double, LetzteLeereZ As Double
Dim ZeileNow As Double, SpalteNow As Double, x As Double
Set ShKapa = ThisWorkbook.Worksheets("Kapa")
Set ShPPS = ThisWorkbook.Worksheets("PPS")
Set ShPara = ThisWorkbook.Worksheets("Parameter")
' Datenbereich wieder korrekt setzen
Application.ScreenUpdating = False
Application.EnableEvents = False
SpaltenBestimmen
SheetNow = ActiveSheet.Name
ZeileNow = ActiveCell.Row
SpalteNow = ActiveCell.Column
ShKapa.Select
arrTemp = ShKapa.Range("Datenbereich").CurrentRegion
ErsteLeereZ = UBound(arrTemp, 1) + ShKapa.Range("Datenbereich").Row
LetzteLeereZ = ShKapa.Cells.SpecialCells(xlLastCell).Row
ErsteLeereSp = UBound(arrTemp, 2) + 1
LetzteLeereSp = ShKapa.Cells.SpecialCells(xlLastCell).Column
If LetzteLeereZ > ErsteLeereZ Then ShKapa.Range(Rows(ErsteLeereZ), Rows(LetzteLeereZ)).Delete
If LetzteLeereSp > ErsteLeereSp Then ShKapa.Range(Columns(ErsteLeereSp), Columns(LetzteLeereSp)).Delete
Sheets(SheetNow).Activate
Sheets(SheetNow).Cells(ZeileNow, SpalteNow).Activate
Application.ScreenUpdating = True
Application.EnableEvents = True
For x = 2 To UBound(arrTemp, 1)
If arrTemp(x, Kunde) = "Kapa" Then
ActiveWorkbook.Names.Add Name:="OrgStart", RefersTo:="=KAPA!$A$" & _
x + ShKapa.Range("Datenbereich").Row - 1
Exit For
End If
Next x
arrTemp = ShPara.Range("LogListe").CurrentRegion
For x = 35 To 3 Step -1
arrTemp(x, 1) = arrTemp(x - 1, 1)
arrTemp(x, 2) = arrTemp(x - 1, 2)
Next x
arrTemp(2, 1) = UCase(getUserInitials)
arrTemp(2, 2) = Now()
ShPara.Range("LogListe").CurrentRegion = arrTemp

'Erweiterung Sicherungskonzept

Dim fs, afs, file, FDatum As String, Pfad As String, i As Integer
Pfad = ThisWorkbook.Path
ChDir Pfad
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists("Sicherungskopie von " & Replace(ThisWorkbook.Name, ".xls", "") & ".xlk") Then
Set file = fs.GetFile("Sicherungskopie von " & Replace(ThisWorkbook.Name, ".xls", "") & ".xlk")
FDatum = Format(file.DateLastModified, "YYYY_MM_DD_HH_MM_SS")
Name ("Sicherungskopie von " & Replace(ThisWorkbook.Name, ".xls", "") & ".xlk") As FDatum & "_" & UCase(getUserInitials) & "_" & ("Sicherungskopie von " & Replace(ThisWorkbook.Name, ".xls", "") & ".xlk")
End If

Set afs = Application.FileSearch
With afs
.LookIn = Pfad
.Filename = "*.xlk"
If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then
For i = 1 To .FoundFiles.Count - 13
file = fs.GetFileName(.FoundFiles(i))
' If Val(Left(file, 4)) < Year(Now()) _
' Or Val(Mid(file, 6, 2)) < Month(Now()) _
' Or Val(Mid(file, 9, 2)) < Day(Now()) Then
Kill file
' End If
Next i
End If
End With
End Sub


MfG
bastla
bastla 05.06.2007 um 09:46:00 Uhr
Goto Top
Hallo HackerX!

Was Du überprüfen könntest:
  • Gibt es die Tabellen mit den Namen "Kapa", "PPS" und "Parameter"?
  • In der Tabelle "Kapa" muss ein benannter Bereich "Datenbereich" existieren, in "Parameter" ein Bereich "LogListe".

Wenn die oben beschriebenen Bedingungen erfüllt sind, solltest Du (da auch noch ein nicht dargestelltes "Sub SpaltenBestimmen" aufgerufen sowie eine vorerst unbekannte Variable "Kunde" verwendet wird und auch die Struktur der Tabellen von Bedeutung ist) einfach einmal beim Auftauchen der Fehlermeldung "Debuggen" wählen - dann wird die Programmzeile angezeigt, in der der Fehler aufgetreten ist. Damit kann dann gezielter Ursachenforschung betrieben werden.

Grüße
bastla
LordAsriel
LordAsriel 05.06.2007 um 11:27:06 Uhr
Goto Top
Also ich hab gerade mal nachgeschaut die Tabellen gibt es und wenn ich nach dem speichern auf debuggen klicke bleibt der Debugger an folgender Stelle stehen (Fett):

arrTemp = ShPara.Range("LogListe").CurrentRegion
For x = 35 To 3 Step -1

arrTemp(x, 1) = arrTemp(x - 1, 1)

arrTemp(x, 2) = arrTemp(x - 1, 2)
Next x
arrTemp(2, 1) = UCase(getUserInitials)
arrTemp(2, 2) = Now()
ShPara.Range("LogListe").CurrentRegion = arrTemp

MfG
bastla
bastla 05.06.2007 um 11:34:15 Uhr
Goto Top
Hallo HackerX!

Das sieht so aus, als ob der Bereich "LogListe" nicht genug Zeilen umfassen würde (müssten mindestens 35 sein - Kontrolle über Menü "Einfügen / Namen / Definieren").

Grüße
bastla
LordAsriel
LordAsriel 05.06.2007 um 12:22:25 Uhr
Goto Top
LogListe bezieht sich bei mir auf eine Zelle in der einfach nur KZ steht. Kann es daran liegen das das nicht geht?

MfG und Danke noch mal
bastla
bastla 05.06.2007 um 12:45:45 Uhr
Goto Top
Hallo HackerX!

Eine Zeile ist zu wenig. Ich kann Dir zum Programmteil
arrTemp = ShPara.Range("LogListe").CurrentRegion  
For x = 35 To 3 Step -1
arrTemp(x, 1) = arrTemp(x - 1, 1)
arrTemp(x, 2) = arrTemp(x - 1, 2)
Next x
arrTemp(2, 1) = UCase(getUserInitials)
arrTemp(2, 2) = Now()
ShPara.Range("LogListe").CurrentRegion = arrTemp  
noch eine kurze Beschreibung liefern, aber vermutlich dann auch nicht mehr beitragen ...

Zweck des Codes oben ist es, die Daten ab der zweiten Zeile der "Logliste" nach unten zu verschieben (wobei der älteste Eintrag in der 35. Zeile entfernt wird), damit in der zweiten Zeile eine Userkennung und der Speicherzeitpunkt (Datum und Uhrzeit) in 2 Spalten nebeneinander eingetragen werden können - im Normallfall sollten also (vermutlich unter einer Überschrift in der ersten Zeile) 34 Datensätze zur Dokumentation des Speicherns zu finden sein.

Grüße
bastla
LordAsriel
LordAsriel 05.06.2007 um 13:28:43 Uhr
Goto Top
Danke für die Hilfe ich werd mal sehen ob es mir weiter hilft aber jetzt hab ich wenigstens einen Ansatz.

MfG
bastla
bastla 05.06.2007 um 19:16:10 Uhr
Goto Top
Hallo HackerX!

Noch eine Berichtigung als Nachtrag: Der Bereich "LogListe" selbst muss nicht zumindest 35 Zeilen umfassen (sondern kann sehr wohl nur aus einer einzelnen Zelle bestehen), aber er muss zu einem zusammenhängenden Zellbereich mit mindestens 35 Zeilen gehören.

Grüße
bastla