Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
804to808
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
804to808
804to808
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

globale Variable nicht global

globale Variable nicht global
25.09.2006 11:33:45
Oberschlumpf
Hallo Leute
Weiß jemand, woran es liegen kann, dass eine im allg. Modul mit Public als global deklarierte Variable (eindimensionales Array) auf einmal während der Laufzeit keine Gültigkeit mehr besitzt?
Ich arbeite schon seit ca. 1 Woche an einer Datei, in der eben diese eine globale Variable immer einwandfrei ihren Dienst tat.
Nun, seit vor ca. 1 Std. steigt das Programm an der Stelle aus, an der auf die Werte in der Variablen zugegriffen werden soll, weil die Variable noch nicht mal mehr dimensioniert ist.
Warum das?
An keiner Stelle im Code wird die Variable gelöscht.
Hier sind die Subs, in der die Variable pstrAlleTabellen() verwendet wird:

Public piBlattDel As Integer, pstrBlattDel As String, pstrAlleTabellen() As String
Sub SheetRowsDel()
Dim liSuche As Integer, liIndex As Integer, lboNoDel As Boolean
Application.EnableEvents = False
Do Until pstrAlleTabellen(liIndex) = ""
For liSuche = 1 To ThisWorkbook.Sheets.Count
If pstrAlleTabellen(liIndex) = ThisWorkbook.Sheets(liSuche).Name Then
lboNoDel = True
Exit For
End If
Next
If lboNoDel = True Then
lboNoDel = False
Else
Call DelRows(pstrAlleTabellen(liIndex))
End If
liIndex = liIndex + 1
Loop
Application.EnableEvents = True
End Sub
Sub SheetsCollect()
Dim liSuche As Integer
ReDim pstrAlleTabellen(ThisWorkbook.Sheets.Count)
For liSuche = 0 To ThisWorkbook.Sheets.Count - 1
pstrAlleTabellen(liSuche) = ThisWorkbook.Sheets(liSuche + 1).Name
Next
End Sub

Vielen Dank für eure Antworten, Ideen, etc.
Ciao
Thorsten

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
etwas vergessen
25.09.2006 11:42:22
Oberschlumpf
der Fehler tritt im Sub SheetRowsDel() in der Zeile "Do ..." auf
Fehlermeldung : Laufzeitfehler 9 - außerhalb des gültigen Bereichs
Ciao
Thorsten
AW: etwas vergessen
25.09.2006 11:52:10
Heiko
Hallo Thorsten,
ist denn bei deinem Programm garantiert das IMMER SheetsCollect() vor SheetRowsDel() abläuft, da sonst deine String Array ja nicht dimensiert ist ?!
Gruß Heiko
PS: Rückmeldung wäre nett !
AW: etwas vergessen
25.09.2006 12:16:02
Oberschlumpf
Hallo Heiko
Ja, die Sub SheetsCollect() wird direkt nach dem Öffnen der Datei aufgerufen.
Dann wird die Sub auch nach dem Hinzufügen eines neuen Sheets aufgerufen, da sich ja Sheets.Count ändert.
Ich kann allerdings die Sub NICHT direkt vor dem Aufruf von SheetRowsDel() aufrufen, da beim Aufruf der 2. Sub schon ein Sheet gelöscht ist - bisher funktionierte ja auch ca. 1 Woche immer alles. Ich verstehe das nicht.
Hast du oder jemand anderes vielleicht weitere Ideen?
Ciao
Thorsten
Anzeige
AW: globale Variable nicht global
25.09.2006 12:19:37
Mag
Hi,
nach der Fehlermeldung mit Mauszeiger auf Variable 'liIndex' zeigen. Welchen Wert hat die Integer-Variable?!
Gruss
AW: globale Variable nicht global
25.09.2006 14:25:19
Oberschlumpf
Hi
liIndex hat den Wert 0.
Soll auch so sein, da pstrAlleTabellen(0) das erste zurückgegebene Sheet enthält.
Noch ne Idee?
Ciao
AW: globale Variable nicht global
25.09.2006 12:49:57
Luschi
Hallo Thorsten,
in der 1. Prozedur läuft "liSuche" von 1 bis "Anzahl Sheets"; in der unteren von
0 bis "Anzahl Sheets" -1.
Die untere prozedur läuft richtig, da ein Array mit dem Index 0 beginnt, die 1. Tabelee den Index 1 hat.
Deshalb kommt es in der oberen Prozedur zu einem Index-Fehler; schreibe deshalb:
For liSuche = 0 To ThisWorkbook.Sheets.Count-1
Gruß von Luschi
aus klein-Paris
Anzeige
AW: globale Variable nicht global
25.09.2006 14:44:07
Oberschlumpf
Hallo Luschi
Boahh! Hab ich gedacht. Liegt es tatsächlich daran, dass die eine Schleife mit 1 beginnt? (ich selbst hatte die 1 noch gar nich gesehn - thx for info!)
Aber leider war es das auch nicht.
Ich versuch mal zu erklären, was ich bisher zur Fehlersuche getan hab.
1. Habe Stop-Befehl im Open-Ereignis gesetzt
2. Nach Speichern, Schließen und wieder Öffnen Stop direkt nach Private Sub...
3. Im Debugger-Mode Schritt für Schritt den Code abgearbeitet, bis alle Startparameter gesetzt waren, und in der Datei gearbeitet werden kann
Hier wurde die

Sub SheetsCollect() das erste mal aufgerufen
Nach Durchführung der 

Sub hab ich vor End 

Sub den Befehl
MsgBox pstrAlleTabellen(0)
gesetzt.
Ergebnis = Anzeige von erstem Sheet-Namen - die Variable wird also gefüllt
4. Vor Klick auf "New Sheet"-Button in Tabelle hab ich für den Button Stop-Marke gesetzt
5. Nach Klick auf den Button wieder im Debug-Modus Schritt für Schritt alle Befehle abgearbeitet.
Nach jedem Aufruf einer 

Sub (stehen alle in Klick-Ereignis vom Button) hab ich wieder den Befehl
MsgBox pstrAlleTabellen(0)
gesetzt.
Ergebnis immer = erster Sheet-Name - funktioniert also immer noch
6. Dann war "New Sheet" irgendwann erfolgreich fertig, und ich war wieder in der Tabelle
7. Nun rechter Mausklick auf neuen Sheetnamen und "Löschen" ausgewählt.
Hier wird nun die 

Sub SheetRowsDel() aufgerufen, die ich auch wieder mit Stop markierte.
Und nach Stop wieder Schritt für Schritt...
Schon die Befehlszeile
Do Until pstrAlleTabellen(liIndex) = ""
unterbricht den Code mit Laufzeitfehler 9 - Index außerhalb des gültigen Bereichs
Tja...bis hier bin ich bisher gekommen - und ich weiß nicht, wie es weitergeht.
1 Woche ging alles gut. Ich weiß nicht, was für Änderungen ich bis hier vor nahm, die nun diesen Fehler verursacht.
Wer von euch kann mir helfen?
Ciao & Danke
Thorsten

Anzeige
AW: globale Variable nicht global
25.09.2006 15:06:41
Heiko
Hallo Thorsten,
ladt mal eine auf wesentliche abgespeckte Beipsieltabelle hoch, das wird mir sonst zu kompliziert alles nachzubauen !!!
Gruß Heiko
AW: globale Variable nicht global
25.09.2006 15:59:08
Oberschlumpf
Hallo Heiko
Leider ist ein "abspecken" der Datei nicht so ohne Weiteres möglich, da viele Makros ineinander übergreifen.
https://www.herber.de/bbs/user/36999.zip
Vielleicht hast du oder jemand anderes ja doch Lust & Zeit, dass ihr euch das ansehen könnt.
Danke & Ciao
Thorsten
hmm..wieder was vergessen
25.09.2006 17:32:04
Oberschlumpf
das Sheet "Project-Sheet" soll/muss löschbar sein - und alle mit "new sheet"-Button erstellten Sheets
Anzeige
AW: hmm..wieder was vergessen
25.09.2006 20:53:53
Heikoe
Hallo Thorsten,
Hab mir das mal angeschaut, das einzige was mir beim durchschauen aufgefallen ist, ist der Umstand das wenn du eine Blatt "Löschen" über den Tabellenreiter löscht und dann die SheetRowsDel() aufrufst, das dann in der pstrAlleTabellen(...) ein Tabelle mehr enthalten ist als in Sheets.count da du ja beim löschen (also SheetsDeactivate) die SheetsCollect nicht aufrufst.
Mehr könnte ich dir sagen wenn du wirklich mal ne Tabelle machst die auf das wesentliche abgespeckt ist, ohne alles was damit nichts zu tun hat. Vor allem ohne die ganzen Codes in diese Arbeitsmappe, denn ich öffne grundsätzlich keine Makros die mir an meinen Symbolleisten rumbiegen. Das Problem muss sich doch auch mit weniger Code und Tabellen zeigen lassen, oder ?!
Gruß und viel Spaß beim weiter grübeln,
Heiko
Anzeige
AW: hmm..wieder was vergessen
25.09.2006 22:38:38
Oberschlumpf
Hallo Heiko
Vielen Dank auf jeden Fall für de Mühe, die du gemacht hast.
Ich hatte versucht, einiges an Code zu löschen, hatte dabei aber a) festgestellt, dass eben viele Subs sich mehr oder weniger gegenseitig aufrufen (was ja so auch gewünscht ist) und b) dass beim Löschen von Code ja nicht unbedingt mehr das "Umfeld" da ist, als wenn der gabze Code noch da ist.
In einem Punkt allerdings muss ich dir Recht geben. Die Sub, in der das Problem mit dem Array auftritt, ruft noch eine Sub auf, in der dann erst die Zeilen gelöscht werden - was ja eigtl auch schon in der Fehler-Sub passieren könnte.
Nun denn...wir VBAler sind ja hin und wieder auch nur fehlerproduzierende Maschinen..ähh...Menschen! :-)))
Das Ausschalten einiger Menübefehle, z Bsp Löschen von Zellen/Zeilen/Spalten, muss leider sein, weil diese Datei von mehreren Leuten benutzt wird.
Und hin und wieder denkt der Eine oder die Andere sich an dieser Datei mal als "Tabellen-Designer" :-) betätigen zu müssen, was nicht selten zur Folge hat, dass sich das ursprüngliche Design der Datei verändert (z Bsp mehr oder weniger Zellen/Zeilen/Spalten), und somit der VBA-Code Fehlerwerte berechnet und diese dann eben auch nicht mehr in die richtigen Zellen schreibt - du verstehst? :-)
Und wenn nun meine neueste Version dieser Datei endlich funktioniert, dann is für die Anderen nix mehr zu tun als "Tabellen-Designer" :-)
Nichts desto trotz hatte ich mich noch mal ca. 30 Minuten erfolglos an dem Problem mit der Variablen versucht, und hab es nun endlich doch gelöst - auf einem anderen Weg :-)
Und zwar so:

Sub ZeileDel()
Dim liZeileHL As Integer, liZeileWS As Integer, lboGefunden As Boolean
Application.EnableEvents = False
ProtectNo
With Sheets("Summary NCEs + LCM")
For liZeileHL = 3 To .Cells(Rows.Count, 26).End(xlUp).Row
lboGefunden = True
For liZeileWS = 3 To Sheets.Count
If .Range("A" & liZeileHL).Hyperlinks(1).Name <> Sheets(liZeileWS).Name Then
lboGefunden = False
Else
lboGefunden = True
Exit For
End If
Next
If lboGefunden = False Then
.Rows(liZeileHL & ":" & liZeileHL).Delete Shift:=xlUp
Exit For
End If
Next
End With
With Sheets("PTS")
For liZeileHL = 3 To .Cells(Rows.Count, 26).End(xlUp).Row
lboGefunden = True
For liZeileWS = 3 To Sheets.Count
If .Range("B" & liZeileHL).Hyperlinks(1).Name <> Sheets(liZeileWS).Name Then
lboGefunden = False
Else
lboGefunden = True
Exit For
End If
Next
If lboGefunden = False Then
.Rows(liZeileHL & ":" & liZeileHL).Delete Shift:=xlUp
If .Cells(Rows.Count, 26).End(xlUp).Row > 3 And .Cells(Rows.Count, 26).End(xlUp).Row < 14 Then
.Rows(.Cells(Rows.Count, 26).End(xlUp).Row + 1 & ":" & .Cells(Rows.Count, 26).End(xlUp).Row + 1).Insert Shift:=xlDown
.Rows(.Cells(Rows.Count, 26).End(xlUp).Row + 1 & ":" & .Cells(Rows.Count, 26).End(xlUp).Row + 1).Interior.ColorIndex = xlNone
Else
If .Cells(Rows.Count, 26).End(xlUp).Row <= 3 Then
.Rows("4:4").Insert Shift:=xlDown
.Rows("4:4").Interior.ColorIndex = xlNone
End If
End If
Exit For
End If
Next
End With
ProtectYes
Application.EnableEvents = True
End Sub

Hier wird nur noch eine Sub und nicht wie vorher 3 Subs benötigt (da hatte ich echt viel zu viel geschrieben..hmm)
Auch ein Array brauche ich nicht mehr.
Ich vergleiche nach demm Löschen eines Sheets die noch vorhandenen mit den ebenso vorhandenen Hyperlink-Adressen, die zu den Sheets verweisen.
Und wenn ich DEN Hyperlink finde, der auf ein nicht vorhandes Sheet verweist, so hab ich auch DIE Zeile gefunden, die gelöscht werden muss.
...und alles wird guuuuuut :-)....
Ciao
Thorsten
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige