{"id":55000433,"date":"2024-08-01T00:00:00","date_gmt":"2024-08-14T14:44:35","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=433"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Klassenprogrammierung_mit_COMAddIn_vereinfachen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Klassenprogrammierung_mit_COMAddIn_vereinfachen\/","title":{"rendered":"Klassenprogrammierung mit COM-Add-In vereinfachen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/2685e24690c34f98a57fb19be4eb7cf6\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_001.png\" alt=\"Men&uuml;eintrag unseres COM-Add-Ins\" width=\"649,627\" height=\"180,6654\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Men&uuml;eintrag unseres COM-Add-Ins<\/span><\/b><\/p>\n<p><b>Im Artikel &#8220;VBA-Editor: Klasseneigenschaften per Mausklick&#8221; (www.vbentwickler.de\/422) haben wir eine Prozedur vorgestellt, mit denen man aus einer einfachen Variablendeklaration innerhalb eines Klassenmoduls eine private Membervariable und jeweils eine Property Get-Methode und eine Property Set\/Let-Methode erzeugen kann. Der einzige Haken bei dieser L&ouml;sung ist, dass man diese bisher noch &uuml;ber den Direktbereich aufrufen musste. Da das nicht sonderlich komfortabel ist, stellen wir in diesem Artikel eine L&ouml;sung vor, bei der wir mit twinBASIC ein COM-Add-In f&uuml;r den VBA-Editor erstellen, mit dem wir die Funktion aus dem oben genannten Artikel &uuml;ber die Men&uuml;leiste, die Symbolleiste oder auch &uuml;ber das Kontextmen&uuml; des VBA-Editors aufrufen kann. <\/b><\/p>\n<p>Wir bauen hier auf den Vorbereitungen auf, die wir im Artikel <b>twinBASIC: COM-Add-In f&uuml;r den VBA-Editor <\/b>(<b>www.vbentwickler.de\/421<\/b>) vorgestellt haben. Hier haben wir ein Basis-COM-Add-In f&uuml;r den VBA-Editor vorgestellt, das einfach nur ein paar Dummy-Eintr&auml;ge im Men&uuml; und im Kontextmen&uuml; anzeigt, die Meldungsfenster liefern. Den ersten sehen wir in Bild 1.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_001.png\" alt=\"Men&uuml;eintrag unseres COM-Add-Ins\" width=\"649,627\" height=\"180,6654\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Men&uuml;eintrag unseres COM-Add-Ins<\/span><\/b><\/p>\n<p>Den zweiten Eintrag, den wir im Kontextmen&uuml; untergebracht haben, finden wir im Kontextmen&uuml; in Bild 2 ganz unten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_002.png\" alt=\"Men&uuml;eintrag im Kontextmen&uuml;\" width=\"499,6267\" height=\"429,7674\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Men&uuml;eintrag im Kontextmen&uuml;<\/span><\/b><\/p>\n<p>In der Symbolleiste haben wir noch keinen Eintrag untergebracht. Auch das wollen wir gegebenenfalls noch erledigen. Erst einmal schauen wir uns jedoch die zu programmierende Funktion an &#8211; wo im Men&uuml; wir diese optimal unterbringen.<\/p>\n<h2>Umwandeln von Variablen in Property Get\/Let\/Set<\/h2>\n<p>Die Aufgabe lautet, die Prozedur, die wir im oben genannten Artikel entwickelt haben, &uuml;ber ein COM-Add-In f&uuml;r den VBA-Editor verf&uuml;gbar zu machen. Diese Aufgabe ist einfach &#8211; wir brauchen eigentlich nur unsere Men&uuml;punkte umzubenennen und diesen den Aufruf der gew&uuml;nschten Prozedur hinzuzuf&uuml;gen.<\/p>\n<p>Allerdings wollen wir das mit Bedacht tun, damit wir den bestm&ouml;glichen Ort f&uuml;r den Men&uuml;eintrag finden. Es geht darum, eine oder mehrere Variablen im Code eines Klassenmoduls zu markieren und dann die Prozedur <b>VariableToProperty <\/b>aufzurufen. Diese holt sich die aktuelle Markierung und passt den gefundenen Code entsprechend an.<\/p>\n<p>Um diese Funktion nach dem Selektieren der zu bearbeitenden Code-Passagen aufzurufen: Was w&auml;re der geeignete Ort? Wir wollen mit m&ouml;glichst wenig Klicks und m&ouml;glichst wenig Mausmetern zum Ziel kommen. Wenn wir also einen Eintrag im Men&uuml; verwenden, sollte dieser direkt erreichbar sein. Dazu bietet sicher eher die Symbolleiste an, in der wir den Befehl &uuml;ber ein geeignetes Icon anbieten k&ouml;nnen. Allerdings muss man f&uuml;r eine solche erkl&auml;rungsbed&uuml;rftige Aufgabe erst einmal ein passendes Icon finden.<\/p>\n<p>Die zweite M&ouml;glichkeit ist, diesen Befehl in der Men&uuml;leiste selbst unterzubringen. Hier sollten wir allerdings keine Befehle in der Hauptmen&uuml;leiste unterbringen, sondern vielleicht einen Hauptmen&uuml;punkt unterbringen, der nicht nur diesen, sondern gegebenenfalls noch andere Eintr&auml;ge mit Aufrufen unserer selbst definierten Funktionen enth&auml;lt. Die Struktur mit <b>Mein Men&uuml;|Mein Befehl <\/b>ist daher schon passend. Damit w&auml;ren wir nach dem Markieren der zu bearbeitenden Codezeilen mit zwei Mausklicks am Ziel.<\/p>\n<p>Die n&auml;chste M&ouml;glichkeit ist das Kontextmen&uuml;. Hier ben&ouml;tigen wir grunds&auml;tzlich einen Klick mehr, weil wir diese erst einmal mit einem Rechtsklick anzeigen m&uuml;ssen. Wenn wir den Befehl dann direkt im Kontextmen&uuml; anzeigen, kommen wir schnell zum Ziel. Wenn das Kontextmen&uuml; noch keine Eintr&auml;ge weiterer COM-Add-Ins enth&auml;lt, kann man das so machen. Wenn wir jedoch planen, noch weitere benutzerdefinierte Funktionen zu diesem oder anderen COM-Add-Ins hinzuzuf&uuml;gen, k&ouml;nnen wir auch einen Unterpunkt hinzuf&uuml;gen.<\/p>\n<p>Das w&auml;re dann zwar ein Mausklick mehr, aber letztlich sparen wir durch die Funktion an sich schon so viel Zeit, dass sich das nicht besonders auswirken sollte.<\/p>\n<p>Also starten wir wie folgt:<\/p>\n<ul>\n<li>Wir f&uuml;gen der Men&uuml;leiste einen Men&uuml;punkt beispielsweise namens <b>AMV-Tools <\/b>hinzu. Unter diesem legen wir den Aufruf zum Umwandeln der Variablen in <b>Property Get<\/b>\/<b>Let<\/b>\/<b>Set<\/b>-Prozeduren an.<\/li>\n<li>Wir f&uuml;gen auch dem Kontextmen&uuml; einen Men&uuml;punkt namens <b>AMV-Tools <\/b>hinzu. Dieser enth&auml;lt wiederum eine Schaltfl&auml;che zum Aufrufen der gew&uuml;nschten Funktion.<\/li>\n<li>Schlie&szlig;lich wollen wir den Befehl auch noch in der Symbolleiste unterbringen. Hier k&ouml;nnen wir den Befehl direkt unterbringen, sollten uns jedoch auf ein Icon beschr&auml;nken.<\/li>\n<li>Au&szlig;erdem f&uuml;gen wir die gew&uuml;nschte Funktion zum Umwandeln von Variablen in Propertys hinzu und testen diese ausf&uuml;hrlich.<\/li>\n<\/ul>\n<h2>Passende Symbolleiste finden<\/h2>\n<p>Der VBA-Editor enth&auml;lt einige Symbolleisten. Welche verwenden wir optimalerweise f&uuml;r unsere Funktion? Schauen wir uns erst einmal an, welche eingebauten Symbolleisten der VBA-Editor alle anbietet. Dazu lassen wir in einer VBA-Anwendung die folgende Prozedur laufen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ListMenus()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>Office.CommandBar\r\n     For Each cbr In VBE.CommandBars\r\n         <span style=\"color:blue;\">If <\/span>cbr.Type = msoBarTypeNormal<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> cbr.Name\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> cbr\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies liefert das folgende Ergebnis:<\/p>\n<pre>Voreinstellung\r\nBearbeiten\r\nDebuggen\r\nUserForm\r\nClipboard<\/pre>\n<p>Wenn wir uns diese Symbolleisten einmal anschauen, k&ouml;nnen wir besser entscheiden, welche der richtige Ort ist. Dazu blenden wir einmal alle Symbolleisten ein. Das erledigen wir &uuml;ber den Men&uuml;punkt <b>Ansicht|Symbolleisten<\/b>. Hier finden wir alle verf&uuml;gbaren Symbolleisten vor &#8211; wobei aus der per VBA ausgegebenen Liste der Eintrag <b>Clipboard<\/b> fehlt. Daf&uuml;r finden wir einen zus&auml;tzlichen Eintrag namens <b>Anpassen&#8230;<\/b> (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_003.png\" alt=\"Einblenden aller Symbolleisten\" width=\"599,6265\" height=\"521,5065\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Einblenden aller Symbolleisten<\/span><\/b><\/p>\n<p>Die eingeblendeten Symbolleisten erscheinen zun&auml;chst freischwebend, was normalerweise nicht erw&uuml;nscht ist &#8211; au&szlig;er, man ben&ouml;tigt die entsprechende Funktion direkt in der N&auml;he der damit zu bearbeitenden Elemente. Dann stellt sich jedoch die Frage, ob der Einsatz eines Kontextmen&uuml;s nicht ohnehin die bessere L&ouml;sung w&auml;re.<\/p>\n<p>F&uuml;r unseren Zweck scheint uns jedenfalls die Symbolleiste <b>Bearbeiten <\/b>am geeignetsten zu sein. Also f&uuml;gen die unseren Befehl dort hinzu.<\/p>\n<h2>Einf&uuml;gen eines Befehls in der Bearbeiten-Symbolleiste und mehr<\/h2>\n<p>Nun schauen wir uns an, wie wir die im Artikel <b>twinBASIC: COM-Add-In f&uuml;r den VBA-Editor <\/b>(<b>www.vbentwickler.de\/421<\/b>) vorgestellte Vorlage genau anpassen, um unsere Funktionen im VBA-Editor bereitzustellen. Wir gehen an dieser Stelle nicht mehr auf alle dort beschriebenen Details ein.<\/p>\n<p>Um die Men&uuml;s mit unseren Schaltfl&auml;chen zu f&uuml;llen, ben&ouml;tigen wir zuerst einmal die Prozedur, die beim Verbinden des VBA-Editors mit dem COM-Add-In ausgel&ouml;st wird.<\/p>\n<p>Diese weist der Objektvariablen <b>objVBE<\/b>, die wir &ouml;ffentlich in einem Modul namens <b>mdlGlobal<\/b> definieren, den mit dem Parameter <b>Application<\/b> gelieferten Verweis auf die aufrufende Anwendung zu:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>objVBE<span style=\"color:blue;\"> As <\/span>VBIDE.VBE<\/pre>\n<p>Au&szlig;erdem rufen wir in dieser Prozedur, die in Listing 1 abgebildet ist, die Prozedur <b>CreateToolbar <\/b>auf.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnConnection(ByVal Application<span style=\"color:blue;\"> As Object<\/span>, ByVal ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, ByVal AddInInst<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnConnection\r\n     <span style=\"color:blue;\">Set<\/span> objVBE = Application\r\n     <span style=\"color:blue;\">Set<\/span> objAddIn = AddInInst\r\n     isConnected = <span style=\"color:blue;\">True<\/span>\r\n     CreateToolBar()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Diese Prozedur wird beim Verbinden des COM-Add-Ins ausgel&ouml;st.<\/span><\/b><\/p>\n<p>Diese referenziert zuerst die Men&uuml;leiste mit der Variablen <b>cbr <\/b>und f&uuml;gt dieser ein Untermen&uuml; hinzu (siehe Listing 2). Dieses platziert sie vor dem achten Untermen&uuml;, stellt die Beschriftung auf den Wert aus der Konstanten <b>cStrMenu <\/b>ein (<b>AMV-Tools<\/b>) und f&uuml;gt diesem ein mit der Variablen <b>cbb <\/b>referenziertes <b>CommandBarButton<\/b>-Element hinzu.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>CreateToolBar()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbp<span style=\"color:blue;\"> As <\/span>CommandBarPopup\r\n     <span style=\"color:blue;\">Dim <\/span>cbpContext<span style=\"color:blue;\"> As <\/span>CommandBarPopup\r\n     <span style=\"color:blue;\">Set<\/span> cbr = objVBE.CommandBars(\"Men&uuml;leiste\") ''Eintrag in Men&uuml;leiste anlegen\r\n     <span style=\"color:blue;\">Set<\/span> cbp = cbr.Controls.Add(msoControlPopup, Temporary:=<span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> cbp\r\n         .Move Before:=8\r\n         .Caption = cStrMenu\r\n         <span style=\"color:blue;\">Set<\/span> cbbMenu =.Controls.Add(msoControlButton, Temporary:=<span style=\"color:blue;\">True<\/span>)\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">With<\/span> cbbMenu\r\n         .Caption = cStrCommandButton\r\n         .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n         .Picture = GetImage(\"GetSet.png\")\r\n         <span style=\"color:blue;\">Set<\/span> cbbMenuEvent = objVBE.Events.CommandBarEvents(cbbMenu)\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> cbr = objVBE.CommandBars(\"Bearbeiten\") ''Eintrag in Symbolleiste ''Bearbeiten'' anlegen\r\n     <span style=\"color:blue;\">Set<\/span> cbbToolbar = cbr.Controls.Add(msoControlButton, temporary:=<span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> cbbToolbar\r\n         .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n         .Picture = GetImage(\"GetSet.png\")\r\n         <span style=\"color:blue;\">Set<\/span> cbbToolbarEvent = objVBE.Events.CommandBarEvents(cbbToolbar)\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> cbpContext = objVBE.CommandBars(\"Code Window\").Controls.Add(msoControlPopup, Temporary:=<span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> cbpContext\r\n         .Caption = cStrMenu\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> cbbContext = cbpContext.Controls.Add(Temporary:=<span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> cbbContext\r\n         .Caption = cStrCommandButton\r\n         .Picture = GetImage(\"GetSet.png\")\r\n         .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> cbbContextEvent = objVBE.Events.CommandBarEvents(cbbContext)\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Diese Prozedur erstellt die CommandBarButton-Objekte in den verschiedenen Men&uuml;s.<\/span><\/b><\/p>\n<p>F&uuml;r dieses legt es die Beschriftung aus der Konstanten <b>cStrCommandButton <\/b>fest (<b>Getter und Setter f&uuml;r Variable<\/b>) und stellt das Icon mit der <b>Picture<\/b>-Eigenschaft auf das Ergebnis der Funktion <b>GetImage <\/b>mit dem Parameter <b>GetSet.png <\/b>ein. Schlie&szlig;lich weisen wir der Objektvariablen <b>cbbMenuEvent <\/b>die Ereignisse des <b>CommandBarButton<\/b>-Objekts zu.<\/p>\n<p>Die Objektvariablen f&uuml;r die Men&uuml;s deklarieren wir im allgemeinen Teil des Men&uuml;s wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>cbbToolbar<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n<span style=\"color:blue;\">Private <\/span>cbbMenu<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n<span style=\"color:blue;\">Private <\/span>cbbContext<span style=\"color:blue;\"> As <\/span>CommandBarButton<\/pre>\n<p>Direkt danach folgen die Deklarationen der Event-Klassen f&uuml;r die drei anzulegenden Schaltfl&auml;chen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents cbbToolbarEvent<span style=\"color:blue;\"> As <\/span>_\r\n     VBIDE.CommandBarEvents\r\n<span style=\"color:blue;\">Private <\/span>WithEvents cbbContextEvent<span style=\"color:blue;\"> As <\/span>_\r\n     VBIDE.CommandBarEvents\r\n<span style=\"color:blue;\">Private <\/span>WithEvents cbbMenuEvent<span style=\"color:blue;\"> As <\/span>VBIDE.commandbarEvents<\/pre>\n<p>Damit legen wir nun den Eintrag in der Symbolleiste an. Dazu referenzieren wir die Symbolleiste <b>Bearbeiten<\/b> mit der Variablen <b>cbr<\/b>. Dieser f&uuml;gen wir ein neues Element hinzu und referenzieren es mit <b>cbbToolbar<\/b>. Dieses erh&auml;lt keine Beschriftung, aber ebenfalls das Icon. Au&szlig;erdem referenzieren wir seine Ereignisse mit der Variablen <b>cbbToolbarEvent<\/b>.<\/p>\n<p>Schlie&szlig;lich folgt noch der Eintrag im Kontextmen&uuml;. Dazu referenzieren wir das Kontextmen&uuml; mit dem Namen <b>Code Window<\/b> und weisen diesem ein neues Untermen&uuml; hinzu, das wir mit der Variablen <b>cbpContext<\/b> referenzieren und das wie das Untermen&uuml; in der Men&uuml;leiste die Beschriftung aus <b>cStrMenu <\/b>erh&auml;lt.<\/p>\n<p>Diesem Untermen&uuml; f&uuml;gen wir eine Schaltfl&auml;che hinzu, die genauso aufgebaut ist wie die im Hauptmen&uuml;. Wir referenzieren sie aber mit der Variablen <b>cbbContext <\/b>und seine Events mit der Variablen <b>cbbContextEvent<\/b>.<\/p>\n<p>Damit haben wir alle Men&uuml;eintrage hinzugef&uuml;gt. Nun m&uuml;ssen wir die Ereignisprozeduren definieren.<\/p>\n<h2>Ereignisse f&uuml;r die drei Men&uuml;befehle programmieren<\/h2>\n<p>Dazu w&auml;hlen wir im Codefenster von twinBASIC jeweils oben im mittleren Auswahlfeld den Namen des Klassenmoduls aus und im rechten dann den Eintrag Click (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_003.png\" alt=\"Anlegen der Ereignisprozeduren f&uuml;r die Men&uuml;buttons\" width=\"649,627\" height=\"328,0135\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anlegen der Ereignisprozeduren f&uuml;r die Men&uuml;buttons<\/span><\/b><\/p>\n<p>Dies legt die drei Ereignisprozeduren an, die wir wie in Listing 3 f&uuml;llen. Diese rufen jeweils die Prozedur <b>LaunchFunction <\/b>auf und stellen die Parameter <b>handled <\/b>auf <b>True <\/b>und <b>CancelDefault <\/b>auf <b>False <\/b>ein.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cbbMenuEvent_Click(ByVal CommandBarControl<span style=\"color:blue;\"> As Object<\/span>, handled<span style=\"color:blue;\"> As Boolean<\/span>, CancelDefault<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     LaunchFunction\r\n     handled = <span style=\"color:blue;\">True<\/span>\r\n     CancelDefault = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cbbToolbarEvent_Click(ByVal CommandBarControl<span style=\"color:blue;\"> As Object<\/span>, handled<span style=\"color:blue;\"> As Boolean<\/span>, CancelDefault<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     LaunchFunction\r\n     handled = <span style=\"color:blue;\">True<\/span>\r\n     CancelDefault = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cbbContextEvent_Click(ByVal CommandBarControl<span style=\"color:blue;\"> As Object<\/span>, handled<span style=\"color:blue;\"> As Boolean<\/span>, CancelDefault<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     LaunchFunction\r\n     handled = <span style=\"color:blue;\">True<\/span>\r\n     CancelDefault = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ereignisprozeduren f&uuml;r die Men&uuml;schaltfl&auml;chen<\/span><\/b><\/p>\n<p>Die Prozedur <b>LaunchFunction <\/b>sieht wie folgt aus und ruft lediglich mit der <b>Call<\/b>-Anweisung die Prozedur <b>VariableToProperty <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>LaunchFunction()\r\n     <span style=\"color:blue;\">Call<\/span> VariableToProperty()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese wiederum erledigt die eigentliche Arbeit. Da wir die Prozedur bereits im Artikel <b>VBA-Editor: Klasseneigenschaften per Mausklick<\/b> (<b>www.vbentwickler.de\/422<\/b>) ausf&uuml;hrlich beschrieben haben, gehen wir hier nur auf die wenigen &Auml;nderungen ein, die f&uuml;r den Betrieb in unserem COM-Add-In notwendig sind.<\/p>\n<p>In der Prozedur <b>VariableToProperty <\/b>ist nur die folgende &Auml;nderung notwendig:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>VariableToProperty()\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> objCodePane = objVBE.ActiveCodePane ''objVBE statt VBE\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit l&auml;uft das COM-Add-In wie gew&uuml;nscht und wir k&ouml;nnen es bereits einmal erstellen. Dazu rufen wir im COM-Add-In den Befehl <b>File|Build <\/b>auf. Mit dem Beispielprojekt aus dem Download sollte das Erstellen problemlos durchlaufen.<\/p>\n<p>Danach kannst Du eine Office-Anwendung &ouml;ffnen und mit <b>Alt + F11 <\/b>den VBA-Editor anzeigen. Hier kannst Du die Funktion des COM-Add-Ins nun &uuml;ber drei M&ouml;glichkeiten aufrufen.<\/p>\n<p>Die erste ist die Men&uuml;leiste, also das Hauptmen&uuml; des VBA-Editors. Hier finden wir den Befehl in einem eigenen Untermen&uuml; namens <b>AMV-Tools <\/b>unter dem Namen <b>Getter und Setter f&uuml;r Variable<\/b> (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_004.png\" alt=\"Aufruf des COM-Add-Ins &uuml;ber die Men&uuml;leiste\" width=\"649,627\" height=\"215,3102\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Aufruf des COM-Add-Ins &uuml;ber die Men&uuml;leiste<\/span><\/b><\/p>\n<p>Die zweite ist der Aufruf &uuml;ber die Symbolleiste <b>Bearbeiten<\/b>. Hier haben wir an letzter Stelle unseren Befehl mit dem Icon mit der Beschriftung <b>Get\/Set <\/b>hinzugef&uuml;gt (siehe Bild 6). Dieser ruft die gleiche Funktion auf.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_005.png\" alt=\"Aufruf des COM-Add-Ins per Symbolleiste\" width=\"649,627\" height=\"246,506\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Aufruf des COM-Add-Ins per Symbolleiste<\/span><\/b><\/p>\n<p>Schlie&szlig;lich finden wir den Befehl auch noch im Kontextmen&uuml;. Hier haben wir ebenfalls ein Untermen&uuml; namens <b>AMV-Tools <\/b>vorgeschaltet (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_006.png\" alt=\"Aufruf des COM-Add-Ins per Kontextmen&uuml;leiste\" width=\"649,627\" height=\"528,5275\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Aufruf des COM-Add-Ins per Kontextmen&uuml;leiste<\/span><\/b><\/p>\n<p>Dieser Ansatz geht davon aus, dass wir unter dem Men&uuml; <b>AMV-Tools <\/b>noch weitere Funktionen &uuml;ber dieses oder andere COM-Add-Ins einbauen.<\/p>\n<p>Wenn das nicht der Fall ist, k&ouml;nnen wir den Befehl auch einzeln ohne das Untermen&uuml; im Kontextmen&uuml; anzeigen lassen. Den letzten Teil, in dem wir das Untermen&uuml; und den Befehl im Kontextmen&uuml; anlegen, ersetzen wir nun durch die folgenden Anweisungen:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> cbr = objVBE.CommandBars(\"Code Window\")\r\n<span style=\"color:blue;\">Set<\/span> cbbContext = cbr.Controls.Add(Temporary:=True, _\r\n      Before:=6)\r\n<span style=\"color:blue;\">With<\/span> cbbContext\r\n     .Caption = cStrCommandButton\r\n     .Picture = GetImage(\"GetSet.png\")\r\n     .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> cbbContextEvent = _\r\n        objVBE.Events.CommandBarEvents(cbbContext)\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Durch den Parameter <b>Before<\/b> in der <b>Add<\/b>-Methode sorgen wir daf&uuml;r, dass der Befehl direkt hinter den beiden Befehlen <b>Block auskommentieren <\/b>und <b>Auskommentierung des Blocks aufheben <\/b>erscheint (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_007.png\" alt=\"Aufruf des COM-Add-Ins direkt &uuml;ber das Kontextmen&uuml;\" width=\"424,6267\" height=\"353,3235\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Aufruf des COM-Add-Ins direkt &uuml;ber das Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Damit k&ouml;nnen wir nun wie in den vorherigen Screenshots gezeigt eine Zeile mit einer Variablendeklaration markieren, die wir in eine private Variable mit Getter- und Setter umwandeln wollen (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_008.png\" alt=\"Ergebnis der Funktion\" width=\"424,6267\" height=\"281,0331\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Ergebnis der Funktion<\/span><\/b><\/p>\n<h2>Das COM-Add-In aus dem Download f&uuml;r eigene Zwecke nutzen<\/h2>\n<p>Wenn Du das COM-Add-In auf Deinem eigenen Rechner f&uuml;r den Einsatz im VBA-Editor installieren m&ouml;chtest, sind ein paar Handgriffe n&ouml;tig.<\/p>\n<p>Als Erstes kopierst Du die f&uuml;r Deine Office-Version passende Version in einen Ordner Deiner Wahl &#8211; also f&uuml;r die 32-Bit- oder die 64-Bit-Version.<\/p>\n<p>Beide Varianten findest Du im Download:<\/p>\n<ul>\n<li><b>amvVBExtensions_win32.dll<\/b><\/li>\n<li><b>amvVBExtensions_win64.dll<\/b><\/li>\n<\/ul>\n<p>Nun m&uuml;ssen wir das COM-Add-In erst einmal registrieren. Dazu starten wir die Eingabeaufforderung von Windows im Administrator-Modus.<\/p>\n<p>Das gelingt wie folgt:<\/p>\n<ul>\n<li>Gib den Suchbegriff <b>cmd<\/b> in die Windows-Suche ein.<\/li>\n<li>Klicke mit der rechten Maustaste auf den nun erscheinenden Eintrag Eingabeaufforderung und w&auml;hle den Kontextmen&uuml;befehl <b>Als Administrator &ouml;ffnen <\/b>auf oder <\/li>\n<li>klicke direkt auf den Befehl <b>Als Administrator ausf&uuml;hren <\/b>(siehe Bild 10).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_009.png\" alt=\"Starten der Eingabeaufforderung\" width=\"599,6265\" height=\"419,0442\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Starten der Eingabeaufforderung<\/span><\/b><\/p>\n<\/ul>\n<p>Hier geben wir nun den Befehl <b>RegSvr32.exe <\/b>ein und geben als Parameter den Pfad zur <b>.dll<\/b>-Datei an. Den Pfad k&ouml;nnen wir &uuml;ber den Windows Explorer holen, indem wir mit der rechten Maustaste auf die Datei klicken und den Befehl <b>Als Pfad kopieren <\/b>bet&auml;tigen.<\/p>\n<p>Danach f&uuml;gen wir den Pfad so ein, dass der Befehl wie in Bild 11 aussieht. Nach dem Ausf&uuml;hren erhalten wir die ebenfalls dort abgebildete Meldung.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_04\/pic_433_010.png\" alt=\"Registrieren des COM-Add-Ins\" width=\"599,6265\" height=\"344,9908\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Registrieren des COM-Add-Ins<\/span><\/b><\/p>\n<p>Damit ist das COM-Add-In bereits registriert und kann im VBA-Editor verwendet werden.<\/p>\n<p>&Uuml;brigens hei&szlig;t die Anwendung zum Registrieren auch f&uuml;r die 64-Bit-Version RegSvr32.exe.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt, wie Du eine Funktion, wie Du sie vielleicht einmal entwickelt hast, um Dir Zeit und Arbeit zu sparen, in einem COM-Add-In unterbringen und mit diesem jederzeit im VBA-Editor von Office zur Verwendung anbieten kannst.<\/p>\n<p>In weiteren Artikel schauen wir uns nun noch andere interessante Erweiterungen an und f&uuml;gen diese zu unserem COM-Add-In hinzu.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KlassenprogrammierungMitCOMAddInVereinfachen.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/87B79F0B-BB86-472B-802F-A9C6F58E19C5\/vbe_433.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>.NET bietet sehr viele Steuer-elemente. Viel mehr als beispielsweise Microsoft Access. Und auch wenn man unter Access mit den eingebauten Steuerelementen die meisten Aufgaben im Bereich einer Datenbanksoftware erledigen kann, w&uuml;nschen sich viele Entwickler, auch einmal andere Steuer-elemente nutzen zu k&ouml;nnen. Wir untersuchen in diesem Artikel, ob und wie wir .NET-Steuerelemente unter Access einbinden und in Formularen anzeigen k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662024,66042024,44000024,44000037],"tags":[],"yst_prominent_words":[],"class_list":["post-55000433","post","type-post","status-publish","format-standard","hentry","category-662024","category-66042024","category-Berichte_und_Reporting","category-VBAEditor_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000433","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000433"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000433\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000433"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}