{"id":55000234,"date":"2004-10-01T00:00:00","date_gmt":"2023-02-10T14:47:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=234"},"modified":"2024-02-19T08:17:02","modified_gmt":"2024-02-19T08:17:02","slug":"von_vba_zu_vbnet","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/","title":{"rendered":"Von VBA zu VB.NET"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/0098d0e628f24d24b1fd4231924d6417\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Christoph Spielmann, D&uuml;sseldorf<\/b><\/p>\n<p><b>Die Entwicklung von Anwendungen auf der .NET-Plattform gewinnt immer mehr an Bedeutung. Auch f&uuml;r Access-Entwickler stellt sich daher die Frage, ob bestimmte Anwendungen nicht besser mit .NET als mit Access entwickelt werden sollten. Dies trifft insbesondere auf moderne Anwendungen zu, die beispielsweise per Web-Service mit anderen Systemen kommunizieren, auf unterschiedliche Datenbank-Server zugreifen und das Benutzer-Interface im Web pr&auml;sentieren. In diesem Artikel stellen wir Ihnen die .NET-Plattform genauer vor und zeigen Ihnen, wie Sie als VBA-Programmierer m&ouml;glichst einfach auf VB.NET umsteigen k&ouml;nnen.<\/b><\/p>\n<p>Wenn Sie eventuell schon einmal innerhalb von Access mit ActiveX-Steuerelementen gearbeitet haben, wurden Sie sicherlich mit Problemen bei der Weitergabe Ihrer Anwendung konfrontiert.  Zum einen ist es erforderlich, dass der Ziel-PC das Microsoft-Office-Paket oder Access in der passenden Version installiert hat. Sollte dies nicht der Fall sein, bleibt Ihnen nur der Erwerb der Entwickler-Version von Access, die auch eine Laufzeitumgebung enth&auml;lt. <\/p>\n<p>Zudem ist es erforderlich, dass der Ziel-Rechner ebenfalls die bei der Entwicklung verwendeten ActiveX-Steuerelemente enth&auml;lt. Da diese &#8211; anders als bei einer Access-Datenbankdatei &#8211; nicht einfach auf den Ziel-Rechner kopiert, sondern vorschriftsm&auml;&szlig;ig installiert und in der Registry eingetragen werden m&uuml;ssen, ist die Erstellung eines Setup-Programms erforderlich. Dies verursacht nat&uuml;rlich zus&auml;tzlichen Aufwand und bringt auch wieder Probleme mit sich, falls die ActiveX-Controls bereits auf dem Ziel-Rechner vorhanden sind, aber eine andere Versionsnummer haben. Sollte die vorhandene Version kleiner als die von Ihnen ben&ouml;tigte sein, funktioniert Ihre Anwendung eventuell nicht richtig. Wenn Sie die Version dagegen durch eine neuere ersetzen, k&ouml;nnten damit bereits vorhandene Anwendungen auf dem Ziel-Rechner unbrauchbar werden, da sie eine spezielle Version voraussetzen. Diese Problematik wird allgemein auch als &#8222;DLL-H&ouml;lle&#8220; bezeichnet. Sie f&uuml;hrt dazu, dass viele Access-Entwickler komplett auf den Einsatz von Komponenten verzichten, sodass sie lediglich eine einfache MDB-Datei weitergeben m&uuml;ssen. Sie nehmen hierbei oft in Kauf, dass sie Funktionen, die von Komponenten zur Verf&uuml;gung gestellt werden k&ouml;nnten, lieber in VBA nachprogrammieren, da dies das geringere &uuml;bel bedeutet.<\/p>\n<p>Alle beschriebenen Einschr&auml;nkungen haben ihren Ursprung in dem Komponentenmodell &#8222;COM&#8220; (Component Object Model) von Windows. Dies ist Basis aller klassischen Anwendungen aus dem Hause Microsoft wie zum Beispiel Word, Excel, Outlook oder Access. <\/p>\n<p>Microsoft hat sich die Aufgabe gestellt, das komplette COM-Objektmodell durch ein neues Komponentenmodell zu ersetzen. Herausgekommen ist nach fast zehn Jahren Forschungs- und Entwicklungsarbeit die .NET-Plattform.<\/p>\n<p>Das Besondere an der .NET-Plattform ist, dass sie in weiten Z&uuml;gen unabh&auml;ngig vom Betriebssystem und der darunter liegenden Hardware ist. Lediglich einige Kernbereiche nutzen Betriebssystemfunktionen. Dazu geh&ouml;ren beispielsweise der Zugriff auf das Dateisystem, die Kommunikation &uuml;ber das Netzwerk sowie die Darstellung der Benutzeroberfl&auml;che von Windows-Anwendungen.<\/p>\n<p>Tats&auml;chlich ist es so, dass ein Tochterunternehmen der Firma Novell bereits eine Version des .NET-Frameworks f&uuml;r Linux entwickelt hat. Ziel des Projekts &#8222;Mono&#8220; ist es, dass Anwendungen zwischen Linux und Windows ohne Neukompilierung ausgetauscht werden k&ouml;nnen.<\/p>\n<p>Damit dies funktioniert, besetzt das .NET-Framework ein Modul namens &#8222;Common Language Runtime&#8220;, kurz CLR. Die CLR besitzt die F&auml;higkeit, einen Programmcode kurz vor der Ausf&uuml;hrung in Anweisungen f&uuml;r das jeweilige Betriebssystem zu &uuml;bersetzen. Die &uuml;bersetzung wird auch als &#8222;Just In Time&#8220;-Kompilierung (kurz JIT) bezeichnet. Hierbei kann der Compiler den Programmcode zum Beispiel auf Ausf&uuml;hrungsgeschwindigkeit oder auf geringen Platzbedarf optimieren. Wenn Sie also auf Ihrem PC etwa Word und Access gestartet haben, also wenig Hauptspeicher zur Verf&uuml;gung steht, kann die CLR eine neu gestartete Anwendung m&ouml;glichst Platz sparend kompilieren.<\/p>\n<p>Das &#8222;Jitten&#8220; spielt auch beim Komponentenmodell eine wesentliche Rolle. Kurz vor dem Start pr&uuml;ft .NET, welche Komponenten von der Anwendung ben&ouml;tigt werden und ob diese in passenden Versionen zur Verf&uuml;gung stehen. Sollte dies der Fall sein, wird die Anwendung kompiliert und fest mit den Komponenten verkn&uuml;pft.<\/p>\n<p>Dies ben&ouml;tigt zwar etwas Zeit beim Start der Anwendung, garantiert jedoch eine hohe Ausf&uuml;hrungsgeschwindigkeit. Wird die Anwendung beendet und neu gestartet, beginnt der Vorgang von Neuem. Sollten nun neuere Komponenten zur Verf&uuml;gung stehen, werden diese nat&uuml;rlich beim Neustart ber&uuml;cksichtigt.<\/p>\n<p>Die bereits angesprochenen Komponenten werden unter .NET als &#8222;Assemblies&#8220; bezeichnet. Hierbei handelt es sich um Dateien, die aus zwei wesentlichen Bereichen bestehen: Dem Manifest und dem eigentlichen Programmcode. Das Manifest enth&auml;lt hierbei Informationen zu dem Assembly. Dazu geh&ouml;ren etwa die Versionsnummer, die Namen der enthaltenen Klassen und deren Mitglieder sowie Text- und Grafik-Ressourcen. Jedes Assembly beschreibt sich selbst also m&ouml;glichst gut, damit es von anderen Assemblies verwendet werden kann.<\/p>\n<p>Assemblies haben in der Regel die Dateiendung DLL, obwohl sie nichts mehr mit den klassischen DLLs aus der COM-Welt zu tun haben. Ausnahme bilden direkt ausf&uuml;hrbare Programme, die die Dateiendung EXE haben. .NET-EXE-Dateien enthalten im Kopf einen Boot-Bereich. Dieser teilt dem Betriebssystem mit, dass die EXE-Datei nicht auf herk&ouml;mmlichem Wege gestartet, sondern an die CLR weitergeleitet werden soll. Diese nimmt dann den Start vor.<\/p>\n<p>Vorher pr&uuml;ft sie noch die Herkunft des Assemblies und aktiviert entsprechende Sicherheitsfunktionen. Beispielsweise haben Assemblies, die aus dem Internet stammen, standardm&auml;&szlig;ig nur sehr wenig Rechte. Sie d&uuml;rfen nicht auf das Dateisystem oder die Registry zugreifen, was die Ausbreitung von .NET-Viren zusammen mit den anderen Sicherheitsfunktionen von .NET nahezu unm&ouml;glich macht.<\/p>\n<p>Wie bereits erw&auml;hnt, enthalten Assemblies neben dem beschreibenden Manifest auch den eigentlichen Programmcode; dieser liegt jedoch nicht in einer Hochsprache vor, sondern in einer Zwischen-Sprache. Diese tr&auml;gt den Namen &#8222;Intermediate Language&#8220; &#8211; kurz &#8222;IL&#8220;.<\/p>\n<p>Diese Sprache kann sehr einfach in Ausf&uuml;hrungsanweisungen f&uuml;r den Prozessor &uuml;bersetzt werden, was vom JIT-Compiler erledigt wird und eine hohe Performance garantiert.<\/p>\n<p>Die Sprache ist daher sehr hardwarenah, was f&uuml;r den normalen Programmierer wenig Komfort bedeutet. Ein Beispiel finden Sie in Abb. 1.<\/p>\n<p><IMG height=\"674\" src=\"..\/fileadmin\/_temp_\/{1BB7F714-1E34-4936-8CDB-37450C5C7355}\/pic001.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 1: Beispiel f&uuml;r IL-Code<\/b><\/p>\n<h3>Praxis-Tipp<\/h3>\n<p>Wenn Sie selbst einmal einen Blick auf den IL-Code eines Assemblies werfen m&ouml;chten, verwenden Sie das Tool ILDASM.EXE (s. Abb. 2), das zum Lieferumfang des .NET-SDKs geh&ouml;rt. Sie finden es im BIN-Ordner. Mit dem Men&uuml;punkt File\/Open k&ouml;nnen Sie ein beliebiges Assembly &ouml;ffnen und das Manifest begutachten. Bei einem Klick auf einen Klassen-Member wird der IL-Code angezeigt. <\/p>\n<p>Zur Vereinfachung der IL kommen Hochsprachen wie C# oder VB.NET ins Spiel. Ein mit diesen Sprachen erstellter Programm-Code wird mit Hilfe eines Kompilers zun&auml;chst in die IL &uuml;bersetzt und zusammen mit dem Manifest in ein Assembly gepackt.<\/p>\n<p>Dieses Assembly kann schlie&szlig;lich vom JIT-Kompiler in Maschinen-Code &uuml;bersetzt und ausgef&uuml;hrt werden.<\/p>\n<p>Andere Anbieter wie etwa Borland stellen ebenfalls Kompiler zur Verf&uuml;gung, die beispielsweise die Programmiersprache &#8222;Delphi&#8220; in die IL &uuml;bersetzen.<\/p>\n<p>Da dies relativ einfach ist, gibt es inzwischen sehr viele unterschiedliche Sprachen f&uuml;r die .NET-Plattform. Die &uuml;bersetzung der Hochsprache in die IL findet auf dem PC des Entwicklers statt, sodass dieser den Quellcode seiner Anwendung nicht weitergeben muss. Auf diese Weise kann er sein geistiges Eigentum sch&uuml;tzen.<\/p>\n<p>Hierbei gibt es jedoch eine Einschr&auml;nkung: Microsoft wollte das Komponentenmodell m&ouml;glichst effizient gestalten.<\/p>\n<p><IMG height=\"421\" src=\"..\/fileadmin\/_temp_\/{1BB7F714-1E34-4936-8CDB-37450C5C7355}\/pic002.png\" width=\"374\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b>Abb. 2: Der Disassembly ILDASM<\/b><\/p>\n<p>Zu diesem Zweck war es erforderlich, sehr viele Informationen &uuml;ber die Komponente im Manifest unterzubringen. Dazu z&auml;hlen beispielsweise auch Namen von Klassen, Prozeduren und Eigenschaften. <\/p>\n<p>Zusammen mit dem IL-Code ist es relativ einfach m&ouml;glich, den originalen Quelltext zu rekonstruieren. Hierbei fehlen zwar einige Elemente wie etwa die Namen der lokalen Variablen; die Arbeitsweise des Quellcodes l&auml;sst sich jedoch gut nachvollziehen. Wenn Ihr Quellcode also zum Beispiel sch&uuml;tzenswerte Algorithmen enth&auml;lt, sollten Sie hierauf achten.<\/p>\n<p>Da die CLR nur die rudiment&auml;ren Funktionen zur Entwicklung einer Anwendung zur Verf&uuml;gung stellt, enth&auml;lt die .NET-Plattform eine Bibliothek aus &uuml;ber 4.000 Klassen. Diese k&ouml;nnen von Programmierern zur L&ouml;sung der verschiedensten Aufgaben eingesetzt werden. Diese Bibliothek wird h&auml;ufig auch als &#8222;.NET-Framework&#8220; bezeichnet.<\/p>\n<p>Das Framework erledigt neben einfachen Funktionen wie zum Beispiel die Umwandlung einer Zahl in einen Text auch komplexe Aufgaben wie die Kommunikation mehrerer Systeme untereinander mittels Web-Service.<\/p>\n<p>Microsoft hat Wert darauf gelegt, dass f&uuml;r fast alle Alltagsaufgaben eine passende Klasse zur Verf&uuml;gung steht. Wenn Sie also beispielsweise eine Liste aus Texten sortieren m&ouml;chten, m&uuml;ssen Sie nicht zuerst einen Quick-Sort- oder Bubble-Sort-Algorithmus programmieren, sondern k&ouml;nnen direkt auf eine passende Klasse zur&uuml;ckgreifen. Der Nachteil: Es gibt so viele Klassen, dass Sie einige Zeit ben&ouml;tigen, bis Sie einen groben &uuml;berblick &uuml;ber alle Funktionsbereiche erhalten. Um Ordnung in die Klassen zu bringen, hat Microsoft diese in &#8222;Namespaces&#8220; organisiert. Der Namespace &#8222;System.IO&#8220; enth&auml;lt beispielsweise alle Klassen, die sich mit dem Lesen und Schreiben von Dateien besch&auml;ftigen. In &#8222;System.Windows.Forms&#8220; finden Sie dagegen alles N&ouml;tige, um Windows-Benutzeroberfl&auml;chen zu entwerfen.<\/p>\n<p>Das .NET-Framework ist komplett objektorientiert aufgebaut. Um dies zu verstehen, ist die Unterscheidung zwischen den Begriffen &#8222;Klasse&#8220; und &#8222;Objekt&#8220; wichtig: Eine Klasse existiert nur ein einziges Mal pro Anwendung. Sie dient als Schablone zur Erstellung eines Objekts. Wenn Sie also beispielsweise in einer Adressverwaltung zehn Personen mit den gleichen Attributen (Namen, Vorname, Ort, PLZ, &#8230;) verwalten m&ouml;chten, programmieren Sie nicht zehn Objekte, sondern nur eine einzige Klasse, und erzeugen auf Basis dieser Klasse zehn Objekte.<\/p>\n<h3>Praxis-Tipp<\/h3>\n<p>Synonym f&uuml;r den Begriff &#8222;Objekt&#8220; steht auch der Begriff &#8222;Instanz&#8220;. <\/p>\n<p>Das Erstellen einer eigenen Klasse k&ouml;nnen Sie zum Beispiel mit SharpDevelop ausprobieren. Dazu gehen Sie wie folgt vor:<\/p>\n<li>Falls noch nicht geschehen, installieren Sie SharpDevelop und das .NET-Framework nach der Beschreibung des Beitrags .NET-Programmierung mit SharpDevelop aus Ausgabe 4\/2004.<\/li>\n<li>Starten Sie SharpDevelop.<\/li>\n<li>W&auml;hlen Sie den Men&uuml;punkt Datei\/Neu\/Combine aus.<\/li>\n<li>Klicken Sie auf die Kategorie VBNET und die Schablone Konsolenanwendung.<\/li>\n<li>Geben Sie unter Name den Projektnamen Personenverwaltung ein.<\/li>\n<li>Best&auml;tigen Sie mit Erstellen. (<\/li>\n<p>Auf dem Bildschirm ist nun ein neues, leeres Projekt sichtbar. Starten Sie das Projekt testweise mit der Taste F5. <\/p>\n<p>Es erscheint ein Konsolenfenster auf dem Bildschirm, in dem der Text &#8222;Hello World&#8220; ausgegeben wird.<\/p>\n<h3>Praxis-Tipp<\/h3>\n<p>Konsolen-Anwendungen bieten nur eine eingeschr&auml;nkte Benutzeroberfl&auml;che nach dem Vorbild von DOS. Der Vorteil ist, dass die komplexen Benutzeroberfl&auml;chen-Klassen zun&auml;chst au&szlig;en vor bleiben und der Einstieg in .NET damit leichter f&auml;llt. <\/p>\n<p>Zur Anlage der ersten Klasse gehen Sie wie folgt vor:<\/p>\n<li>Klicken Sie im Projekt-Explorer von SharpDevelop den Eintrag Personenverwaltung mit der rechten Maustaste an. Wenn der Projekt-Explorer nicht sichtbar ist, hilft die Tastenkombination Strg + Alt + L weiter.<\/li>\n<li>W&auml;hlen Sie den Men&uuml;punkt Hinzuf&uuml;gen\/Neue Datei aus.<\/li>\n<li>Klicken Sie auf die Kategorie VB und die Schablone Klasse.<\/li>\n<li>Geben Sie unter Dateiname den Text Person.vb ein.<\/li>\n<li>Best&auml;tigen Sie mit Erstellen. (<\/li>\n<p>Im Quellcode-Editor erscheint nun der folgende Programmcode:<\/p>\n<pre>Imports System\nNamespace Personenverwaltung\n    Public Class Person\n        Public Sub New()\n        End Sub\n    End Class\nEnd Namespace<\/pre>\n<p>Die eigentliche Klasse beginnt mit der Zeile Public Class Person und endet mit End Class.<\/p>\n<p>Die komplette Klasse ist eingekapselt durch die Zeilen Namespace Personenverwaltung und End Namespace. Dies bedeutet, dass die neue Klasse zum Namespace Personenverwaltung geh&ouml;rt. Zur Erinnerung: Namespaces dienen der besseren Organisation von Klassen. So k&ouml;nnten Sie beispielsweise alle Klassen, die sich mit der Verwaltung von Personen besch&auml;ftigen, in den Namespace Personenverwaltung einordnen und alle Klassen zum Thema Projektverwaltung in den Namespace Projektverwaltung.<\/p>\n<p>Zu Beginn ist noch eine Imports-Anweisung angegeben. Diese bewirkt eine Abk&uuml;rzung bei dem Verweis auf Klassen. Wenn Sie beispielsweise auf die Klasse System.IO.FileInfo zugreifen m&ouml;chten, k&ouml;nnen Sie im Programmcode entweder mit <\/p>\n<pre>System.IO.FileInfo<\/pre>\n<p>den kompletten Pfad angeben oder den Namespace System.IO mit<\/p>\n<pre>Imports System.IO<\/pre>\n<p>importieren. In Zukunft reicht dann die einfache Angabe<\/p>\n<pre>FileInfo<\/pre>\n<p>aus, um auf die Klasse zu verweisen.<\/p>\n<p>Sinn und Zweck der neuen Klasse soll es sein, die Anschrift-Daten einer Person zu verwalten. Zu diesem Zweck werden der Klasse nun entsprechende Variablen hinzugef&uuml;gt, die von au&szlig;en zug&auml;nglich sind. Solche Variablen werden auch als Felder bezeichnet.<\/p>\n<p>Erg&auml;nzen Sie die Klasse wie folgt:<\/p>\n<pre>Public Class Person\n    Public Nachname As String\n    Public Vorname As String\n    Public Stra&szlig;e As String\n    Public PLZ As String\n    Public Ort As String\n    Public Geburtsdatum As DateTime\n    Public Sub New()\n    End Sub\nEnd Class\nImports System\nImports Personenverwaltung\nModule Main\n    Sub Main()\n        Dim ErstePerson As Person\n        ErstePerson = new Person()\n        ErstePerson.Nachname = \"Mustermann\"\n        ErstePerson.Vorname = \"Hans\"\n        ErstePerson.Stra&szlig;e = \"Musterstra&szlig;e 1\"\n        ErstePerson.PLZ = \"40211\"\n        ErstePerson.Ort = \"D&uuml;sseldorf\"\n    End Sub\nEnd Module<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<p>Wechseln Sie danach durch einen Doppelklick im Projekt-Explorer auf Main.vb zur&uuml;ck und &auml;ndern Sie den Programmcode wie in Quellcode 1 ab.<\/p>\n<p>Die Zeile Dim ErstePerson As Person definiert zun&auml;chst die neue Variable ErstePerson, die eine Objektinstanz des Typs Person repr&auml;sentieren k&ouml;nnte. Das Objekt existiert jedoch zum jetzigen Zeitpunkt noch nicht.<\/p>\n<p>Die folgende Zeile legt das Objekt schlie&szlig;lich mit Hilfe des Schl&uuml;sselworts New an und weist es der Variablen ErstePerson zu.<\/p>\n<p>Abschlie&szlig;end erfolgt die Zuweisung des Namens sowie der Adressdaten.<\/p>\n<p>Um zu pr&uuml;fen, ob Sie alles korrekt eingegeben haben, starten Sie das Programm mit der Taste F5. Sollten Fehler vorhanden sein, werden diese im Fenster Aufgaben von SharpDevelop aufgelistet. Gegebenenfalls m&uuml;ssen Sie das Fenster zuerst &uuml;ber das Register Aufgaben im unteren linken Bereich sichtbar machen.<\/p>\n<p>Zum guten Stil objektorientierter Programmierung geh&ouml;rt es, den inneren Aufbau einer Klasse vor dem Nutzer zu verbergen.<\/p>\n<p>Auf diese Weise kann der interne Aufbau beliebig ge&auml;ndert werden &#8211; beispielsweise um eine bessere Performance zu erzielen -, ohne dass die Nutzer der Klasse hiervon betroffen sind oder deren Aufrufe ge&auml;ndert werden m&uuml;ssen.<\/p>\n<p>Grundlage hierzu ist, dass die Variablen der Klasse nicht direkt von au&szlig;en zug&auml;nglich sind. Im Falle der Personenklasse bedeutet dies, dass die einzelnen Personenangaben nicht als Public, sondern als Private definiert werden. Dadurch kann man nur noch von innerhalb der Klasse auf die Variablen zugreifen:<\/p>\n<pre>Private m_Nachname As String\nPrivate m_Vorname As String\nPrivate m_Stra&szlig;e As String\nPrivate m_PLZ As String\nPrivate m_Ort As String<\/pre>\n<p>Um diese Variablen besser von nach au&szlig;en sichtbaren Klassenmitgliedern zu unterscheiden, sind die Namen mit dem Pr&auml;fix &#8222;m_&#8220; f&uuml;r &#8222;Member&#8220; versehen. Diese Konvention ist allerdings nicht zwingend, da die Namensgebung im Verantwortungsbereich des Programmierers liegt.<\/p>\n<p>Doch wie kann man nun von au&szlig;en zum Beispiel auf den Nachnamen zugreifen? Dieses Problem l&ouml;st die folgende &ouml;ffentliche Property-Prozedur:<\/p>\n<pre>Public Property Nachname As String\n    Get\n        Return m_Nachname\n    End Get\n    Set(ByVal Value As String)\n        If Value.Length = 0 Then\n            m_Nachname = \"(Unbekannt)\"\n        Else\n            m_Nachname = Value\n        End If\n    End Set\nEnd Property<\/pre>\n<p>Die Prozedur besteht aus einem Get- und einem Set-Teil. Der Get-Teil wird beim lesenden Zugriff, der Set-Teil beim schreibenden Zugriff aufgerufen. Im ersten Fall wird der Wert der privaten Variablen m_Nachname mittels Return-Anweisung zur&uuml;ckgeliefert. Im zweiten Fall wird dagegen der Wert der privaten Variablen ver&auml;ndert. Sollte ein Leerstring &uuml;bergeben werden, wird der Text &#8222;(Unbekannt)&#8220; eingetragen, ansonsten der &uuml;bergebene Name.<\/p>\n<pre>Public Function AnschriftErmitteln As String\n    Dim Anschrift As String\n    Anschrift = (m_Vorname + \" \" + m_Nachname).Trim\n    Anschrift += Microsoft.VisualBasic.ControlChars.CrLf\n    Anschrift += m_Stra&szlig;e\n    Anschrift += Microsoft.VisualBasic.ControlChars.CrLf\n    Anschrift += m_PLZ + \" \" + m_Ort\n    Return Anschrift\nEnd Function<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<p>Alle weiteren privaten Variablen m&uuml;ssen ebenfalls entsprechend gekapselt werden. Das folgende Beispiel zeigt dies exemplarisch f&uuml;r den Vornamen, wobei auf die Leerstring-Pr&uuml;fung verzichtet wird:<\/p>\n<pre>Public Property Vorname As String\n    Get\n        Return m_Vorname\n    End Get\n    Set(ByVal Value As String)\n        m_Vorname = Value\n   End Set\nEnd Property<\/pre>\n<p>Im jetzigen Zustand hat die Klasse Person noch eine Schwachstelle: Sobald ein Objekt erzeugt wurde, enthalten alle Variablen Null-Werte.<\/p>\n<p>Das Objekt hat damit keinen sinnvollen Zustand und es ist darauf angewiesen, dass der Nutzer der Klasse beispielsweise irgendwann einen Nachnamen und einen Vornamen zuweist.<\/p>\n<p>Besser w&auml;re es, wenn der Nutzer direkt bei der Anlage dazu gezwungen w&auml;re, einen Nachnamen und einen Vornamen anzugeben. Dieses Problem l&ouml;st der Konstruktor. Bei der Anlage der Klasse Person hat SharpDevelop automatisch einen leeren Konstruktor angelegt:<\/p>\n<pre>Public Sub New()\nEnd Sub<\/pre>\n<p>Erg&auml;nzen Sie diesen Konstruktor wie folgt:<\/p>\n<pre>Public Sub New(Nachname As String, _    Vorname As String)\n    m_Nachname = Nachname\n    m_Vorname = Vorname\nEnd Sub<\/pre>\n<p>Wenn Sie nun eine neue Instanz der Klasse Person anlegen, m&uuml;ssen Sie den Nachnamen und den Vornamen direkt mit angeben, wie das folgende Beispiel zeigt (ohne Zeilenumbruch):<\/p>\n<pre>ErstePerson = New Person(\"Mustermann\", \"Hans\")<\/pre>\n<p>Dementsprechend m&uuml;ssen Sie auch das Hauptmodul Ihrer Anwendung anpassen:<\/p>\n<pre>Sub Main()\n    Dim ErstePerson As Person\n    ErstePerson = New _        Person(\"Mustermann\", \"Hans\")\n    ErstePerson.Stra&szlig;e = \"Musterstra&szlig;e 1\"\n    ErstePerson.PLZ = \"40211\"\n    ErstePerson.Ort = \"D&uuml;sseldorf\"\nEnd Sub<\/pre>\n<p>Bis jetzt hat die erstellte Klasse lediglich das Speichern von Adressdaten erm&ouml;glicht. Die Klasse erledigt jedoch noch keine konkrete Aufgabe. Solche Aufgaben werden mit Hilfe von Methoden implementiert.<\/p>\n<p>Die folgende Methode ermittelt beispielsweise aus den Adressangaben eine vollst&auml;ndige Anschrift, die zum Beispiel auf einen Brief gedruckt werden k&ouml;nnte (s. Quellcode 2).<\/p>\n<p>F&uuml;gen Sie die Methode innerhalb der Klasse hinter den bereits existierenden Property-Prozeduren ein.<\/p>\n<pre>Sub Main()\n    Dim ErstePerson As Person\n    ErstePerson = new Person(\"Mustermann\", \"Hans\")\n    ErstePerson.Stra&szlig;e = \"Musterstra&szlig;e 1\"\n    ErstePerson.PLZ = \"40211\"\n    ErstePerson.Ort = \"D&uuml;sseldorf\"\n    Console.WriteLine(ErstePerson.AnschriftErmitteln())\nEnd Sub<\/pre>\n<p><b>Quellcode 3<\/b><\/p>\n<pre>Public Class Mitarbeiter: Inherits Person\n    Private m_Personalnummer As Integer\n    Public Sub New(Nachname As String, Vorname As String, Personalnummer As Integer)\n        MyBase.New(Nachname, Vorname)\n        m_Personalnummer = Personalnummer\n    End Sub\n    Public Readonly Property Personalnummer As Integer\n        Get\n            Return m_Personalnummer\n        End Get\n    End Property\n    Public Shadows Function AnschriftErmitteln As String\n        Dim Anschrift As String\n        Anschrift = \"Personalnummer \" + m_Personalnummer.ToString()\n        Anschrift += Microsoft.VisualBasic.ControlChars.CrLf\n        Anschrift += MyBase.AnschriftErmitteln()\n    End Function\nEnd Class<\/pre>\n<p><b>Quellcode 4<\/b><\/p>\n<h3>Praxis-Tipp<\/h3>\n<p>Der Operator += bewirkt, dass .NET der Variablen den nachfolgenden Text anh&auml;ngt. <\/p>\n<p>Zum Einsatz der neuen Methode erg&auml;nzen Sie die Hauptprozedur wie in Quellcode 3. Die Zeile vor End Sub ruft die neu erstellte Methode auf und gibt das Ergebnis im Konsolenfenster aus.<\/p>\n<p>Eines der wichtigsten Konzepte der objektorientierten Programmierung ist die M&ouml;glichkeit der Vererbung. Hierbei kann eine Klasse alle Eigenschaften und Methoden einer Basisklasse erben und weitere Funktionen hinzuf&uuml;gen. Ein Beispiel hierf&uuml;r ist eine Klasse namens Mitarbeiter. Ein Mitarbeiter hat generell alle Methoden und Eigenschaften der Klasse Person, soll aber zus&auml;tzlich noch eine Personalnummer besitzen.<\/p>\n<p>Um eine entsprechende Klasse anzulegen, gehen Sie wie folgt vor:<\/p>\n<li>Klicken Sie im Projekt-Explorer von SharpDevelop den Eintrag Personenverwaltung mit der rechten Maustaste an und w&auml;hlen Sie den Men&uuml;punkt Hinzuf&uuml;gen\/Neue Datei aus.<\/li>\n<li>Klicken Sie auf die Kategorie VB und die Schablone Klasse.<\/li>\n<li>Geben Sie unter Dateiname den Text Mitarbeiter.vb ein.<\/li>\n<li>Best&auml;tigen Sie mit Erstellen.<\/li>\n<li>Erg&auml;nzen Sie die Klasse wie in Quellcode 4 abgebildet. (<\/li>\n<p>Im Kopf der Klasse wird &uuml;ber das Schl&uuml;sselwort Inherits definiert, dass diese Klasse von der Klasse Person abstammt.<\/p>\n<pre>Sub Main()\n    Dim ErstePerson As Person\n    ErstePerson = new Person(\"Mustermann\", \"Hans\")\n    ErstePerson.Stra&szlig;e = \"Musterstra&szlig;e 1\"\n    ErstePerson.PLZ = \"40211\"\n    ErstePerson.Ort = \"D&uuml;sseldorf\"\n    Console.WriteLine(ErstePerson.AnschriftErmitteln())\n    Dim ZweitePerson As Mitarbeiter\n    ZweitePerson = new Mitarbeiter(\"Angestellter\", _        \"Hans\", 24334)\n    ZweitePerson.Stra&szlig;e = \"Steinstra&szlig;e 5\"\n    ZweitePerson.PLZ = \"50233\"\n    ZweitePerson.Ort = \"K&ouml;ln\"\n    Console.WriteLine(ZweitePerson.AnschriftErmitteln())\nEnd Sub<\/pre>\n<p><b>Quellcode 5<\/b><\/p>\n<p>Der Konstruktor wurde um die Personalnummer erweitert, sodass diese bei der Anlage eines neuen Mitarbeiters mit angegeben werden muss. Innerhalb des Konstruktors wird mit Hilfe der MyBase.New-Anweisung als Erstes der Konstruktor der Basisklasse Person aufgerufen und der Nachname sowie der Vorname &uuml;bergeben. Anschlie&szlig;end erfolgt die Zuweisung der Personalnummer.<\/p>\n<p>Die Property-Prozedur Personalnummer ist mit dem Schl&uuml;sselwort ReadOnly definiert. Au&szlig;erdem ist nur der Get-Teil implementiert. Dies bewirkt, dass die Personalnummer nach der Anlage des Objekts nur noch gelesen, jedoch nicht mehr ver&auml;ndert werden kann.<\/p>\n<p>Die Methode AnschriftErmitteln wurde so erweitert, dass zu Beginn der Text &#8222;Personalnummer&#8220; gefolgt von der Personalnummer ausgegeben wird. Die Umwandlung der Personalnummer von einer Zahl in einen Text erfolgt hierbei mit der ToString-Methode, die bei allen .NET-Objekten standardm&auml;&szlig;ig zur Verf&uuml;gung steht.<\/p>\n<p>Nachdem die Personalnummer hinzugef&uuml;gt wurde, ruft die Prozedur die gleichnamige Prozedur der Basisklasse auf und l&auml;sst sich von dieser den restlichen Teil der Adresse &uuml;bergeben.<\/p>\n<h3>Praxis-Tipp<\/h3>\n<p>Da die Prozedur AnschriftErmitteln in der Person-Klasse und in der Mitarbeiter-Klasse den gleichen Namen hat, muss die Methode in der abgeleiteten Klasse mit dem Schl&uuml;sselwort Shadows deklariert werden. Ansonsten kommt es zu einem Namenskonflikt. <\/p>\n<p>Zum Test der neuen Klasse erg&auml;nzen Sie die Hauptprozedur wie in Quellcode 5.<\/p>\n<p>Neben der ersten wird nun noch eine zweite Person definiert, diesmal jedoch vom Typ Mitarbeiter.<\/p>\n<p>Per Konstruktor werden die Mitarbeiterdaten &uuml;bergeben und danach die Anschrift erg&auml;nzt. Zuletzt erfolgt eine Ausgabe der Anschrift im Konsolenfenster.<\/p>\n<p>Sie haben in diesem Artikel den grunds&auml;tzlichen Aufbau der .NET-Plattform sowie die Grundz&uuml;ge der objektorientierten Programmierung kennen gelernt.<\/p>\n<p>Insbesondere die Einarbeitung in die Objektorientierung bedeutet f&uuml;r viele Programmierer eine wichtige und oftmals nicht einfache Umstellung in der Denkweise. Wir werden Sie hierbei noch durch weitere Artikel unterst&uuml;tzen, die anhand von Praxisbeispielen den Umgang mit .NET vertiefen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Entwicklung von Anwendungen auf der .NET-Plattform gewinnt immer mehr an Bedeutung. Auch f&uuml;r Access-Entwickler stellt sich daher die Frage, ob bestimmte Anwendungen nicht besser mit .NET als mit Access entwickelt werden sollten. Dies trifft insbesondere auf moderne Anwendungen zu, die beispielsweise per Web-Service mit anderen Systemen kommunizieren, auf unterschiedliche Daten-bank-Server zugreifen und das Benutzer-Interface im Web pr&auml;sentieren. In diesem Artikel stellen wir Ihnen die .NET-Plattform genauer vor und zeigen Ihnen, wie Sie als VBA-Programmierer m&ouml;glichst einfach auf VB.NET umsteigen 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":[44000017,662004,66052004,44000025],"tags":[],"class_list":["post-55000234","post","type-post","status-publish","format-standard","hentry","category-NET","category-662004","category-66052004","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Von VBA zu VB.NET - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Von VBA zu VB.NET\" \/>\n<meta property=\"og:description\" content=\"Die Entwicklung von Anwendungen auf der .NET-Plattform gewinnt immer mehr an Bedeutung. Auch f&uuml;r Access-Entwickler stellt sich daher die Frage, ob bestimmte Anwendungen nicht besser mit .NET als mit Access entwickelt werden sollten. Dies trifft insbesondere auf moderne Anwendungen zu, die beispielsweise per Web-Service mit anderen Systemen kommunizieren, auf unterschiedliche Daten-bank-Server zugreifen und das Benutzer-Interface im Web pr&auml;sentieren. In diesem Artikel stellen wir Ihnen die .NET-Plattform genauer vor und zeigen Ihnen, wie Sie als VBA-Programmierer m&ouml;glichst einfach auf VB.NET umsteigen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-10T14:47:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-19T08:17:02+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/0098d0e628f24d24b1fd4231924d6417\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Von VBA zu VB.NET\",\"datePublished\":\"2023-02-10T14:47:27+00:00\",\"dateModified\":\"2024-02-19T08:17:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/\"},\"wordCount\":3206,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0098d0e628f24d24b1fd4231924d6417\",\"articleSection\":[\".NET\",\"2004\",\"5\\\/2004\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/\",\"name\":\"Von VBA zu VB.NET - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0098d0e628f24d24b1fd4231924d6417\",\"datePublished\":\"2023-02-10T14:47:27+00:00\",\"dateModified\":\"2024-02-19T08:17:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0098d0e628f24d24b1fd4231924d6417\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0098d0e628f24d24b1fd4231924d6417\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/von_vba_zu_vbnet\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Von VBA zu VB.NET\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Von VBA zu VB.NET - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/","og_locale":"de_DE","og_type":"article","og_title":"Von VBA zu VB.NET","og_description":"Die Entwicklung von Anwendungen auf der .NET-Plattform gewinnt immer mehr an Bedeutung. Auch f&uuml;r Access-Entwickler stellt sich daher die Frage, ob bestimmte Anwendungen nicht besser mit .NET als mit Access entwickelt werden sollten. Dies trifft insbesondere auf moderne Anwendungen zu, die beispielsweise per Web-Service mit anderen Systemen kommunizieren, auf unterschiedliche Daten-bank-Server zugreifen und das Benutzer-Interface im Web pr&auml;sentieren. In diesem Artikel stellen wir Ihnen die .NET-Plattform genauer vor und zeigen Ihnen, wie Sie als VBA-Programmierer m&ouml;glichst einfach auf VB.NET umsteigen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-02-10T14:47:27+00:00","article_modified_time":"2024-02-19T08:17:02+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/0098d0e628f24d24b1fd4231924d6417","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Von VBA zu VB.NET","datePublished":"2023-02-10T14:47:27+00:00","dateModified":"2024-02-19T08:17:02+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/"},"wordCount":3206,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/0098d0e628f24d24b1fd4231924d6417","articleSection":[".NET","2004","5\/2004","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/","url":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/","name":"Von VBA zu VB.NET - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/0098d0e628f24d24b1fd4231924d6417","datePublished":"2023-02-10T14:47:27+00:00","dateModified":"2024-02-19T08:17:02+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/0098d0e628f24d24b1fd4231924d6417","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/0098d0e628f24d24b1fd4231924d6417"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/von_vba_zu_vbnet\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Von VBA zu VB.NET"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000234"}],"version-history":[{"count":1,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000234\/revisions"}],"predecessor-version":[{"id":88075292,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000234\/revisions\/88075292"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}