| |
| Xometry ermöglicht JTW Astronomy die Herstellung hochwertiger Trident Teleskophalterungen, ein Anwenderbericht
|
Autor
|
Thema: Error Goto funktioniert nicht mehr (1612 mal gelesen)
|
giman Mitglied Konstrukteur, Rohrleitungsbau und Rentner
Beiträge: 217 Registriert: 19.06.2005 Windows ; MS-Office ; MC 2004 2D und MC 2013 2D
|
erstellt am: 16. Mrz. 2008 19:41 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich hatte mal ein Makro erstellt, das habe ich auf mehreren Computern installiert. Auf meinem Laptop (Office 2000) gibt es aber immer an der selben Stelle folgende Fehlermeldung: Laufzeitfehler '9' - Index außerhalb des gültigen Bereichs. Programmstelle: On Error Goto Datei_oeffnen 'bei Error gehe zu Zeile "Datei_oeffnen" Workbooks(sFil).Aktivate 'Datei aktivieren (wenn sie geöffnet ist) 'wenn nicht, dann über "Error Goto" Goto Datei_ist_offen An der Stelle "Workbooks(sFil).Aktivate" kommt jetzt die Fehlermeldung. Wie gesagt, auf den anderen Computern läuft das Makro durch. Kennt jemand einen Tip, was ich ändern sollte. Ich vermute eine mir nicht bekannte Einstellung in Excel, die das Problem verursacht. Die ähnliche Version mit "Close #1" kann ich nicht nehmen, weil ich mehrere offene Dateien habe. (#1 ist die erste geöffnete Datei. Ich weiß aber nicht die wievielte Datei es ist) Gruß giman
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 16. Mrz. 2008 20:03 <-- editieren / zitieren --> Unities abgeben: Nur für giman
|
giman Mitglied Konstrukteur, Rohrleitungsbau und Rentner
Beiträge: 217 Registriert: 19.06.2005
|
erstellt am: 16. Mrz. 2008 21:39 <-- editieren / zitieren --> Unities abgeben:
Hallo Paulchen richtig, das ist ein Tippfehler. Wie gesagt, das Makro funktioniert auf zwei andere Computer. Übrigens die Variante von Harmening, mit Close #1 hab ich auch ausprobiert. Solange wie die Datei geschlossen ist läuft es durch. Wenn die Datei aber bereits offen ist, gibt es in der Zeile Open Dateiname For Random Access Read Lock Read Write As #1 die Fehlermeldung Nummer 60 und das Makro hält an. Bei mir scheint irgend etwas mit dem Excel nicht zu funktionieren, aber was? Schönen Aben noch, bis morgen Gruß giman
[Diese Nachricht wurde von giman am 16. Mrz. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 16. Mrz. 2008 23:59 <-- editieren / zitieren --> Unities abgeben: Nur für giman
|
Nepumuk Mitglied Entwicklungsleiter
Beiträge: 351 Registriert: 16.10.2004
|
erstellt am: 17. Mrz. 2008 00:32 <-- editieren / zitieren --> Unities abgeben: Nur für giman
Hallo giman, VBA-Editor - Menüleiste - Extras - Optionen - Register-Allgemein - Unterbrechen bei Fehlern - Option-Bei nicht verarbeiteten Fehlern. Besser ist aber die Option "In Klassenmodul". Denn dann bleibt der Debugger in der Klasse stehen und nicht im Aufruf der Klasse. ------------------ Gruß Nepumuk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
giman Mitglied Konstrukteur, Rohrleitungsbau und Rentner
Beiträge: 217 Registriert: 19.06.2005 Windows ; MS-Office ; MC 2004 2D und MC 2013 2D
|
erstellt am: 17. Mrz. 2008 09:24 <-- editieren / zitieren --> Unities abgeben:
Danke Nepumuk so etwas in der Art habe ich vermutet, daß irgend wo etwas verstellt werden muß. Das war bestimmt der richtige Hinweis. Jetzt bin ich an dem Computer, auf dem das Makro von Anfang an läuft und hier ist die Einstellung "Unterbrechen bei Fehlern" auf "Bei nicht verarbeiteten Fehlern" eingestellt. Jedenfalls nicht ganz oben wie auf meinem Laptop. Besten Dank. Diese Einstellung werde ich heute Abend gleich verändern. Achso, noch eins. Diese Variante, der Prüfung ob eine Datei offen ist, hatte ich mir aus einem Visual-Basic-Anleitungsbuch abgeguckt. Wenn ich keine andere Lösung parat habe nehme ich die, die zum Ziel führt. Gruß giman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 17. Mrz. 2008 09:35 <-- editieren / zitieren --> Unities abgeben: Nur für giman
Moin, Zitat: Wenn ich keine andere Lösung parat habe...
Anpassungsfähiger Vorschlag ( ohne GoTo...;) ) Code: Private Function checkOpen(ByVal strOpen As String) As Boolean'Prüft, ob wb namens strOpen bereits geöffnet; True, falls geöffnet Dim wbAll As Workbook checkOpen = False 'vorbelegen, falls alles i.O. For Each wbAll In Application.Workbooks If wbAll.FullName = strOpen Then checkOpen = True Exit Function End If Next wbAll Set wbAll = Nothing End Function
Frederik------------------ DIN1055.de | Lastannahmen für Anwender Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
giman Mitglied Konstrukteur, Rohrleitungsbau und Rentner
Beiträge: 217 Registriert: 19.06.2005
|
erstellt am: 17. Mrz. 2008 20:13 <-- editieren / zitieren --> Unities abgeben:
@ Nepumuk Das war es gewesen. Ich habe die Einstellung auf meinem Laptop wie auf dem Arbeitscomputer vorgenommen. Jetzt funktionieren beide Varianten, also auch die von Harmening. Besten Dank noch einmal. @ Frederik Deine Variante muß ich ebenfalls ausprobieren. Die hier verwendeten Elemente hatte ich bisher nicht genutzt (da mir nicht bekannt). Das Beispiel sieht sehr interessant aus. Allerdings versuche ich bei Visual Basic in der Regel Schleifen zu vermeiden, weil damit merkliche Geschwindigkeitsverluste auftreten können. Ein Tropfen kommt zum anderen und Visual Basic ist nun mal nicht so schnell. Aber was interessant ist probiere ich gern. Vielen Dank für den Vorschlag. Gruß giman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nepumuk Mitglied Entwicklungsleiter
Beiträge: 351 Registriert: 16.10.2004
|
erstellt am: 18. Mrz. 2008 09:29 <-- editieren / zitieren --> Unities abgeben: Nur für giman
Hallo giman, die Schleife geht über alle geöffneten Mappen. Wie viele können das denn sein 2, 3 oder 4? Das dauert maximal 0,01 Sekunde, ist aber sauber programmiert. Was du dir sparen kannst ist die Vorbelegung der Funktionsvariablen, die ist sowieso False, denn das ist der default - Wert einer boolschen Variablen bei deren Initialisierung. ------------------ Gruß Nepumuk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 18. Mrz. 2008 09:39 <-- editieren / zitieren --> Unities abgeben: Nur für giman
Hallo giman, Zitat: Allerdings versuche ich bei Visual Basic in der Regel Schleifen zu vermeiden, weil damit merkliche Geschwindigkeitsverluste auftreten können.
Hm - dem kann ich nur begrenzt zustimmen. Richtig ist, dass Schleifen dauern können. Das sehe ich hier allerdings nicht als Problem - es werden alle in dieser Instanz geöffneten Mappen durchlaufen. Wie viele können das realistisch werden? Ich behaupte mal, ab zehn Stück wird's eher für Dich als User denn für VBA unübersichtlich. Insofern ist diese Schleife echt fix durch. Vor lauter Tipperei war Nepumuk schneller...Vorteil von Schleifen: Sie sind (menschlich) übersichtlicher als wildes Goto-Gespringe (Spaghetti-Code). @Nepumuk: Danke für den Tipp mit Default! Wieder 'ne Zeile gespart . Frederik ------------------ DIN1055.de | Lastannahmen für Anwender Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
giman Mitglied Konstrukteur, Rohrleitungsbau und Rentner
Beiträge: 217 Registriert: 19.06.2005
|
erstellt am: 18. Mrz. 2008 21:51 <-- editieren / zitieren --> Unities abgeben:
Hallo, hab leider nur nach dem Feierabend etwas Zeit hier reinzuschauen. Schönen Dank für die Tipps. Ich hab das Programm durchgekaut (kennengelernt) und es funktioniert prima. In diesem Fall habt Ihr vollkommen Recht, das eine Schleife die bessere Variante ist denn a) es sind in der Regel nur wenige Dateien, die offen sein können. b) dieses Programmteil läuft nur in der Startroutine. c) (gibt es bestimmt auch als Argument, wie sauber und so). Das Problem mit Schleifen hatte ich mal in einem Makro, wo eine Programmschleife (Suchroutine) in einer anderen Schleife immer länger wurde, je länger die von dem Programm erstellte Tabelle in der Datei wuchs. Ich mußte mir damals eine andere Lösung einfallen lassen, denn das Programm war damals nach der Mittagspause noch nicht fertig. Mit der neuen Lösung - gezielte Sprünge auf benannte Zellen war das Programm dann ruckizucki fertig. Wenn man seine Routinen klein hält, bleiben Sprünge auch übersichtlich. Dannn gibt es keine Spaghettis. Gut, es hat alles geklappt, ich hab eine Menge dazu gelernt, Unitis hab ich gestern schon verteilt und werd ich bei Gelegenheit auch weiter tun. Ich bedanke mich bei Euch für Eure Hilfe. Gruß giman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |