{"id":55001573,"date":"2025-12-01T00:00:00","date_gmt":"2025-12-02T21:35:34","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1573"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"ListViewSteuerelement_mit_VBA_programmieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/","title":{"rendered":"ListView-Steuerelement mit VBA programmieren"},"content":{"rendered":"<p><b>Im Beitrag &#8222;ListView-Steuerelement mit VBA programmieren&#8220; (www.access-im-unternehmen.de\/1573) haben wir gezeigt, wie wir mit dem ListView-Steuerelement arbeiten k&ouml;nnen. Dort haben wir bereits einige grundlegende VBA-Techniken gezeigt, mit denen wir das ListView-Steuerelement in den verschiedenen Ansichten mit Daten gef&uuml;llt haben. Im vorliegenden Beitrag geht es nun weiter: Wir zeigen, wie wir das Steuerelement per VBA programmieren k&ouml;nnen. Dabei liegt der Fokus auf den Methoden, mit denen wir auf Benutzereingaben reagieren oder verschiedene Informationen auslesen &#8211; zum Beispiel das aktuell markierte Element. Auch auf Mehrfachauswahl gehen wir ein, die wir sowohl setzen als auch auslesen werden. Und nat&uuml;rlich wird auch Drag and Drop eine Rolle in diesem Beitrag spielen.<\/b><\/p>\n<h2>Ereignisse des ListView-Steuerelements <\/h2>\n<p>Das <b>ListView<\/b>-Steuerelement bietet einige Ereignisse an, die wir uns in den folgenden Abschnitten genauer ansehen. Hier zun&auml;chst eine &Uuml;bersicht mit den Funktionen der Ereignisse:<\/p>\n<ul>\n<li><b>AfterLabelEdit<\/b>: Wird ausgel&ouml;st, nachdem der Benutzer die Bearbeitung einer Beschriftung beendet hat. Dient zur Pr&uuml;fung oder Speicherung des ge&auml;nderten Textes.<\/li>\n<li><b>BeforeLabelEdit<\/b>: Tritt auf, bevor ein Benutzer die Beschriftung bearbeiten darf. Erm&ouml;glicht das Zulassen oder Verhindern des Editierens, wenn der Benutzer ein Element zu Bearbeiten anklicken will.<\/li>\n<li><b>Click<\/b>: Wird ausgel&ouml;st, wenn der Benutzer auf das Steuerelement klickt (einfacher Klick, unabh&auml;ngig vom ausgew&auml;hlten Element).<\/li>\n<li><b>ColumnClick<\/b>: Wird ausgel&ouml;st, wenn der Benutzer auf eine Spalten&uuml;berschrift klickt. Wird h&auml;ufig genutzt, um die Sortierung nach Spalten zu steuern.<\/li>\n<li><b>DblClick<\/b>: Wird ausgel&ouml;st, wenn der Benutzer auf ein Element doppelklickt. Dient oft zum &Ouml;ffnen oder Bearbeiten des gew&auml;hlten Eintrags.<\/li>\n<li><b>ItemCheck<\/b>: Tritt auf, wenn ein Kontrollk&auml;stchen neben einem <b>ListItem<\/b> aktiviert oder deaktiviert wird. Nur relevant, wenn <b>Checkboxes = True <\/b>gesetzt ist.<\/li>\n<li><b>ItemClick<\/b>: Wird ausgel&ouml;st, wenn der Benutzer auf ein bestimmtes <b>ListItem<\/b>-Element klickt. Liefert direkten Zugriff auf das betroffene Element.<\/li>\n<li><b>KeyDown<\/b>: Wird ausgel&ouml;st, wenn eine Taste gedr&uuml;ckt wird. Liefert Informationen &uuml;ber Tastencode und Status von <b>Umschalt<\/b>-, <b>Strg<\/b>&#8211; oder <b>Alt<\/b>-Tasten.<\/li>\n<li><b>KeyPress<\/b>: Wird ausgel&ouml;st, wenn ein druckbares Zeichen eingegeben wird. Dient h&auml;ufig zur Filterung von Eingaben.<\/li>\n<li><b>KeyUp<\/b>: Wird ausgel&ouml;st, wenn eine Taste losgelassen wird. Kann genutzt werden, um Tastenkombinationen auszuwerten.<\/li>\n<li><b>MouseDown<\/b>: Wird ausgel&ouml;st, wenn eine Maustaste gedr&uuml;ckt wird. Liefert Informationen &uuml;ber Maustaste, Position und Status der Umschalttasten.<\/li>\n<li><b>MouseMove<\/b>: Wird ausgel&ouml;st, wenn der Mauszeiger &uuml;ber das Steuerelement bewegt wird. N&uuml;tzlich f&uuml;r eigene Hover-Effekte.<\/li>\n<li><b>MouseUp<\/b>: Wird ausgel&ouml;st, wenn eine zuvor gedr&uuml;ckte Maustaste losgelassen wird.<\/li>\n<li><b>OLECompleteDrag<\/b>: Wird ausgel&ouml;st, nachdem eine Drag and Drop-Operation abgeschlossen wurde. Dient zum Bereinigen oder Aktualisieren des Zustands.<\/li>\n<li><b>OLEDragDrop<\/b>: Wird ausgel&ouml;st, wenn ein Objekt &uuml;ber dem Steuerelement abgelegt wird. Hier wird &uuml;blicherweise der Drop-Inhalt verarbeitet.<\/li>\n<li><b>OLEDragOver<\/b>: Wird fortlaufend ausgel&ouml;st, w&auml;hrend ein Objekt &uuml;ber dem Steuerelement bewegt wird. Eignet sich zur Anzeige von Drop-Zielen.<\/li>\n<li><b>OLEGiveFeedback<\/b>: Wird w&auml;hrend einer Drag and Drop-Operation ausgel&ouml;st. Erm&ouml;glicht die Anpassung des Mauszeigers oder Feedback-Verhaltens.<\/li>\n<li><b>OLESetData<\/b>: Wird ausgel&ouml;st, wenn das Steuerelement Daten bereitstellen soll, die per Drag and Drop &uuml;bergeben werden.<\/li>\n<li><b>OLEStartDrag<\/b>: Wird ausgel&ouml;st, wenn der Benutzer eine Drag and Drop-Operation startet. Hier werden &uuml;blicherweise die zu &uuml;bertragenden Daten festgelegt.<\/li>\n<li><b>Updated<\/b>: wird in VBA nicht ausgel&ouml;st<\/li>\n<\/ul>\n<h2>Spaltenk&ouml;pfe und Eintr&auml;ge vor dem erneuten F&uuml;llen leeren<\/h2>\n<p>Manchmal werden die angelegten Eintr&auml;ge f&uuml;r die Spaltenk&ouml;pfe und die Zeilen des <b>ListView<\/b>-Steuerelements beim Schlie&szlig;en gespeichert, sodass ein erneutes &Ouml;ffnen und der Versuch, die Elemente erneut anzulegen, zu einem Fehler f&uuml;hrt.<\/p>\n<p>Daher sollte man diese Elemente vorsichtshalber immer l&ouml;schen, bevor man das <b>ListView<\/b>-Steuerelement erneut f&uuml;llt:<\/p>\n<pre>objListView.ColumnHeaders.Clear\r\nobjListView.ListItems.Clear<\/pre>\n<h2>Spalten anordnen<\/h2>\n<p>Damit der Benutzer die Spalten eines <b>ListView<\/b>-Steuerelements anordnen kann, m&uuml;ssen wir die Eigenschaft <b>AllowColumnReorder <\/b>auf <b>True <\/b>einstellen:<\/p>\n<pre>objListView.AllowColumnReorder = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Danach kann der Benutzer die Spalten wie in Bild 1 umsortieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_001.png\" alt=\"Umsortierte Spalten im ListView-Steuerelement\" width=\"499,5589\" height=\"258,124\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Umsortierte Spalten im ListView-Steuerelement<\/span><\/b><\/p>\n<p>Leider gibt es kein Ereignis, dass durch das Umsortieren ausgel&ouml;st wird, sodass wir die Anordnung nicht ohne gr&ouml;&szlig;eren Aufwand speichern und beim n&auml;chsten &Ouml;ffnen des Formulars wiederherstellen k&ouml;nnen (siehe Formular <b>frmListView_SpaltenAnordnen <\/b>der Beispieldatenbank).<\/p>\n<h2>Selektierte Spalten vollst&auml;ndig markieren<\/h2>\n<p>Vom Listenfeld von Access sind wir gewohnt, dass markierte Eintr&auml;ge vollst&auml;ndig markiert werden. Im <b>ListView<\/b>-Steuerelement wird standardm&auml;&szlig;ig nur die erste Spalte des ausgew&auml;hlten Eintrags markiert. Dies k&ouml;nnen wir &auml;ndern, indem wir die Eigenschaft <b>FullRowSelect <\/b>auf <b>True <\/b>einstellen:<\/p>\n<pre>objListView.FullRowSelect = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Markieren wir nun eine Zeile, werden alle Spalten markiert (siehe Bild 2) &#8211; siehe <b>frmListView_EintragMarkieren<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_004.png\" alt=\"Vollst&auml;ndige Zeile markieren\" width=\"424,5589\" height=\"217,9655\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Vollst&auml;ndige Zeile markieren<\/span><\/b><\/p>\n<h2>Markierung bei Fokusverlust beibehalten<\/h2>\n<p>Standardm&auml;&szlig;ig ist die Markierung des aktuellen Eintrags nicht mehr sichtbar, wenn das <b>ListView<\/b>-Steuerelement den Fokus verliert.<\/p>\n<p>Dem k&ouml;nnen wir zumindest teilweise entgegenwirken, indem wir die Eigenschaft <b>HideSelection <\/b>auf <b>False <\/b>einstellen:<\/p>\n<pre>objListView.HideSelection = <span style=\"color:blue;\">False<\/span><\/pre>\n<p>Die aktuelle Zeile wird nun immerhin noch grau hinterlegt (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_005.png\" alt=\"Markierung im ListView-Steuerelement bei Fokusverlust beibehalten\" width=\"424,5589\" height=\"217,9655\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Markierung im ListView-Steuerelement bei Fokusverlust beibehalten<\/span><\/b><\/p>\n<h2>Objektvariable modulweit deklarieren<\/h2>\n<p>In den folgenden Beispielen wollen wir aus anderen Prozeduren heraus auf das <b>ListView<\/b>-Steuerelement zugreifen. Dazu k&ouml;nnten wir dieses immer wieder neu deklarieren und referenzieren, aber diesen Aufwand wollen wir uns sparen. Also deklarieren wir <b>objListView <\/b>wie folgt im Kopf der Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objListView<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView<\/pre>\n<p>Dann reicht es, wenn wir diese Variable einmal in der Ereignisprozedur <b>Beim Laden <\/b>f&uuml;llen:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objListView = Me.ctlListView.Object<\/pre>\n<p>In den weiteren Prozeduren k&ouml;nnen wir anschlie&szlig;end einfach auf <b>objListView <\/b>zugreifen.<\/p>\n<h2>Markierten Eintrag auslesen<\/h2>\n<p>Im Formular <b>frmListView_Auslesen <\/b>zeigen wir, wie der aktuell markierte Listeneintrag ausgelesen werden kann. Dabei greifen wir auf den Key und den Text der ersten Spalte zu und geben diese Informationen in einem Meldungsfenster aus (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_002.png\" alt=\"Eintrag im ListView-Steuerelement auslesen\" width=\"499,5589\" height=\"307,9849\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Eintrag im ListView-Steuerelement auslesen<\/span><\/b><\/p>\n<p>F&uuml;r die Schaltfl&auml;che <b>cmdAktuellenEintragAuslesen <\/b>hinterlegen wir den folgenden Code:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAktuellenEintragAuslesen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.SelectedItem\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objListItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es wurde der Eintrag mit dem Key ''\" _\r\n             & objListItem.Key & \"'' und dem Text ''\" _\r\n             & objListItem.Text & \"'' ausgew&auml;hlt.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier lesen wir mit der Eigenschaft <b>SelectedItem <\/b>den aktuellen Eintrag aus. Ist das Ergebnis nicht <b>Nothing<\/b>, k&ouml;nnen wir &uuml;ber die Eigenschaften <b>Key <\/b>und <b>Text <\/b>von <b>objListItem <\/b>auf die entsprechenden Werte zugreifen.<\/p>\n<h2>Werte weiterer Spalten auslesen<\/h2>\n<p>Gegebenenfalls sind auch noch die &uuml;brigen Spalten des aktuell markierten Eintrags interessant. Diese wollen wir ein einer Meldung wie in Bild 5 ausgeben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_003.png\" alt=\"Weitere Spalten des markierten Eintrags auslesen\" width=\"424,5589\" height=\"268,8873\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Weitere Spalten des markierten Eintrags auslesen<\/span><\/b><\/p>\n<p>Dazu f&uuml;gen wir f&uuml;r die zweite Schaltfl&auml;che diese Prozedur hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdWeitereSpaltenAuslesen_Click()\r\n     ...\r\n     <span style=\"color:blue;\">Dim <\/span>objListSubItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListSubItem\r\n     <span style=\"color:blue;\">Dim <\/span>strSubItems<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.SelectedItem\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objListItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         For Each objListSubItem In objListItem.ListSubItems\r\n             <span style=\"color:blue;\">With<\/span> objListSubItem\r\n                 strSubItems = strSubItems & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                     & .Index & \" \" & .Key & \" \" & .Text\r\n             End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> objListSubItem\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Weitere Spalten: \" & strSubItems\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur deklariert zus&auml;tzlich eine Variable des Typs <b>ListSubItem<\/b>. Nachdem wir mit <b>objListItem <\/b>den aktuellen Eintrag markiert haben, durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Elemente der Auflistung <b>ListSubItems<\/b>. F&uuml;r diese stellen wir jeweils eine Zeile mit dem <b>Index<\/b>, dem <b>Key <\/b>und dem <b>Text <\/b>in der Variablen <b>strSubItems <\/b>zusammen.<\/p>\n<h2>Einen Eintrag markieren<\/h2>\n<p>Wir wollen nicht nur den aktuellen Eintrag auslesen, sondern diesen auch einstellen k&ouml;nnen. Dazu haben wir das Formular <b>frmListView_EintragSelektieren <\/b>angelegt. Hier finden wir drei Schaltfl&auml;chen. Die erste Schaltfl&auml;che l&ouml;st die folgende Prozedur aus und selektiert damit den zweiten Eintrag durch Angabe des <b>Index<\/b>-Wertes dieses Eintrags beim Zuweisen des Wertes <b>True <\/b>an die Eigenschaft <b>Selected<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdZweitenEintragPerIndex_Click()\r\n     objListView.ListItems(2).Selected = <span style=\"color:blue;\">True<\/span>\r\n     Me.ctlListView.SetFocus\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir k&ouml;nnen auch einen Eintrag &uuml;ber den <b>Key<\/b>-Wert selektieren. Das erledigen wir mit der zweiten Schaltfl&auml;che:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDrittenEintragPerKey_Click()\r\n     objListView.ListItems(\"a31\").Selected = <span style=\"color:blue;\">True<\/span>\r\n     Me.ctlListView.SetFocus\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Schlie&szlig;lich wollen wir auch noch die Selektion leeren k&ouml;nnen. <\/p>\n<p>Die folgende Prozedur ermittelt den markierten Eintrag und w&auml;hlt diesen ab:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAlleEintraegeAbwaehlen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.SelectedItem\r\n     objListItem.Selected = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Mehrfachauswahl im ListView-Steuerelement<\/h2>\n<p>Im Formular <b>frmListView_Mehrfachauswahl_Auslesen <\/b>setzen wir uns mit der Mehrfachauswahl im <b>ListView<\/b>-Steuerelement auseinander (siehe Bild 6). Dazu stellen wir zun&auml;chst die Eigenschaft auf <b>True <\/b>ein:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_010.png\" alt=\"Markieren von Eintr&auml;gen im ListView-Steuerelement\" width=\"424,5589\" height=\"271,6417\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Markieren von Eintr&auml;gen im ListView-Steuerelement<\/span><\/b><\/p>\n<pre>objListView.MultiSelect = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Damit k&ouml;nnen wir nun wie in bei gedr&uuml;ckter <b>Umschalt<\/b>&#8211; oder <b>Strg<\/b>-Taste wie im Windows Explorer mehrere Eintr&auml;ge gleichzeitig markieren.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAktuelleEintraegeAuslesen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Dim <\/span>strSelected<span style=\"color:blue;\"> As String<\/span>\r\n     For Each objListItem In objListView.ListItems\r\n         <span style=\"color:blue;\">If <\/span>objListItem.Selected<span style=\"color:blue;\"> Then<\/span>\r\n             strSelected = strSelected & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                 & objListItem.Key & \" \" & objListItem.Text\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> objListItem\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Markierte Eintr&auml;ge:\" & strSelected\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur durchl&auml;uft alle Eintr&auml;ge des Listenfeldes. Darin pr&uuml;ft sie mit der <b>Selected<\/b>-Eigenschaft, ob der jeweilige Eintrag markiert ist.<\/p>\n<p>Wenn wir anschlie&szlig;end die Schaltfl&auml;che bet&auml;tigen, erhalten wir eine Liste der markierten Eintr&auml;ge (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_006.png\" alt=\"Ausgabe der Eintr&auml;ge einer Mehrfachauswahl\" width=\"424,5589\" height=\"265,3493\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Ausgabe der Eintr&auml;ge einer Mehrfachauswahl<\/span><\/b><\/p>\n<h2>Mehrere Eintr&auml;ge im ListView per VBA selektieren<\/h2>\n<p>Nun wollen wir mehrere Eintr&auml;ge in einer Mehrfachauswahl per VBA selektieren (siehe <b>frmListView_MehrereEintraegeSelektieren<\/b>). Im Beispiel wollen wir mit einer Schaltfl&auml;che den ersten und den dritten Eintrag selektieren.<\/p>\n<p>Die Schaltfl&auml;che l&ouml;st die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdMehrereEintraegeSelektieren_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.ListItems(1)\r\n     objListItem.Selected = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.ListItems(3)\r\n     objListItem.Selected = <span style=\"color:blue;\">True<\/span>\r\n     Me.ctlListView.SetFocus\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier selektieren wir zuerst den ersten Eintrag und markieren diesen und f&uuml;hren die gleichen Schritte dann f&uuml;r den dritten Eintrag aus. Das Ergebnis sehen wir in Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_011.png\" alt=\"Mehrfachauswahl per VBA selektieren\" width=\"424,5589\" height=\"268,8873\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Mehrfachauswahl per VBA selektieren<\/span><\/b><\/p>\n<p>Die zweite Schaltfl&auml;che w&auml;hlt alle Eintr&auml;ge wieder ab.<\/p>\n<p>Sie durchl&auml;uft alle Eintr&auml;ge und stellt f&uuml;r den Wert der Eigenschaft <b>Selected <\/b>jeweils auf <b>False <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAlleEintraegeAbwaehlen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     For Each objListItem In objListView.ListItems\r\n         objListItem.Selected = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> objListItem\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Sortieren der Eintr&auml;ge<\/h2>\n<p>Wie k&ouml;nnen die Eintr&auml;ge des Listenfeldes jeweils nach einer Spalte aufsteigend oder absteigend sortieren (siehe Formular <b>frmListView_Sortieren<\/b>). Dazu ben&ouml;tigen wir eine Prozedur, die durch das Ereignis <b>ColumnClick <\/b>des <b>ListView<\/b>-Steuerelements ausgel&ouml;st wird.<\/p>\n<p>Diese Ereignisprozedur legen wir an, indem wir im Codefenster f&uuml;r das Klassenmodul des Formulars aus der linken Liste den Eintrag f&uuml;r das <b>ListView<\/b>-Steuerelement ausw&auml;hlen und aus der rechten den Eintrag <b>ColumnClick <\/b>(siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_007.png\" alt=\"Anlegen einer Ereignisprozedur f&uuml;r das ListView-Steuerelement\" width=\"549,559\" height=\"312,3011\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Anlegen einer Ereignisprozedur f&uuml;r das ListView-Steuerelement<\/span><\/b><\/p>\n<p>Die so erstellte Ereignisprozedur <b>lvwListView_ColumnClick <\/b>f&uuml;llen wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_ColumnClick(ByVal ColumnHeader _\r\n        <span style=\"color:blue;\"> As Object<\/span>)\r\n     <span style=\"color:blue;\">Static <\/span>intAktuelleSortierspalte<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Static <\/span>bolAufsteigend<span style=\"color:blue;\"> As Boolean<\/span>\r\n     objListView.SortKey = ColumnHeader.Index - 1\r\n     <span style=\"color:blue;\">If <\/span>intAktuelleSortierspalte = ColumnHeader.Index - 1<span style=\"color:blue;\"> Then<\/span>\r\n         bolAufsteigend = <span style=\"color:blue;\">Not<\/span> bolAufsteigend\r\n         objListView.SortOrder = Abs(bolAufsteigend)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         objListView.SortOrder = lvwAscending\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     objListView.Sorted = <span style=\"color:blue;\">True<\/span>\r\n     intAktuelleSortierspalte = ColumnHeader.Index - 1\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie enth&auml;lt zwei als statisch deklarierte Variablen. Das hei&szlig;t, dass diese Variablen auch nach dem Verlassen der Prozedur ihre Werte behalten, aber au&szlig;erhalb der Prozedur dennoch nicht zugreifbar sind.  Die Prozedur liest bekommt mit dem Parameter <b>Columnheader <\/b>einen Verweis auf den Spaltenkopf, den der Benutzer angeklickt hat.<\/p>\n<p>Aus diesem lesen wir den aktuellen Sortierindex aus. Diesen ermitteln wir aus <b>ColumnHeader.Index &#8211; 1<\/b> und weisen diesen der Eigenschaft <b>SortKey <\/b>des <b>ListView<\/b>-Steuerelements zu. Damit legen wir fest, welche Spalte sortiert werden soll.<\/p>\n<p>Danach pr&uuml;fen wir, ob <b>intAktuelleSortierspalte <\/b>den gleichen Wert wie <b>ColumnHeader.Index &#8211; 1 <\/b>hat. In diesem Fall kehren wir den Wert der Variablen <b>bolAufsteigend<\/b>, der standardm&auml;&szlig;ig <b>0 <\/b>ist, um und weisen den Wert ohne Vorzeichen der Eigenschaft <b>SortOrder <\/b>zu.<\/p>\n<p>Der Wert <b>0 <\/b>entspricht der Konstanten <b>lvwAscending <\/b>(aufsteigend), der Wert <b>1 <\/b>der Konstanten <b>lvwDescending <\/b>(absteigend).<\/p>\n<p>Falls <b>intAktuelleSortierspalte <\/b>nicht der markierten Spalte entspricht, soll die Sortierreihenfolge auf <b>lvwAscending <\/b>(aufsteigend) eingestellt werden. Das ist immer der Fall, wenn nicht die gleiche Spalte wie zuvor angeklickt wurde.<\/p>\n<p>Durch das Einstellen der Eigenschaft <b>Sorted <\/b>auf den Wert <b>True <\/b>wird die Sortierung angewendet.<\/p>\n<p>Schlie&szlig;lich stellt die Prozedur die Variable <b>intAktuelleSortierspalte <\/b>auf den aktuellen Index minus 1 ein. Damit stellen wir sicher, dass wir, wenn der Benutzer erneut auf den gleichen Spaltenkopf klickt, diese Spalte nun andersherum sortieren.<\/p>\n<h2>Wert der ersten Spalte &auml;ndern<\/h2>\n<p>Wir k&ouml;nnen zwar im <b>ListView<\/b>-Steuerelement nicht direkt Daten bearbeiten, wie es im Datenblatt der Fall ist. Aber wir k&ouml;nnen immerhin den Wert der ersten Spalte anpassen.<\/p>\n<p>Dies m&uuml;ssen wir wie in allerdings zun&auml;chst aktivieren, indem wir die Eigenschaft <b>LabelEdit <\/b>auf den Wert <b>lvwAutomatic <\/b>einstellen:<\/p>\n<pre>objListView.LabelEdit = lvwAutomatic<\/pre>\n<p>Standardm&auml;&szlig;ig steht dieser Wert auf <b>lvwManual<\/b>. Sobald wir diesen ge&auml;ndert haben, k&ouml;nnen wir den Wert der ersten Spalte anklicken und dieser wird wie im Windows Explorer zum &Auml;ndern markiert (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_008.png\" alt=\"Umbenennen eines Eintrags\" width=\"424,5589\" height=\"220,2811\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Umbenennen eines Eintrags<\/span><\/b><\/p>\n<h2>Auf &Auml;nderungen reagieren<\/h2>\n<p>Wenn man im <b>ListView<\/b>-Steuerelement reale Daten anzeigt und den Benutzer diese &auml;ndern l&auml;sst, werden die &Auml;nderungen nicht automatisch in die Datenherkunft &uuml;bernommen. Wir verwenden in diesem Beispiel zwar nur einige Beispieldaten, aber wir stellen dennoch die Vorgehensweise vor, um auf &Auml;nderungen zu reagieren und den neuen Wert zu ermitteln.<\/p>\n<p>Wir haben gleich zwei Ereignisse, die durch das &Auml;ndern eines Eintrags ausgel&ouml;st werden. <b>BeforeLabelEdit <\/b>wird bereits beim Anklicken des jeweiligen Eintrags zum &Auml;ndern ausgel&ouml;st, aber bevor dieser zum &Auml;ndern freigegeben wird. Wir k&ouml;nnen hier beispielsweise pr&uuml;fen, ob der aktuelle Eintrag ge&auml;ndert werden darf. Falls nicht, k&ouml;nnen wir in der Prozedur eine Meldung ausgeben und brechen den &Auml;nderungsvorgang durch Setzen des Parameters <b>Cancel <\/b>auf den Wert <b>True <\/b>ab.<\/p>\n<p>Interessanter ist die zweite Ereignisprozedur <b>AfterLabelEdit<\/b>. Diese wird ausgel&ouml;st, wenn der Benutzer die &Auml;nderung eingetragen hat und beispielsweise mit der Eingabetaste abschlie&szlig;t. Diese Prozedur liefert nicht nur den Parameter <b>Cancel<\/b>, mit dem wir den &Auml;nderungsvorgang abbrechen k&ouml;nnen, wenn der eingegebene Wert beispielsweise nicht validiert werden kann, sondern auch noch den Parameter <b>NewString<\/b>, der den neu eingetragenen Wert zur&uuml;ckliefert.<\/p>\n<p>Wir f&uuml;gen die Prozedur <b>ctlListView_AfterLabelEdit<\/b> &uuml;ber die beiden Auswahlfelder des Codefensters hinzu und f&uuml;llen sie wie in Listing 1. Die Prozedur deklariert eine Variable namens <b>objListItem<\/b>, in die wir mit der Eigenschaft <b>SelectedItem <\/b>den aktuell markierten Eintrag beim Durchf&uuml;hren der &Auml;nderung eintragen. Aus diesem Eintrag lesen wir den Key und den Text aus und speichern beide in den Variablen <b>strKey <\/b>und <b>strOldString<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_AfterLabelEdit(Cancel<span style=\"color:blue;\"> As Integer<\/span>, NewString<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strOldString<span style=\"color:blue;\"> As String<\/span>\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.SelectedItem\r\n     strKey = objListItem.Key\r\n     strOldString = objListItem.Text\r\n     \r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Der Eintrag mit dem Key ''\" & strKey & \"'' soll ge&auml;ndert werden von ''\" & strOldString & \"'' auf ''\" & NewString & \"''.\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Reagieren auf die &Auml;nderung eines ListView-Eintrags<\/span><\/b><\/p>\n<p>Danach geben wir diese Informationen in einer Meldung wie in Bild 11 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_009.png\" alt=\"Ereignis vor dem Umbenennen\" width=\"424,5589\" height=\"234,2967\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Ereignis vor dem Umbenennen<\/span><\/b><\/p>\n<h2>Auf Doppelklick reagieren<\/h2>\n<p>Der einfache Klick selektiert einen Eintrag, daher macht es wenig Sinn, hier noch weitere Funktionen zu hinterlegen. Wenn wir zum Beispiel Details zu einem Datensatz im <b>ListView<\/b>-Steuerelement anzeigen wollen, k&ouml;nnen wir das beispielsweise per Doppelklick machen (siehe <b>frmListView_AktionPerDoppelklick<\/b>).<\/p>\n<p>Dazu nutzen wir das Ereignis <b>DblClick<\/b>, das wir &uuml;ber das Codefenster anlegen und wie folgt f&uuml;llen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_DblClick()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Dim <\/span>lngIndex<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.SelectedItem\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objListItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">With<\/span> objListItem\r\n             lngIndex = .Index\r\n             strKey = .Key\r\n             strText = .Text\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Doppelklick auf den Eintrag mit dem \" _\r\n             & \"Index ''\" & lngIndex & \"'', dem Key ''\" _\r\n             & strKey & \"'' und dem Text ''\" & strText & \"''.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier referenzieren wir das aktuelle Element mit der Variablen <b>objListItem<\/b>. Ist diese nicht leer, lesen wir die Eigenschaften <b>Index<\/b>, <b>Key <\/b>und <b>Text <\/b>ein und geben diese in einem Meldungsfenster aus (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_012.png\" alt=\"Infos zum Element per Doppelklick\" width=\"424,5589\" height=\"235,7711\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Infos zum Element per Doppelklick<\/span><\/b><\/p>\n<h2>Auf einen Klick auf ein Element reagieren<\/h2>\n<p>Es gibt aber noch eine zweite M&ouml;glichkeit, eine Aktion mit einem Element auszuf&uuml;hren &#8211; das <b>ItemClick<\/b>-Ereignis. Dieses liefert direkt einen Verweis auf das angeklickte Element. Damit k&ouml;nnen wir beispielsweise die Details zu dem angeklickten Eintrag in einem Unterformular im gleichen Formular anzeigen. Im folgenden Beispiel zeigen wir, wie wir nach einem Klick die Eigenschaften des angeklickten Elements ausgeben (siehe <b>frmListView_EintragPerKlick<\/b>).<\/p>\n<p>Im Gegensatz zu den Ereignissen <b>Click <\/b>oder <b>DblClick <\/b>liefert das <b>ItemClick<\/b>-Ereignis direkt das angeklickte Element per Parameter mit. Wir brauchen also nur noch seine Eigenschaften auszulesen und weiterzuverarbeiten &#8211; zum Beispiel um diese per Meldungsfenster auszugeben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_ItemClick(ByVal Item<span style=\"color:blue;\"> As Object<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngIndex<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">With<\/span> Item\r\n         lngIndex = .Index\r\n         strKey = .Key\r\n         strText = .Text\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"ItemClick auf den Eintrag mit dem Index ''\" _\r\n         & lngIndex & \"'', dem Key ''\" & strKey _\r\n         & \"'' und dem Text ''\" & strText & \"''.\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Mit Kontrollk&auml;stchen im ListView arbeiten<\/h2>\n<p>Wenn wir die Eigenschaft <b>Checkboxes <\/b>des <b>ListView<\/b>-Steuerelements auf <b>True <\/b>eingestellt ist, wird vor jedem Eintrag ein Kontrollk&auml;stchen angezeigt:<\/p>\n<pre>objListView.Checkboxes = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Damit wir das Aktivieren oder Deaktivieren des Kontrollk&auml;stchens per VBA verarbeiten k&ouml;nnen, gibt es das Ereignis <b>ItemCheck<\/b>. Dieses f&uuml;llen wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_ItemCheck(ByVal Item<span style=\"color:blue;\"> As Object<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>Item.Checked = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Eintrag ''\" & Item.Text _\r\n             & \"'' wurde ausgew&auml;hlt.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Eintrag ''\" & Item.Text _\r\n             & \"'' wurde abgew&auml;hlt.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir nun eines der Kontrollk&auml;stchen wie in Bild 13 anklicken, erhalten wie die Meldung mit dem Element und ob dieses ausgew&auml;hlt oder abgew&auml;hlt wurde.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_013.png\" alt=\"Anzeige einer Meldung zu einem aktivierten Eintrag\" width=\"424,5589\" height=\"244,6018\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Anzeige einer Meldung zu einem aktivierten Eintrag<\/span><\/b><\/p>\n<h2>Kontrollk&auml;stchen per Code aktivieren oder deaktivieren<\/h2>\n<p>Die Kontrollk&auml;stchen k&ouml;nnen wir auch per VBA aktivieren oder deaktivieren. Dazu stellen wir die Eigenschaft <b>Checked <\/b>des jeweiligen Elements auf <b>True <\/b>oder <b>False <\/b>ein. Die Schaltfl&auml;che <b>cmdZweitenEintragSelektieren <\/b>setzt einen Haken in das zweite Element, wenn noch keiner da ist und entfernt diesen, wenn er bereits vorhanden ist:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdZweitenEintragSelektieren_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.ListItems(2)\r\n     objListItem.Checked = <span style=\"color:blue;\">Not<\/span> objListItem.Checked\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Alle Eintr&auml;ge mit aktiviertem Kontrollk&auml;stchen auslesen<\/h2>\n<p>Schlie&szlig;lich wollen wir auch noch alle Eintr&auml;ge mit aktiviertem Kontrollk&auml;stchen ausgeben.<\/p>\n<p>Dazu f&uuml;gen wir eine weitere Schaltfl&auml;che zum Formular hinzu, das wir mit der folgenden Ereignisprozedur ausstatten:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAlleSelekiertenEintraeeAuswaehlen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     For Each objListItem In objListView.ListItems\r\n         <span style=\"color:blue;\">If <\/span>objListItem.Checked<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> objListItem.Key, objListItem.Text\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> objListItem\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur durchl&auml;uft alle Eintr&auml;ge des <b>ListView<\/b>-Steuerelements und pr&uuml;ft die Eigenschaft <b>Checked<\/b>. Liefert diese den Wert <b>True<\/b>, geben wir den <b>Key <\/b>und den <b>Text <\/b>des jeweiligen Elements im Direktbereich aus.<\/p>\n<h2>Eintr&auml;ge zur Laufzeit hinzuf&uuml;gen<\/h2>\n<p>Wenn wir mit echten Daten aus Tabellen arbeiten, kann es sein, dass wir zum Beispiel einen neuen Datensatz &uuml;ber ein Detailformular anlegen und diese nun im <b>ListView<\/b>-Steuerelement abgebildet werden soll.<\/p>\n<p>Das realisieren wir mit der <b>Add<\/b>-Methode der <b>ListItems<\/b>-Auflistung und bei mehreren Spalten zus&auml;tzlich mit der <b>Add<\/b>-Methode der <b>ListSubItems<\/b>-Auflistung.<\/p>\n<p>Als Beispiel haben wir das Formular <b>frmListView_EintraegeHinzufugenUndEntfernen <\/b>bereitgestellt (siehe Bild 14). Hier finden wir drei Textfelder, in die wir die Daten des anzulegenden Eintrags schreiben k&ouml;nnen. Mit der Schaltfl&auml;che <b>cmdHinzufuegen <\/b>wollen wir daf&uuml;r ein neues Element in das <b>ListView<\/b>-Steuerelement einf&uuml;gen. Das erledigen wir mit der Prozedur aus Listing 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_014.png\" alt=\"Elemente hinzuf&uuml;gen und entfernen\" width=\"424,5589\" height=\"297,7548\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Elemente hinzuf&uuml;gen und entfernen<\/span><\/b><\/p>\n<p>Hier ist ein wenig Vorarbeit n&ouml;tig, denn wir m&uuml;ssen einen <b>Key<\/b>-Wert ermitteln, der noch nicht vergeben wurde. Dazu durchlaufen wir alle Elemente des <b>ListView<\/b>-Steuerelements und pr&uuml;fen jeweils, ob der Wert der Zahl hinter dem Buchstaben aus der <b>Key<\/b>-Eigenschaft gr&ouml;&szlig;er als der in <b>lngID <\/b>zwischengespeicherte aktuell gr&ouml;&szlig;te Wert ist.<\/p>\n<p>Nach dem Durchlaufen aller Elemente enth&auml;lt <b>lngID <\/b>den gr&ouml;&szlig;ten Wert, den wir um <b>1 <\/b>erh&ouml;hen.<\/p>\n<p>Danach f&uuml;gen wir wie bereits beim Anlegen der Eintr&auml;ge beim &Ouml;ffnen des Formulars den neuen Eintrag samt den weiteren Spalten hinzu.<\/p>\n<h2>Eintr&auml;ge zur Laufzeit entfernen<\/h2>\n<p>Um den markierten Eintrag zu entfernen, haben wir eine weitere Schaltfl&auml;che hinzugef&uuml;gt. Diese ermittelt mit <b>SelectedItem<\/b> den aktuell markierten Eintrag und l&ouml;scht diesen mit der <b>Remove<\/b>-Methode der <b>ListItems<\/b>-Auflistung, der wir den Index des zu l&ouml;schenden Elements &uuml;bergeben.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdEntfernen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.SelectedItem\r\n     objListView.ListItems.Remove objListItem.Index\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Eintrag sichtbar machen<\/h2>\n<p>F&uuml;r das folgende Beispiel haben wir dem <b>ListView<\/b>-Steuerelement einige weitere Eintr&auml;ge hinzugef&uuml;gt (siehe <b>frmListView_EintragSichtbarMachen<\/b>). Statt der &uuml;blichen drei Eintr&auml;ge haben wir in einer <b>For&#8230;Next<\/b>-Schleife 100 Eintr&auml;ge hinzugef&uuml;gt (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     ...\r\n     <span style=\"color:blue;\">With<\/span> objListView\r\n         .ListItems.Clear\r\n         For i = 1 To 100\r\n             <span style=\"color:blue;\">Set<\/span> objListitem = .ListItems.Add(, \"a\" & i, \"Text \" & i)\r\n             objListitem.ListSubItems.Add , \"b\" & i, \"Text \" & i\r\n             objListitem.ListSubItems.Add , \"c\" & i, \"Text \" & i\r\n         <span style=\"color:blue;\">Next<\/span> i\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 3: Viele Elemente hinzuf&uuml;gen<\/span><\/b><\/p>\n<p>Nun stellen wir uns vor, wir wollen einen der Eintr&auml;ge, die aktuell nicht sichtbar sind, markieren und sichtbar machen. Dazu reicht es nicht aus, diesen zu selektieren. Wir m&uuml;ssen noch eine weitere Methode des <b>ListItem<\/b>-Elements namens <b>EnsureVisible <\/b>aufrufen.<\/p>\n<p>Das erledigen wir mit der folgenden Prozedur, die wir f&uuml;r eine Schaltfl&auml;che hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdSichtbarMachen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.ListItems(50)\r\n     objListItem.Selected = <span style=\"color:blue;\">True<\/span>\r\n     objListitem.EnsureVisible\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir so beispielsweise den 50. Eintrag anzeigen wollen, gelingt das wie in Bild 15.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_015.png\" alt=\"Zu einem nicht sichtbaren Eintrag scrollen\" width=\"424,5589\" height=\"264,295\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Zu einem nicht sichtbaren Eintrag scrollen<\/span><\/b><\/p>\n<h2>Index des obersten Eintrags ermitteln<\/h2>\n<p>Manchmal kann es hilfreich sein, zu wissen, welchen Index der ganz oben im <b>ListView<\/b>-Steuerelement angezeigte Eintrag hat.<\/p>\n<p>Dazu haben wir dem vorherigen Formular eine weitere Schaltfl&auml;che hinzugef&uuml;gt.<\/p>\n<p>Diese weist dem <b>ListItem<\/b>-Objekt mit der Funktion <b>GetFirstVisible <\/b>einen Verweis auf den obersten sichtbaren Eintrag zu. Danach geben wir den Text dieses Elements in einer Meldungsbox aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdObersterIndex_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.GetFirstVisible\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Der oberste Eintrag hat den Text ''\" _\r\n         & objListItem.Text & \"''\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Eintr&auml;ge finden mit FindItem<\/h2>\n<p>Die <b>FindItem<\/b>-Methode erlaubt das Suchen nach Eintr&auml;gen im <b>ListView<\/b>-Steuerelement.<\/p>\n<p>Sie bietet folgende Parameter an:<\/p>\n<ul>\n<li><b>sz<\/b>: Suchbegriff<\/li>\n<li><b>Where<\/b>: Gibt an, wo in den Eintr&auml;gen gesucht werden soll. Hier gibt es die folgenden Parameter: <b>lvwText <\/b>sucht im Text der Elemente, <b>lvwSubItem<\/b> sucht im Text der Unterelemente, also den folgenden Spalten und <b>lvwTag <\/b>sucht in der <b>Tag<\/b>-Eigenschaft.<\/li>\n<li><b>Index<\/b>: Erwartet den Index der Position, ab der gesucht werden soll.<\/li>\n<li><b>fPartial<\/b>: Erwartete einen <b>Boolean<\/b>-Wert, der angibt, ob auch nach Teil&uuml;bereinstimmungen gesucht werden soll. <b>False<\/b> bedeutet, dass nach genauer &Uuml;bereinstimmung gesucht wird.<\/li>\n<\/ul>\n<p>Die folgende einfache Suche sucht nur in der <b>Text<\/b>-Eigenschaft des Hauptelements nach dem Suchbegriff:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdEintragFinden_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Set<\/span> objListItem = objListView.FindItem(Me.txtSuchen)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objListItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         objListItem.Selected = <span style=\"color:blue;\">True<\/span>\r\n         objListItem.EnsureVisible\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Drag and Drop im ListView-Steuerelement<\/h2>\n<p>Im Gegensatz zu den eingebauten Steuerelementen k&ouml;nnen wir im <b>ListView <\/b>Drag and Drop verwenden. Das l&auml;sst sich f&uuml;r verschiedene Szenarien einsetzen &#8211; zum Beispiel zum Ver&auml;ndern der Reihenfolge von Elementen oder auch zum Hin- und Herziehen von Elementen zwischen zwei <b>ListView<\/b>-Steuerelementen. Wir wollen Drag and Drop anhand des ersten Beispiels erl&auml;utern, wo wir das <b>ListView<\/b>-Steuerelement mit einigen Eintr&auml;gen f&uuml;llen und durch Drag and Drop die Reihenfolge anpassen (siehe Formular <b>frmListView_DragAndDrop<\/b>).<\/p>\n<p>Die grundlegende Technik dabei ist, dass wir den gezogenen Eintrag l&ouml;schen und an einer neuen Position einf&uuml;gen, die wir durch Vergeben eines entsprechenden Indexes festlegen. Dabei m&uuml;ssen wir darauf achten, ob wir nach oben oder nach unten verschieben.<\/p>\n<p>Um das Beispiel im Formular <b>frmListView_DragAndDrop <\/b>einfach zu halten, f&uuml;llen wir das <b>ListView<\/b>-Steuerelement nur mit einer einfachen Spalte. So brauchen wir uns erst einmal nicht um das Verschieben der untergeordneten Spalten zu k&uuml;mmern.<\/p>\n<p>Dazu legen wir die Prozedur aus Listing 4 f&uuml;r das Ereignis <b>Beim Laden <\/b>des Formulars an.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>objListitem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objListView = Me.ctlListView.Object\r\n     \r\n     <span style=\"color:blue;\">With<\/span> objListView\r\n         .View = lvwReport\r\n         .LabelEdit = lvwManual\r\n         .BorderStyle = ccNone\r\n         .Appearance = ccFlat\r\n         .FullRowSelect = <span style=\"color:blue;\">True<\/span>\r\n         .HideSelection = <span style=\"color:blue;\">False<\/span>\r\n         .OLEDragMode = ccOLEDragAutomatic\r\n         .OLEDropMode = ccOLEDropManual\r\n         \r\n         .ColumnHeaders.Clear\r\n         .ColumnHeaders.Add , \"c1\", \"Spalte 1\"\r\n         \r\n         .ListItems.Clear\r\n         For i = 1 To 10\r\n             <span style=\"color:blue;\">Set<\/span> objListitem = .ListItems.Add(, \"a\" & i, \"Text \" & i)\r\n         <span style=\"color:blue;\">Next<\/span> i\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 4: Initialisieren und F&uuml;llen des ListView-Steuerelements<\/span><\/b><\/p>\n<p>Diese legt neben den bekannten Eigenschaften f&uuml;r das <b>ListView<\/b>-Steuerelement noch zwei weitere Eigenschaften an:<\/p>\n<ul>\n<li><b>OLEDragMode <\/b>stellen wir auf <b>ccOLEDragAutomatic <\/b>ein und<\/li>\n<li><b>OLEDropMode<\/b> auf den Wert <b>ccOLEDropManual<\/b>.<\/li>\n<\/ul>\n<p>Damit sorgen wir daf&uuml;r, dass beim Drag and Drop die nachfolgend vorgestellten Prozeduren ausgef&uuml;hrt werden.<\/p>\n<p>Au&szlig;erdem f&uuml;gen wir zehn Elemente mit den Texten <b>Text 1 <\/b>bis <b>Text 10 <\/b>hinzu, sodass unser <b>ListView<\/b>-Steuerelement nach dem &Ouml;ffnen des Formulars wie in Bild 16 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_016.png\" alt=\"Ausgangslage f&uuml;r Drag and Drop\" width=\"424,5589\" height=\"263,2265\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Ausgangslage f&uuml;r Drag and Drop<\/span><\/b><\/p>\n<p>Damit wir beim Experimentieren mit Drag and Drop immer wieder schnell den Ausgangszustand herstellen k&ouml;nnen, f&uuml;gen wir auch noch eine Schaltfl&auml;che hinzu, welche die folgende Prozedur ausl&ouml;st und damit erneut die <b>Form_Load<\/b>-Prozedur ausf&uuml;hrt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdElementWiederherstellen_Click()\r\n     <span style=\"color:blue;\">Call<\/span> Form_Load\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Initiieren von Drag and Drop<\/h2>\n<p>Wenn wir beginnen, ein Objekt bei gedr&uuml;ckter Maustaste zu bewegen, l&ouml;st dies das Ereignis <b>OLEStartDrag <\/b>aus. Hier ist eine Aufgabe zu erledigen, die in direktem Zusammenhang mit dem sp&auml;teren Fallenlassen des Elements steht: Wir m&uuml;ssen uns auf irgendeine Weise merken, welches Element wir ziehen.<\/p>\n<p>Dazu k&ouml;nnte man eine modulweit deklarierte Variable nutzen, die wir mit dem mit <b>SelectedItem <\/b>ermittelten Key des gezogenen Elements f&uuml;llen.<\/p>\n<p>Aber Drag and Drop mit dem <b>ListView<\/b>-Steuerelement bietet uns eine elegantere M&ouml;glichkeit: Alle Drag and Drop-Ereignisprozeduren bieten einen Parameter namens <b>Data<\/b>.<\/p>\n<p>Diesen k&ouml;nnen wir in der Ereignisprozedur <b>OLEStartDrag <\/b>mit dem Key des gezogenen Elements f&uuml;llen und in der Ereignisprozedur <b>OLEDragDrop <\/b>k&ouml;nnen wir diesen Wert wieder aus diesem Parameter auslesen.<\/p>\n<p>Allerdings ist <b>Data <\/b>keine einfache <b>String<\/b>-Variable, sondern ein Objekt, dem wir in <b>OLEStartDrag <\/b>mit <b>SetData<\/b> Daten zuweisen und die wir sp&auml;ter in <b>OLEDragDrop <\/b>mit <b>GetData <\/b>wieder auslesen k&ouml;nnen.<\/p>\n<p>Also steigen wir mit der Prozedur <b>ctlListView_OLEStartDrag <\/b>ein, die wir wieder anlegen, indem wir im Codefenster des Klassenmoduls aus dem linken Auswahlfeld den Eintrag <b>ctlListView <\/b>und aus dem rechten den Wert <b>OLEStartDrag <\/b>ausw&auml;hlen. Auf dem gleichen Wege k&ouml;nnen wir auch gleich die weiteren Ereignisse <b>OLEDragOver <\/b>und <b>OLEDragDrop <\/b>anlegen (siehe Bild 17).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/02-11-2025_12-14-04.PNG\" alt=\"Anlegen der Ereignisse f&uuml;r Drag and Drop\" width=\"700\" height=\"346,2455\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Anlegen der Ereignisse f&uuml;r Drag and Drop<\/span><\/b><\/p>\n<p>Danach programmieren wir die Prozedur <b>ctlListView_OLEStartDrag <\/b>wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_OLEStartDrag(Data<span style=\"color:blue;\"> As Object<\/span>, _\r\n         AllowedEffects<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strData<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>objListView.SelectedItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strData = objListView.SelectedItem.key\r\n     Data.SetData strData, ccCFText\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier pr&uuml;fen wir zuerst, ob aktuell ein Element markiert ist. Falls nicht, verlassen wir die Prozedur direkt wieder. Anderenfalls f&uuml;llen wir die Variable <b>strData <\/b>mit der Eigenschaft <b>Key <\/b>des aktuell markierten Elements, das wir mit <b>SelectedItem <\/b>ermitteln.<\/p>\n<p>Dieses weisen wir dem Parameter <b>Data <\/b>hinzu, wobei wir der <b>SetData<\/b>-Methode als ersten Wert den Key aus <b>strData<\/b> zuweisen und dem zweiten die Konstante <b>ccCFText<\/b>. Somit wei&szlig; <b>SetData<\/b>, welchen Typ der mit <b>SetData <\/b>&uuml;bergebene Wert hat. Damit sind die Arbeiten an dieser Prozedur bereits abgeschlossen.<\/p>\n<h2>Markieren potenzieller Zielelemente beim Drag and Drop<\/h2>\n<p>Nun wollen wir dem Benutzer die visuelle M&ouml;glichkeit geben, das Drag and Drop-Ziel direkt beim Ziehen des Elements zu erkennen. Dazu nutzen wir die Ereignisprozedur <b>ctlListView_OLEDragOver<\/b> aus Listing 5.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_OLEDragOver(Data<span style=\"color:blue;\"> As Object<\/span>, Effect<span style=\"color:blue;\"> As Long<\/span>, Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         x<span style=\"color:blue;\"> As Single<\/span>, y<span style=\"color:blue;\"> As Single<\/span>, State<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objListitem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     Effect = ccOLEDropEffectMove\r\n     <span style=\"color:blue;\">Set<\/span> objListitem = objListView.HitTest(x, y)\r\n     <span style=\"color:blue;\">If <\/span>objListitem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objListView.DropHighlight = Nothing\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objListView.DropHighlight = objListitem\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Prozedur, die w&auml;hrend des Ziehens eines Elements ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Diese Prozedur dient allein dazu, das aktuell mit dem gezogenen Element &uuml;berfahrene Zielelement optisch hervorzuheben. Dazu deklarieren wir eine Variable namens <b>objListItem<\/b>, mit der wir dieses Element referenzieren wollen.<\/p>\n<p>An dieser Stelle ist es wichtig, einen entscheidenden Unterschied zwischen den beiden Ereignissen <b>OLEStartDrag<\/b>, <b>OLEDragOver <\/b>und <b>OLEDragDrop <\/b>zu kennen:<\/p>\n<ul>\n<li><b>OLEStartDrag <\/b>wird nur beim ersten Ziehen eines Elements mit der Maus ausgel&ouml;st, markiert also den Start des Vorgangs.<\/li>\n<li><b>OLEDragDrop <\/b>wird nur beim Loslassen der Maus nach einem einmal initiierten Drag and Drop-Vorgang ausgel&ouml;st und markiert das Fallenlassen des Elements.<\/li>\n<li><b>OLEDragOver <\/b>wird aber in sehr kurzen Abst&auml;nden w&auml;hrend des Drag and Drop-Vorgangs ausgel&ouml;st, um jederzeit ermitteln zu k&ouml;nnen, welches Element gerade mit dem gezogenen Element &uuml;berfahren wird.<\/li>\n<\/ul>\n<p><b>OLEDragOver<\/b> wird also praktisch st&auml;ndig ausgel&ouml;st, w&auml;hrend wir ein Element mit der Maus ziehen. Das bietet die Gelegenheit, jederzeit das aktuell &uuml;berfahrene Element zu ermitteln und dieses zu markieren. Das nutzen wir in der Prozedur, um verschiedene Aktionen durchzuf&uuml;hren.<\/p>\n<ul>\n<li>Die erste ist das Einstellen des R&uuml;ckgabeparameters <b>Effect<\/b> auf einen Wert, der angibt, wie der Mauszeiger gerade aussehen soll. In diesem Fall stellen wir diesen Parameter auf <b>ccOLEDropEffectMove <\/b>ein.<\/li>\n<li>Au&szlig;erdem referenzieren wir bei jedem Aufruf dieser Prozedur das aktuell &uuml;berfahrene Element. Dieses ermitteln wir mit der Eigenschaft <b>HitTest <\/b>des <b>ListView<\/b>-Steuerelements. <b>HitTest <\/b>erwartet die aktuellen Parameter des Mauszeigers, die uns die Ereignisprozedur mit den beiden Parametern <b>x <\/b>und <b>y <\/b>liefert. Das Ergebnis von <b>HitTest <\/b>ist ein Verweis auf das aktuell &uuml;berfahrene Element, das wir mit der Variablen <b>objListItem <\/b>referenzieren &#8211; oder, wenn wir gerade kein Element &uuml;berfahren, den Wert <b>Nothing<\/b>.<\/li>\n<li>Deshalb pr&uuml;fen wir im folgenden Schritt, ob <b>objListItem <\/b>den Wert <b>Nothing <\/b>aufweist. Falls ja, stellen wir die Eigenschaft <b>DropHighlight <\/b>des <b>ListView<\/b>-Steuerelements auf <b>False <\/b>ein. In diesem Fall wird kein Zielelement hervorgehoben. Anderenfalls legen wir <b>DropHighlight <\/b>auf das Element aus <b>objListItem <\/b>ein.<\/li>\n<\/ul>\n<p>All dies f&uuml;hrt dazu, dass &uuml;berfahrene Element beim Drag and Drop wie in Bild 18 markiert werden und dass der Mauszeiger entsprechend angepasst wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_017.png\" alt=\"Markieren des Zielelements beim Drag and Drop\" width=\"424,5589\" height=\"263,2265\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Markieren des Zielelements beim Drag and Drop<\/span><\/b><\/p>\n<h2>Fallenlassen beim Drag and Drop<\/h2>\n<p>Schlie&szlig;lich folgt der letzte Schritt, das eigentliche Fallenlassen des Elements auf einem anderen Element oder unterhalb des letzten Elements. Dies erledigen wir mit der Ereignisprozedur <b>ctlListView_OLEDragDrop<\/b> aus Listing 6.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_OLEDragDrop(Data<span style=\"color:blue;\"> As Object<\/span>, Effect<span style=\"color:blue;\"> As Long<\/span>, Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         x<span style=\"color:blue;\"> As Single<\/span>, y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objSource<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Dim <\/span>objTarget<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n     <span style=\"color:blue;\">Dim <\/span>lngSourceIndex<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngTargetIndex<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strData<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/span>\r\n     strData = Data.GetData(ccCFText)\r\n     <span style=\"color:blue;\">Set<\/span> objListView.DropHighlight = Nothing\r\n     <span style=\"color:blue;\">Set<\/span> objSource = objListView.ListItems(strData)\r\n     lngSourceIndex = objSource.Index\r\n     <span style=\"color:blue;\">Set<\/span> objTarget = objListView.HitTest(x, y)\r\n     <span style=\"color:blue;\">If <\/span>objTarget Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         lngTargetIndex = objListView.ListItems.Count\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         lngTargetIndex = objTarget.Index\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strText = objSource.Text\r\n     strKey = objSource.Key\r\n     <span style=\"color:blue;\">If <\/span>lngTargetIndex = lngSourceIndex<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     objListView.ListItems.Remove lngSourceIndex\r\n     objListView.ListItems.Add lngTargetIndex, strKey, strText\r\n     objListView.ListItems(strKey).Selected = <span style=\"color:blue;\">True<\/span>\r\n     objListView.ListItems(strKey).EnsureVisible\r\n     Effect = ccOLEDropEffectMove\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Fallenlassen des Elements beim Drag and Drop<\/span><\/b><\/p>\n<p>Die Prozedur deklariert einige Variablen zum Referenzieren des gezogenen Elements und des Zielelements, der Indexe dieser Elemente, des <b>Key<\/b>-Wertes des gezogenen und des einzuf&uuml;genden Elements und schlie&szlig;lich den Text des einzuf&uuml;genden Elements.<\/p>\n<p>Im ersten Schritt lesen wir mit <b>GetData <\/b>den <b>Key<\/b>-Wert des gezogenen Elements aus dem Parameter <b>Data <\/b>der Prozedur aus und schreiben diesen in die Variable <b>strData<\/b>.<\/p>\n<p>Da der Drag and Drop-Vorgang nun beendet ist, braucht das Zielelement nicht mehr markiert zu werden, was wir durch Einstellen der Eigenschaft <b>DropHighlight <\/b>auf den Wert <b>Nothing <\/b>erreichen.<\/p>\n<p>Nun holen wir &uuml;ber die <b>ListItems<\/b>-Auflistung des <b>ListView<\/b>-Steuerleements mit dem Parameter <b>strData <\/b>einen Verweis auf das gezogene Element und speichern diesen in <b>objSource<\/b>. Au&szlig;erdem tragen wir den Index dieses Elements in <b>lngSourceIndex <\/b>ein.<\/p>\n<p>Anschlie&szlig;end ermitteln wir das Zielelement, also das Element, vor oder hinter dem wir das gezogene Element einf&uuml;gen wollen. Dazu nutzen wir wie bereits im Ereignis <b>OLEDragOver <\/b>die <b>HitTest<\/b>-Methode und &uuml;bergeben dieser die aktuelle Position mit <b>x <\/b>und <b>y<\/b>.<\/p>\n<p>Auch hier pr&uuml;fen wir wieder, ob das Zielelement leer ist. Wenn es leer ist, gehen wir allerdings in diesem Fall davon aus, dass sich das Ziel unterhalb der letzten bestehenden Zeile befindet.<\/p>\n<p>Es kann jedoch in diesem einfachen Beispiel auch passieren, dass der Benutzer das Element in die leere Spalte rechts von den Elementen zieht. Auch dies w&uuml;rde als Ziehen unterhalb des letzten Elements interpretiert werden. Wir gehen jedoch davon aus, dass das <b>ListView<\/b>-Steuerelement in der Regel vollst&auml;ndig gef&uuml;llt ist und bauen hier keine Sonderbehandlung f&uuml;r den Fall ein, dass er das Element in den leeren rechten Bereich zieht.<\/p>\n<p>Daher legen wir f&uuml;r den Fall, dass <b>objTarget <\/b>leer ist, davon aus, dass der Benutzer das Element unter das letzte Element ziehen m&ouml;chte und stellen als Zielindex in <b>lngTargetIndex <\/b>einen Wert ein, welcher der Anzahl der Elemente entspricht (<b>objListView.ListItems.Count<\/b>).<\/p>\n<p>Wenn <b>objTarget <\/b>nicht leer ist, legen wir <b>lngTargetIndex <\/b>auf den Index des Elements aus <b>objTarget <\/b>ein (<b>objTarget.Index<\/b>).<\/p>\n<p>Wozu ben&ouml;tigen wir die Indexe dieser Elemente? Weil wir, wenn der Benutzer ein Element auf das gleiche Element zieht, nichts geschehen soll.<\/p>\n<p>Nun speichern die die Werte der Eigenschaften <b>Text <\/b>und <b>Key <\/b>in den Variablen <b>strText <\/b>und <b>strKey <\/b>zwischen, da wir diese gleich beim Neuanlegen des Elements an der Zielposition ben&ouml;tigen.<\/p>\n<p>Hier kann der Fall auftreten, dass der Benutzer das gezogene Element auf dem gleichen Element ablegt. In diesem Fall soll nichts weiter geschehen und wir verlassen die Prozedur mit <b>Exit Sub<\/b>.<\/p>\n<p>Anderenfalls liegt eine Umsortierung vor. In diesem Fall entfernen wir nun zun&auml;chst das gezogene Element mit der <b>Remove<\/b>-Methode der <b>ListItems<\/b>-Auflistung, indem wir dieser den Index des zu entfernenden Elements &uuml;bergeben. Nun verschieben wir das gezogene Element, indem wir es neu erstellen. Dazu nutzen wir die <b>Add<\/b>-Methode des <b>ListView<\/b>-Steuerelements und f&uuml;gen es an dem Index aus <b>lngTargetIndex <\/b>ein. Au&szlig;erdem f&uuml;gen wir den Key und den Text aus <b>strKey <\/b>und <b>strText <\/b>hinzu.<\/p>\n<p>Schlie&szlig;lich markieren wir das verschobene Element, indem wir seine Eigenschaft <b>Selected <\/b>auf <b>True <\/b>einstellen und die Methode <b>EnsureVisible<\/b> aufrufen.<\/p>\n<h2>Testen von Drag and Drop<\/h2>\n<p>Wir testen nun zun&auml;chst das Ziehen des Elements <b>Text 7 <\/b>auf das Element <b>Text 3<\/b>. Das Element wird anschlie&szlig;end wie in Bild 19 oberhalb von Element <b>Text 3 <\/b>abgelegt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_018.png\" alt=\"Drag and Drop von unten nach oben\" width=\"424,5589\" height=\"263,2265\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Drag and Drop von unten nach oben<\/span><\/b><\/p>\n<p>Nun initialisieren wir die Ansicht mit einem Klick auf Elemente wiederherstellen und ziehen das Element <b>Text 3 <\/b>auf das Element <b>Text 7<\/b> (siehe Bild 20).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1573_019.png\" alt=\"Drag and Drop von oben nach unten\" width=\"424,5589\" height=\"263,2265\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Drag and Drop von oben nach unten<\/span><\/b><\/p>\n<p>Warum werden die Elemente nun automatisch oberhalb angelegt, wenn wir von unten nach oben ziehen und unterhalb, wenn wir von oben nach unten ziehen? Das hat mit dem L&ouml;schen des gezogenen Elements und seiner Position zu tun. Wenn wir nach oben ziehen, legen wir den Index des gezogenen Elements auf den Index des Zielelements fest, was dazu f&uuml;hrt, dass der Index des Zielelements und aller darunter liegenden um <b>1 <\/b>erh&ouml;ht wird.<\/p>\n<p>Wenn wir nach unten ziehen, wird der Index aller unter dem gezogenen Element liegenden Elemente automatisch um <b>1<\/b> vermindert, da nun ein Element oberhalb entnommen wurde. Damit wird das gezogene Element zwar mit dem Index eingef&uuml;gt, den zuvor das Zielelement hatte, aber durch das Entnehmen des Elements wird auch der Index des Zielelements um <b>1 <\/b>vermindert, was dazu f&uuml;hrt, dass das verschobene Element hinter dem Zielelement eingef&uuml;gt wird.<\/p>\n<h2>Warum Ereignisse &uuml;ber ctlListView und nicht f&uuml;r objListView mit WithEvents festgelegt werden<\/h2>\n<p>Wir haben die Drag and Drop-Ereignisse f&uuml;r das Steuerelement <b>ctlListView <\/b>definiert. Wir h&auml;tten auch <b>objListView <\/b>wie folgt deklarieren k&ouml;nnen und daf&uuml;r die Ereignisse deklarieren. Der Grund, warum wir das nicht getan haben, sind unterschiedliche Einheiten f&uuml;r die mit <b>x <\/b>und <b>y <\/b>gelieferten Koordinaten beim Drag and Drop. <b>HitTest <\/b>kann nur <b>x <\/b>und <b>y <\/b>des Steuerelements direkt &uuml;bernehmen, f&uuml;r die Verwendung von <b>x <\/b>und <b>y <\/b>von <b>ctlListView.Object <\/b>m&uuml;ssten wir komplizierte Umrechnungen vornehmen. Dies wollten wir uns an dieser Stelle sparen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In diesem Beitrag haben wir die Programmierung des <b>ListView<\/b>-Steuerelements per VBA betrachtet. In einen weiteren Beitrag unter dem Titel <b>ListView aus Tabellen oder Abfragen f&uuml;llen <\/b>(<b>www.access-im-unternehmen.de\/1574<\/b>) schauen wir uns noch an, wie wir reale Daten aus Tabellen oder Abfragen im <b>ListView<\/b>-Steuerelement anzeigen k&ouml;nnen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ListViewSteuerelementMitVBAProgrammieren.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/7A345931-1E12-46CA-B35B-A0AE28FBC8B2\/aiu_1573.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;ListView-Steuerelement mit VBA programmieren&#8220; (www.access-im-unternehmen.de\/1573) haben wir gezeigt, wie wir mit dem ListView-Steuerelement arbeiten k&ouml;nnen. Dort haben wir bereits einige grundlegende VBA-Techniken gezeigt, mit denen wir das ListView-Steuerelement in den verschiedenen Ansichten mit Daten gef&uuml;llt haben. Im vorliegenden Beitrag geht es nun weiter: Wir zeigen, wie wir das Steuerelement per VBA programmieren k&ouml;nnen. Dabei liegt der Fokus auf den Methoden, mit denen wir auf Benutzereingaben reagieren oder verschiedene Informationen auslesen &#8211; zum Beispiel das aktuell markierte Element. Auch auf Mehrfachauswahl gehen wir ein, die wir sowohl setzen als auch auslesen werden. Und nat&uuml;rlich wird auch Drag and Drop eine Rolle in diesem Beitrag spielen.<\/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":[662025,66062025,44000044],"tags":[],"class_list":["post-55001573","post","type-post","status-publish","format-standard","hentry","category-662025","category-66062025","category-AccessSteuerelemente"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>ListView-Steuerelement mit VBA programmieren - 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\/ListViewSteuerelement_mit_VBA_programmieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ListView-Steuerelement mit VBA programmieren\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;ListView-Steuerelement mit VBA programmieren&quot; (www.access-im-unternehmen.de\/1573) haben wir gezeigt, wie wir mit dem ListView-Steuerelement arbeiten k&ouml;nnen. Dort haben wir bereits einige grundlegende VBA-Techniken gezeigt, mit denen wir das ListView-Steuerelement in den verschiedenen Ansichten mit Daten gef&uuml;llt haben. Im vorliegenden Beitrag geht es nun weiter: Wir zeigen, wie wir das Steuerelement per VBA programmieren k&ouml;nnen. Dabei liegt der Fokus auf den Methoden, mit denen wir auf Benutzereingaben reagieren oder verschiedene Informationen auslesen - zum Beispiel das aktuell markierte Element. Auch auf Mehrfachauswahl gehen wir ein, die wir sowohl setzen als auch auslesen werden. Und nat&uuml;rlich wird auch Drag and Drop eine Rolle in diesem Beitrag spielen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-02T21:35:34+00:00\" \/>\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=\"31\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"ListView-Steuerelement mit VBA programmieren\",\"datePublished\":\"2025-12-02T21:35:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/\"},\"wordCount\":5282,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2025\",\"6\\\/2025\",\"Access-Steuerelemente\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/\",\"name\":\"ListView-Steuerelement mit VBA programmieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2025-12-02T21:35:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListViewSteuerelement_mit_VBA_programmieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ListView-Steuerelement mit VBA programmieren\"}]},{\"@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":"ListView-Steuerelement mit VBA programmieren - 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\/ListViewSteuerelement_mit_VBA_programmieren\/","og_locale":"de_DE","og_type":"article","og_title":"ListView-Steuerelement mit VBA programmieren","og_description":"Im Beitrag \"ListView-Steuerelement mit VBA programmieren\" (www.access-im-unternehmen.de\/1573) haben wir gezeigt, wie wir mit dem ListView-Steuerelement arbeiten k&ouml;nnen. Dort haben wir bereits einige grundlegende VBA-Techniken gezeigt, mit denen wir das ListView-Steuerelement in den verschiedenen Ansichten mit Daten gef&uuml;llt haben. Im vorliegenden Beitrag geht es nun weiter: Wir zeigen, wie wir das Steuerelement per VBA programmieren k&ouml;nnen. Dabei liegt der Fokus auf den Methoden, mit denen wir auf Benutzereingaben reagieren oder verschiedene Informationen auslesen - zum Beispiel das aktuell markierte Element. Auch auf Mehrfachauswahl gehen wir ein, die wir sowohl setzen als auch auslesen werden. Und nat&uuml;rlich wird auch Drag and Drop eine Rolle in diesem Beitrag spielen.","og_url":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-12-02T21:35:34+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"31\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"ListView-Steuerelement mit VBA programmieren","datePublished":"2025-12-02T21:35:34+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/"},"wordCount":5282,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2025","6\/2025","Access-Steuerelemente"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/","url":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/","name":"ListView-Steuerelement mit VBA programmieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2025-12-02T21:35:34+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/ListViewSteuerelement_mit_VBA_programmieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"ListView-Steuerelement mit VBA programmieren"}]},{"@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\/55001573","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=55001573"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001573\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}