Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

makroabbruch mit "beenden" button abfangen möglich?

229 views
Skip to first unread message

michlchen

unread,
Nov 23, 2009, 12:01:12 PM11/23/09
to
hallo ng.

ich habe eine recht komplexe datei, die komplett passwortgeschützt
ist. mittlerweile sollte sie auch nirgendwo mehr hängen bleiben.
(steuerung über buttons und freigegeben felder)

ich möchte aber dennoch den fall abfangen, dass das makro mal nicht
weiter kommt. (debugg ist nicht möglich, da der vba code geschützt
ist.) der user kann also nur mit beenden das makro stoppen. dann kann
es sein, dass ein tabellenblatt nicht passwortgeschützt ist, weil ich
während des makrolaufs den schutz teilweise aufhebe.

kann ich dieses abbrechen mit dem beenden button irgendwo abfangen und
meinetwegen noch sagen aktiviere blatt "abc" und lass alle andern
verschwinden? wenn ja, wie und wo mach ich das?

thx.

ps: ansonsten muss ich mit dem fehler leben. ne routine um zum anfang
zurück zu kommen hab ich schon, aber das aktuelle blatt mit passwort
schützen wär schon noch gut.

Andreas Killer

unread,
Nov 23, 2009, 1:21:41 PM11/23/09
to
michlchen schrieb:

> ich m�chte aber dennoch den fall abfangen, dass das makro mal nicht
> weiter kommt. (debugg ist nicht m�glich, da der vba code gesch�tzt
Du solltest *immer* den Fall abfangen, ohne Ausnahme, Fehlerbehandlung
ist essentiell!

Hier ist ein gutes Tutorial dazu:

http://www.online-excel.de/excel/singsel_vba.php?f=144

Andreas.

michlchen

unread,
Nov 25, 2009, 7:47:23 AM11/25/09
to
danke für den hinweis und vor allem das tutorial.

was empfiehlt sich denn in meinem fall alles abzusichern?
ich habe ein tool aufgesetzt, um für mehrere lager parameter verwalten
zu können. die hauptdatei mit den makros ruft dabei andere dateien auf
(lager1,lager2), läd die daten auf ein extra blatt in der makrodatei
und speichert am ende die geänderten daten wieder in die externe datei
lagerx. beim laden werden mit der gültigkeit vorgaben gemacht (bspw. 5
stellig oder nur zahlen) und vor dem speichern wird abgefragt, ob
bestimmte felder vorhanden sind. aus den daten werden dann auf wunsch
textdateien gemacht, die dann mit 100 % gültigen werten an die db
übergeben werden sollen. berechnungen (so dass z.b. "div by 0" nicht
auftreten kann) erfolgen nicht.


die makro datei ist dabei komplett passwortgeschützt und wird nur
während des makrolaufs entsperrt. (datei und blätter - steuerung
erfolgt über buttons) demnach sollte der fall, blatt existiert nicht,
niemals vorkommen, weil der user es nicht löschen kann. gleiches bei
den lagerx.xls dateien. (ausser er kennt das vba und blattpasswort,
wovon ich jetzt aber mal nicht ausgehe.)

wenn ich eine datei öffne (lager1) frage ich vorher ab, ob sie
existiert. wenn nicht wird der sub beendet.

existiert die datei, dann kopiere ich wie gesagt die felder auf blatt
"tmp" und setze die bedingungen. nachdem der user seine eingaben
gemacht hat nochmal vollständigkeitabfrage und werte zurückkopieren.

wenn ein nutzer etwas nicht darf (hab ne user_role mit eingebaut),
werden ihm entsprechend fehlermeldungen angezeigt ("you are not
allowed....") und auf das gewollte blatt zurück gesetzt.


aber was sind jetzt sachen, die nur innerhalb von vba auftreten
können? (ich kenne blatt markieren und es existiert nicht, division
durch 0, falsche datentypen - sollte aber nicht auftreten, ...)

danke für die hinweise.

Andreas Killer

unread,
Nov 25, 2009, 10:05:25 AM11/25/09
to
michlchen schrieb:

> was empfiehlt sich denn in meinem fall alles abzusichern?

Alles, keine Ausnahme.

Ich wei� nicht wie Deine VBA-Struktur aufgebaut ist, aber zumindest
das Hauptmakro (das dann die Sub-Makros aufruft) sollte einen globalen
Errorhandler haben.

Andreas.

Sub Main()
On Error GoTo Errorhandler
Teilen 3
Errorhandler:
MsgBox Err.Number & ": " & Err.Description
End Sub

Sub Teilen(I As Integer)
MsgBox "1 / " & I & " = " & 1 / Minus(I)
Teilen I
End Sub

Function Minus(I As Integer) As Integer
I = I - 1
Minus = I
End Function

michlchen

unread,
Nov 25, 2009, 10:37:32 AM11/25/09
to
> Alles, keine Ausnahme.

das heißt, ich sicher erstmal alles ab und wenn nichts auftaucht, dann
umso besser... ok.

habe jetzt mit drin, dass er zurück auf anfang soll, wenn die datei
oder das tabellenblatt in der datei nicht existiert.

zum aufbau meiner makros. ich habe eigentlich ziemlich viele kleine
makros nach dem motto buttonklick, dann daten auf blatt tmp kopieren
und ursprungsblatt ausblenden. oder daten zurück in datei und blatt
tmp ausblenden.

werde mir jetzt noch den eingeloggten user und die fehlermeldung auf
mein log sheet einbauen und dann sollte es halbwegs funktionieren. mal
sehen, was beim testen so an schönen fehlermeldungen raus kommen.

nochmal thx.

michlchen

unread,
Jan 14, 2010, 7:38:51 AM1/14/10
to
hallo.

bei dem errorhandler.

kann ich da irgendwie herausbekommen, welcher befehl den fehler
verursacht hat? also wenn ich bspw. ein blatt makieren möchte und das
gibt es nicht (sollte bei mir nicht vorkommen, da alles
passwortgeschützt ist, aber nehmen wir es mal als einfaches beispiel.)

dann hab ich sheets("abc").select
hier würde ja ohne errorhandling ein debug erscheinen. die umgehen wir
ja, da wir das errorhandling eingebaut haben.

jetzt hätte ich im errorhandler gerne drin, dass beim ausführen des
befehls "sheets("abc").select" ein fehler aufgetreten ist. geht das?
excel muss sich das ja irgendwie merken, sonst würde ja die resume
methode nicht funktionieren. und diesen befehl würde ich gerne in ner
variable speichern.

danke nochmal für die hilfe.

Andreas Killer

unread,
Jan 14, 2010, 10:23:25 AM1/14/10
to
michlchen schrieb:

> kann ich da irgendwie herausbekommen, welcher befehl den fehler
> verursacht hat?

Nein.

> jetzt h�tte ich im errorhandler gerne drin, dass beim ausf�hren des


> befehls "sheets("abc").select" ein fehler aufgetreten ist. geht das?

Du musst einfach in Deiner Hauptroutine ein
"On Error Goto ErrorHandler"
schreiben, samt zugeh�rigem Label in dem Du den Fehler auswertest.

In jeder Deiner Routinen kannst Du via Err.Raise einen eigenen Fehler
erzeugen.

Und wenn jeder Deiner Routinen einen globalen String setzt und dort
Ihren Namen reinschreibt, dann wei�t Du auch wo er auftrat. Ggf.
k�nntest Du auch einen "CallStack" implementieren.

> excel muss sich das ja irgendwie merken, sonst w�rde ja die resume
> methode nicht funktionieren. und diesen befehl w�rde ich gerne in ner
> variable speichern.
Das geht mit VBA nicht.

Andreas.

michlchen

unread,
Jan 28, 2010, 7:09:29 AM1/28/10
to
> > kann ich da irgendwie herausbekommen, welcher befehl den fehler
> > verursacht hat?
>
> Nein.
>

doch. hab jetzt ne indirekte lösung.

ich nummeriere meine befehlszeilen.
also so:
On Error GoTo Errorhandler
10 Application.ScreenUpdating = False
20 ActiveWorkbook.Unprotect (",")
30 Sheets("abc").Visible = True
40 Sheets("abc").Select


im errorhandler ist dann drin:
...
2360 Exit Sub
Errorhandler:
MsgBox "Please close the file unsaved and contact ... ." & Chr
(10) & Chr(10) & Err.Number & ": " & Err.Description & Chr(10) & Chr
(10) & "Prozedure: ""meine_prozedure"" bei: " & Erl
Big_Error = True
end sub

dann schreibe ich mir "Prozedure: ""meine_prozedure"" bei: " & Erl in
mein logfile und fertig. dann kann ich genau sehen, wo der fehler
aufgetreten ist.

nur für die, die es interessieren sollte.

0 new messages