Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1200to1204
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
Wie den aktuellen MakroNamen ermitteln?
Holger,
Guten Morgen Excel-Profis,
ích möchte eine globale Errorbehandlung schreiben und was mir gerade noch fehlt, ist der Name des makros, in dem der Fehler passiert ist.
Dabei fällt mir auf, wie schwierig es ist in einem Modul dessen Namen zu ermitteln?
Es gibt doch das VBE Project und daher muss es doch ein Object geben, das als Wert den Namen anzeigen kann.
Sub Test
Msgbox MAKRONAME 'in diesem Fall also Test
End Sub
Wie kann man sowas denn realisieren? Tante Google bringt nur einen Code, der alle Makronamen auflisten, aber nicht den, der gerade läuft (und außerdem kapiere ich ihn dem Code nicht, wo das Object überhaupt festgelegt wird).
Kann hierzu jemand bitte helfen?
Gruß
Holger
Na, weeßte, det hattnwa schon (m.AW an R.)! orT
28.02.2011 13:57:27
Luc:-?
Gruß Luc :-?
Nein, nein, nein
28.02.2011 15:36:35
Holger,
Da mus ich doch energisch widersprechen.
Die Forumssuche lieferte lediglich den Hinweis, dass es entweder überhaupt nicht geht oder nur mit sehr grossem Aufwand. Ich habe Codes aus englischen Foren gesehen, in denen alle Module ausgelesen werden (leider funktionieren sie nicht, da irgendein Verweis fehlt) und man muss doch feststellen können, welcher gerade aktiv ist. Excel selber weiß es doch ebenso.
Wo bleibt hier der Ehrgeiz :) ?
AW: Nein, nein, nein
28.02.2011 18:17:19
Jürgen
Hallo Holger,
reicht Dir das Err-Objekt (das kennt auch ein Err.Source) nicht?
Gruß, Jürgen
So liest du AWn in deinen Threads,...
01.03.2011 00:16:12
Luc:-?
…Holger! :-/
Bspw!
Kapiert...?!
Luc :-?
Anzeige
AW: So liest du AWn in deinen Threads,...
01.03.2011 00:48:46
Reinhard
Hallo Luc,
okay, inzuwischen sollte/könnte er wissen wie man den Prozedurnamen und das Err-Objekt an eine Fehlerbehandlunsprozedur über gibt.
Wenn man aber den Anfragefaden weiter spinnt und hat da zig Prozeduren und will die Fehlerbehandlung einer Prozedur weitegeben ist es doch recht mühsam, pro Prozedur im Call-Aufruf der Fehlerprozedur den namen der Prozedur manuell einzutragen.
Bessser wäre doch sowas:
Call Fehlerroutine(Thisprocedure.Name, Err)
Was man dann fix in jede Prozedur eintargen kann.
An einer Lösung dafür wäre ich auch interessiert oder aber auch an der Aussage, geht nicht.
Beides okay.
Gruß ^Gut's Nächtle
Reinhard
Anzeige
Endlich jemand ...
01.03.2011 09:59:18
Holger,
... Der kapiert, was ich brauche. Einen prozedurnamen reinschreiben kann ich auch,
Ich will eine globale fehlerbehandlung, in projekten mit
Zig makros. Mein letzter stand hierzu: den aktuellen prozedurnamen zu ermitteln, scheint mit einfachen mitteln nicht möglich.
Aber ich forsche weiter und vielleicht gibt es hier doch
Noch jemanden, der mehr weiss.
...der mehr weiß... -> ganz schön frech,...
01.03.2011 12:35:55
Luc:-?
…mein Lieber,
wenn man bedenkt, was mancher hier schon ausprobiert hat, wovon du noch keine Ahnung hast… ;->
Das ist doch auch nicht viel anders, Reinhard,
man muss dann nur die 1.Prozedurzeile auslesen, denn im Grunde besteht das doch aus 2 Teilen:
1. Die F-Behandlungsproz selbst, die in ihrem Kopf entsprd parametriert wdn kann, und…
2. die stets gleiche Befehlsfolge, die in jede Proz eingetragen wdn muss, um 1. aufzurufen.
Allerdings wird man dann wohl nicht auf die MS VBA Extensibility5.3-Bibliothek verzichten können (für Inhaltsverzeichnisse u.ä. habe ich das schon gemacht → geht also! ).
Einfacher wäre es allerdings, Holger,
wenn du in jeder Proz eine stets gleichnamige String-Variable für den ProzNamen reservierst → das dürfte doch nur ein marginaler Aufwand sein und wenn 2. auch nur 1zeilig ist, kannst du auch darauf verzichten!
Warum denkt ihr bloß so kompliziert…?!
Aus 'ner externen F-BhdlRoutine heraus nachträgl die F-Quelle feststellen zu wollen, dürfte auch mit Err.Source nicht so ganz einfach sein.
Gruß Luc :-?
Anzeige
Höhenflug
01.03.2011 13:02:23
Holger,
Hallo Luc,
ja, man braucht eben immer jemanden, der einen von einem Höhenflug wieder runterholt.
Ich möchte das nochmal umschreiben. Die String Variable, in welcher der Name der jeweiligen Prozedur steht, würde ich eben zur Laufzeit automatisch füllen wollen. Dann wäre die String Variable gefüllt und alles gut. Denn wenn ich manuell diese Variable fülle, habe ich mehr Fehlerquellen als vorher, da ich immer daran denken muß, da gibt es doch noch eine Variable, die manuell gesetzt werden muss.
Den Namen der Prozedur will ich also nicht erst im Error Fall ermitteln, sondern generell immer gleich nach Start des Makros.
Und genu hier hakt es? Von dieser Bibliothek las ich, nur steht sie bei mir nicht zur Auswahl. Stattdessen fünf an der Zahl, die alle MS VBA Extensibility heissen. Diese kann ich nicht aktivieren, da dann ein Fehler kommt von einem Konflikt zwischen Modul, Projekt und Bibliothek!?!?
Du siehst, ich habe wirklich vorgearbeitet und brauche dennoch Hilfe.
Willst du mir also noch weiterhelfen?
Gruß
Holger
Anzeige
AW: Höhenflug
01.03.2011 15:33:15
Reinhard
Hallo Holger,
hier ist ein workaround, ungetestet. der schreibt per Code eine Konstante in Prozeduren mit dem jeweiligen Namen der Prozedur.
Möglicherweise klappt das nicht bei Properties.
http://www.cpearson.com/excel/InsertProcedureNames.aspx
Gruß
Reinhard
...Kommt mir beinahe 'ne Nr zu groß vor,...
01.03.2011 16:30:18
Luc:-?
…Reinhard,
sollte dann aber wohl reichen… ;-)
Gruß Luc :-?
AW: ...Kommt mir beinahe 'ne Nr zu groß vor,...
01.03.2011 18:07:53
Reinhard
Hallo Luc,
vielleicht reicht es, zumindest habe ich es bislang noch nicht zum Laufen gebracht.
Reihenfolge weiß ich nicht mehr genau.
vbext_pp_locked wird bemängelt als unbekannt obwohl es sogar in der Hilfe bei "Protextion" findbar ist.
Bei CodeMod passt auf einmal der Datentyp nicht bei
Set CodeMod = Application.VBE.ActiveCodePane.CodeModule
Änderung von
Dim CodeMod As VBIDE.CodeModule
auf
Dim CodeMod
bringt dann bei
ConstAtLine = ConstNameInProcedure(ConstName, CodeMod, ProcName, ProcType)
zu CodeMod den Hinweis auf Argument ByRef nicht möglich.
Naja, dies Erkenntnisse müßte Holger inzwischen auch haben :-))
Achja, getestet mit XL2000, ich probiere es gleich mal mit XL2007.
Gut, schnell zu lösen war daß auch Kleinbuchstaben angenommen werden.
Gruß
Reinhard
Anzeige
Selbes Problem ...
01.03.2011 18:25:53
Holger,
Hi Reinhard,
den Code habe ich aus englischsprachigen Foren auch schon gefischt.
Dort hat ihn allerdings auch niemand zum Laufen gebracht.
Bei mir hängt er an genau der Stelle vbext_pp_locked :(
AW: Selbes Problem ...
01.03.2011 18:32:30
Reinhard
Hallo Holger,
das ist ja erstmal nicht das wahre Problem, kommentiere da die If Abfrage ob der Code gesperrt ist erstmal aus.
Muß man dann halt ggfs. anders prüfen ob der Code gesperrt ist.
Und, wenn du schon so Code hats, warum zeigst du ihn dann nicht hier?
Gruß
Reinhard
AW: Selbes Problem ...
01.03.2011 19:29:28
Holger,
Na ja, oben steht ja der vielversprechendeste Code, der leider auch nicht geht.
Und der Code ist so unübersichtlich, dass ich ihn nicht weiter verfolgt habe.
Meine Kenntnisse sind auch bei weite nicht so gut, um so einen Code zu verstehen.
Wie Luc sagt, eine Nummer zu groß, aber ich will mich trotzdem da durchkämpfen.
Und jeden Code will ich erstmal auf das Wesentliche reduzieren, und das habe ich bei
dem nicht geschafft. Die ganzen Prüfungen bräuchte man ja nicht, aber auch das alles auskommentiert, kriege ich ihn nicht kompiliert ;(
Anzeige
Du bist nicht mehr allein :-)
01.03.2011 19:59:07
Reinhard
Hallo Holger,
z.B. bin ich jetzt auch stark dran interessiert warum da diese Konstante vbext_pp_locked nicht erkannt wird, ich dacht zwar erst die kommt aus PowerPoint wegen dem "pp" *gg*, jedenfalls eine Abfragemöglichkeit ob ein Code gesperrt ist ist sehr brauchbar.
Und für die Testphase, wenn ich Codes habe in vielen prozeduren finde ich es gut eine gemeinsame Fehlerroutine zu haben, die mir anzeigt in welcher Prozedur welcher Fehler auftrat, im Luxusfall sogar mit Zeilennummer der zeile :-)
Und auch ohne den Code den du gefunden hast, traue ich mir nach der langen Lehrzeit hier schon selbst zu Code zu basteln, der in allen Modulen in allen Prozeduren eine Konstante o.ä. einzubauen die den Prozedurnamen in sich trägt und auch in Properties.
Leider mache ich sehr oft viele Dinge gleichzeitig was dazu führt daß manches wieder liegenbleibt, wenn dieser Thread also aus der Liste verschwunden ist darfste gerne mal anfragen/nachfragen mit @Reinhard im Betreff :-))
Gruß
Reinhard
Anzeige
AW: Du bist nicht mehr allein :-)
01.03.2011 20:22:55
Holger,
Hallo Reinhard,
mir geht es ganz genauso. Wenn ich nicht innerhalb einer gewissen Zeit einen Ansatz finde, muss ich meist an anderen Dingen weitermachen. Denn nebenbei versuche ich noch, Visual C++ und WSH zu lernen. Dabei bleibt vieles liegen, weil mir die Zeit fehlt, es bis zum Ende durchzustehen.
Also ich mache weiter und werde in einiger Zeit einen neuen Thread aufmachen und dich auf dem Laufenden halten. Falls du was hast, gib mir bitte Bescheid.
AW: Selbes Problem ...
02.03.2011 11:23:09
Reinhard
Hallo Holger,
oben rechts mache ich das Häkchen bei "Frage noch offen", mach das auch bitte solange die Gesamtanfrage noch unbeantwortet/gelöst ist.
Scjhreib das in den Code und setze den Verweis:
'Verweis auf MS Vba Extensibility muß gesetzt sein!
Und füge gleich nach
Select Case CAsc
noch
Case Asc("a") To Asc("z")
dann kann man im Namen der Konstanten auch Kleinbuchstaben benutzen.
Zum Testen vergib Namen wie "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH".
die gleich ins Auge fallen.
Gruß
Reinhard
Anzeige
Code läuft nur in einem Modul :-(
02.03.2011 12:58:40
Reinhard
Hallo Holger,
ich bon jetzt soweit, daß das Makro zumindest schon einmal läuft, d.h. im obersten Modul "DieseArbeitsmappe" trägt es die Konstante in die Prozedur die da steht ein.
Leider macht sie das in anderen Modulen noch nicht :-(
Irgednwas läuft da innerhalb des Fettgedruckten schief...
Nachstehende der Code der Datei:
https://www.herber.de/bbs/user/73801.xls
Wie du u.a. in "DieseArbeitsmappe" erkennst habe ich mir eine "FehlerKonstanteTest.xls" mit allen möglichen Modulen gebastelt, mach das auch zum Testen.
Gruß
Reinhard
Code in Modul1:
Option Explicit
Option Compare Text
' By Chip Pearson, www.cpearson.com, chip@cpearson.com
Private Const C_MSGBOX_TITLE = "Insert Procedure Names"
Private Const C_VBE_CONST_TAG = "__INSERTCONSTLINE__"
Private Const C_VBE_INSERT_MENU As Long = 30005
Sub KonstanteEinfuegen()
'Verweis auf Microsoft Visual Basic for Applications Extensibility 5.3
Dim wkb As Workbook
Set wkb = Workbooks("FehlerKonstanteTest.xls")
Call InsertProcedureNameIntoProcedures(wkb)
End Sub
Sub InsertProcedureNameIntoProcedures(ByRef wkb As Workbook)
'Verweis auf Microsoft Visual Basic for Applications Extensibility 5.3
Const C_PROC_NAME = "InsertProcedureNameIntoProcedure"
Dim ProcName As String, ProcLine As String, ProcType As VBIDE.vbext_ProcKind
Dim StartLine As Long, Msg As String, VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule, Ndx As Long, Res As Variant
Dim Done As Boolean, ProcBodyLine As Long, SaveProcName As String
Dim ConstName As String, ValidConstName As Boolean, ConstAtLine As Long
Dim EndOfDeclaration As Long, Mdl
With wkb
If .VBProject.Protection = vbext_pp_locked Then
MsgBox "Der Code von" & vbCr & wkb & vbCr & "ist geperrt."
Exit Sub
End If
ConstName = InputBox(prompt:="Enter a constant name (e.g. 'C_PROC_NAME') that will be used as  _
" & vbCrLf & _
"the constant in which to store the procedure name.", Title:=C_MSGBOX_TITLE)
If Trim(ConstName) = vbNullString Then
Exit Sub
End If
If IsValidConstantName(ConstName) = False Then
MsgBox "The constant name: '" & ConstName & "' is invalid.", vbOKOnly, C_MSGBOX_TITLE
Exit Sub
End If
For Each Mdl In .VBProject.VBComponents
MsgBox Mdl.Name
Set CodeMod = Mdl.CodeModule
StartLine = CodeMod.CountOfDeclarationLines + 1
ProcName = CodeMod.ProcOfLine(StartLine, ProcType)
SaveProcName = ProcName
Do Until Done
ProcBodyLine = CodeMod.ProcBodyLine(ProcName, ProcType)
ConstAtLine = ConstNameInProcedure(ConstName, CodeMod, ProcName, ProcType)
If ConstAtLine > 0 Then
CodeMod.DeleteLines ConstAtLine, 1
CodeMod.InsertLines ConstAtLine, "CONST " & ConstName & " = " & Chr(34) & ProcName &  _
Chr(34)
Else
EndOfDeclaration = EndOfDeclarationLines(CodeMod, ProcName, ProcType)
ProcLine = EndOfCommentOfProc(CodeMod, EndOfDeclaration + 1)
CodeMod.InsertLines ProcLine + 1, "CONST " & ConstName & " = " & Chr(34) & ProcName &  _
Chr(34)
End If
StartLine = ProcBodyLine + CodeMod.ProcCountLines(ProcName, ProcType) + 1
ProcName = CodeMod.ProcOfLine(StartLine, ProcType)
If ProcName = SaveProcName Then
Done = True
Else
SaveProcName = ProcName
End If
Loop
Next Mdl
End With
End Sub
Function EndOfCommentOfProc(CodeMod As VBIDE.CodeModule, ProcBodyLine As Long) As Long
Dim Done As Boolean, LineNum As String, LineText As String
LineNum = ProcBodyLine
Do Until Done
LineNum = LineNum + 1
LineText = CodeMod.Lines(LineNum, 1)
If Left(Trim(LineText), 1) = "'" Then
Done = False
Else
Done = True
End If
Loop
EndOfCommentOfProc = LineNum - 1
End Function
Function IsValidConstantName(ConstName As String) As Boolean
Const C_PROC_NAME = "IsValidConstantName"
Dim C As String, N As Long, CAsc As Integer
If InStr(1, ConstName, " ") > 0 Then
IsValidConstantName = False
Exit Function
End If
If IsNumeric(Left(ConstName, 1)) = True Then
IsValidConstantName = False
Exit Function
End If
For N = 2 To Len(ConstName)
C = Mid(ConstName, N, 1)
CAsc = Asc(C)
Select Case CAsc
Case Asc("a") To Asc("z")
Case Asc("A") To Asc("Z")
Case Asc("0") To Asc("9")
Case Asc("_")
Case Else
IsValidConstantName = False
Exit Function
End Select
Next N
IsValidConstantName = True
End Function
Function ConstNameInProcedure(ConstName As String, CodeMod As VBIDE.CodeModule, _
ProcName As String, ProcType As VBIDE.vbext_ProcKind) As Long
Const C_PROC_NAME = "ConstNameInProcedure"
Dim LineNum As Long, LineText As String, ProcBodyLine As Long
ProcBodyLine = CodeMod.ProcBodyLine(ProcName, ProcType)
For LineNum = ProcBodyLine To ProcBodyLine + CodeMod.ProcCountLines(ProcName, ProcType)
LineText = CodeMod.Lines(LineNum, 1)
If InStr(LineText, " " & ConstName & " ") > 0 Then
ConstNameInProcedure = LineNum
Exit Function
End If
Next LineNum
End Function
Function EndOfDeclarationLines(CodeMod As VBIDE.CodeModule, ProcName As String, _
ProcType As VBIDE.vbext_ProcKind) As Long
Const C_PROC_NAME = "EndOfDeclarationLines"
Dim LineNum As Long, LineText As String
LineNum = CodeMod.ProcBodyLine(ProcName, ProcType)
Do Until Right(CodeMod.Lines(LineNum, 1), 1)  "_"
LineNum = LineNum + 1
Loop
EndOfDeclarationLines = LineNum
End Function

Anzeige
AW: Code läuft nur in einem Modul :-(
02.03.2011 14:04:03
Holger,
Hallo Reinhard,
ich säume das Pferd gerade von hinten auf.
Aus meinem Buch von Addison-Wesley steht einiges drin zur VBE Programmierung.
Denn diesen Code Reinhard, den kann ich laufen lassen, aber ich checke nix.
Ehrlich, das ist ja der Wahnsinn!
Ich poste heute abend oder morgen früh einen anfangscode, der simpler und zielgerichteter sein sollte.
Denn die Konstande einzutragen bräuchte man nicht unbedingt, diese könnte man ja einmalig anlegen und dann immer automatisch füllen lassen.
Sei gespannt, was kommt!
Wobei ....
02.03.2011 14:08:37
Holger,
Hallo Reinhard,
ich kriege einmal einen Fehler, kein Wechsel möglich.
Dein Code ist echt vielversprechend, nur ich kapiere ihn nur zum Teil.
Trotzdem, wir machen weiter. Und Danke für deine Mühe alldieweil
An Reinhard: Hab was für Dich!!!
02.03.2011 15:18:37
Holger,
Hallo Reinhard,
ich bin einen Schritt weiter, siehe Datei
1 Ein Modul um die Verweise auszugeben bzw zu prüfen
2 Ein Makro, welches alle Makros der Datei ermittelt!
So, wenn du nun in dieses Makro einfach eine Konstante einfügen würdest, die sagt Konstante gleich strSubName wärfen wir doch schon fertig, oder nicht? Weil alles andere braucht man doch eigentlich gar nicht.
check das bitte mal!
https://www.herber.de/bbs/user/73807.xlsm
AW: So liest du AWn in deinen Threads,...
01.03.2011 09:39:37
Holger,
Nein, nicht kapiert.
Err source liefert nue das vba prohect.
Ich will den namen der aktuell laufenden prozedur ermitteln ohne diesen vorher in eine variable oder sonstwohin zu tippen.
Dann frag Reinhard! ;-) (oder oben) owT
01.03.2011 12:38:38
Luc:-?
:-?
AW: Dann frag Reinhard! ;-) (oder oben) owT
01.03.2011 13:07:49
Holger,
Reinhard weiß es ja auch nicht. Niemand weiß das anscheinend ;(
AW: Kein Preis ohne Fleiß!
01.03.2011 21:18:23
Gerd

Ich will den namen der aktuell laufenden prozedur ermitteln ohne diesen vorher in eine variable oder sonstwohin zu tippen.
Dann träume halt weiter!
Gruß Gerd

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige