Listview Steuerelement hinzufügen

  • Excel

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Listview Steuerelement hinzufügen

    Hallo,

    aufgrund der Problematik, dass Listview in der 64-Bit Variante von Office nicht mehr unterstützt wird, möchte ich eine Abfrage ins Programm einbauen, dass Listview bei 32 bit hinzugefügt wird und ansonsten Listbox.

    Visual Basic-Quellcode

    1. #If Win64 Then
    2. 'Listbox Steuerelement hinzufügen
    3. #Else
    4. 'Listview Steuerelemet hinzufügen
    5. #End If


    Jetzt die entscheidene Frage, bisher füge ich die Steuerelemente per "Werkzeugsammlung" hinzu. Wie kann ich die beiden Steuerelemente per Code hinzufügen? Bestimmt einfach gelöst, stehe nur gerade auf dem Schlauch.

    Danke

    Gruß
    Die ListBox kannst du ja im Designer anlegen.
    Und im Falle von Win32 kannst du sie ausblenden und mit einer ListView überschreiben.
    Die ganzen Parameter musst du halt von Hand programmieren.

    Visual Basic-Quellcode

    1. ​#If Win32 Then
    2. MyListbox.Visible = False
    3. Dim MyListview As New ListView
    4. MyListView.Top =MyListBox.Top
    5. MyListView,Height=MyListBox.Height
    6. '...
    7. MyListView.Visible=True
    8. #End If
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Mist geht nicht ... SAM1 ist die Userform, in der die Listview angezeigt werden soll. Als Fehler kommt "Methode oder Datenobject nicht gefunden." in der fett markierten Zeile.

    Visual Basic-Quellcode

    1. Sub sam1_check()
    2. #If Win32 Then
    3. SAM1.ListBox1.Visible = False
    4. Dim MyListview As New ListView
    5. [b]SAM1.MyListview.Top = SAM1.ListBox1.Top[/b]
    6. SAM1.MyListview.Height = SAM1.ListBox1.Height
    7. SAM1.MyListview.Left = SAM1.ListBox1.Left
    8. SAM1.MyListview.Height = SAM1.ListBox1.Width
    9. SAM1.MyListview.FullRowSelect = True
    10. SAM1.MyListview.hidecolumnhead = True
    11. SAM1.MyListview.Visible = True
    12. #Else
    Hi,

    habs mal umgeschrieben, steht nun im UserForm_Initialize (SAM1)

    Visual Basic-Quellcode

    1. Private Sub UserForm_Initialize()
    2. #If Win32 Then
    3. ListBox1.Visible = False
    4. Dim MyListview As New ListView
    5. MyListview.Top = ListBox1.Top
    6. MyListview.Height = ListBox1.Height
    7. MyListview.Left = ListBox1.Left
    8. MyListview.Width = ListBox1.Width
    9. MyListview.FullRowSelect = True
    10. MyListview.HideColumnHeaders = True
    11. MyListview.Visible = True
    12. With MyListview.ColumnHeaders
    13. .Clear
    14. .Add , , "Artikelnummer", 120
    15. .Add , , "Artikelname", 260
    16. .Add , , "I-EK", 80
    17. .Add , , "I-VK", 100
    18. .Add , , "VA", 120
    19. .Add , , "Preis", 60
    20. End With
    21. MyListview.View = 3
    22. MyListview.ListItems.Clear
    23. #Else


    Jetzt kommt folgende Fehlermeldung, wenn ich aus dem Startmenü das entsprechende Untermenü aufrufen möchte, in dem Fall das besagte SAM1. Fehler kommt in Zeile 16.

    Fehlermeldung: Objekt unterstützt diese Eigenschaft oder Methode nicht

    Code zum Aufrufen:

    Visual Basic-Quellcode

    1. Private Sub Label68_Click()
    2. eanabfrage = "nein"
    3. logtext = "Anwahl Menü: Erstelle Frische Angebot aus S.A.M."
    4. Call loggen
    5. menuauswahl = "D": Call Suchen999
    6. If wert9 = "N" Then
    7. MsgBox ("Keine Berechtigung vorhanden.")
    8. Else
    9. Worksheets("System").Range("g2") = ""
    10. Worksheets("Tabelle3").Range("a1:K" & Rows.Count).Delete
    11. Worksheets("Tabelle4").Range("a1:K" & Rows.Count).Delete
    12. verschieben = 0
    13. merke = 0
    14. frische99 = 1
    15. start.Hide
    16. SAM1.Show
    17. Unload start
    18. End If
    19. End Sub


    Gruß

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Blaupunkt79“ ()

    Klappt es statt mit

    Visual Basic-Quellcode

    1. Dim MyListview As New ListView

    damit?

    Visual Basic-Quellcode

    1. Dim MyListview As ListView
    2. Set MyListview = Controls.Add("MSComctlLib.ListViewCtrl.2", "ListView1")

    Ich hab keine Ahnung von dynamischer Instanziierung in Office und zweifel auch nicht daran, dass @petaod da kilometerweit Vorsprung zu meinem Office-Wissen hat und bei sich den Code erfolgreich getestet hat, aber mit New wollte es bei mir (auch) nicht, nur mit der geschriebenen Instanziierung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Um ehrlich zu sein, hatte ich auch noch nie die Notwendigkeit, solche Controls dynamisch zu instanziieren.
    Das war auch nur ein Schuss ins Blaue, mit dem ich angefangen hätte.
    Ausprogrammiert und getestet hatte ich es nicht.

    Mir erscheint dein Ansatz mit Controls.Add durchaus logisch und zielführend.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Guten Morgen,

    jetzt funktioniert es mit der Darstellung.

    Ich kann nun die Artikel einlesen, hin- und herverschieben, löschen etc., werden auch in unterschiedlichen Farben dargestellt.

    Wie spreche ich allerdings nun die Listview bei einem Doppelklick an?

    Habe es versucht mit mylistview_dblClick, Listview_DblClick, Listview1_DblClick, keine Reaktion. mylistview habe ich im Übrigen nun als Public dimensioniert, funktioniert auch.

    Visual Basic-Quellcode

    1. Private Sub listview1_DblClick()
    2. MsgBox ("hallo")
    3. Dim zahl As String
    4. Dim nummer2 As Long
    5. Dim ho As Long
    6. logtext = "Anwahl: Doppelklick Artikel"
    7. Call loggen
    8. If Worksheets("Tabelle3").Range("B19") = "" Then MsgBox ("Kein Artikel zur Auswahl vorhanden!"): logtext = "Kein Artikel zur Auswahl vorhanden": Call loggen: GoTo zuende
    9. verschieben99 = 0
    10. merke1 = 1
    11. With mylistview
    12. zahl = .SelectedItem
    13. End With
    14. [...]


    Gruss
    Scheint nun zu funktionieren, bissl unverständlich das Ganze, da ja das Objekt eigentlich zugefügt wurde, könnte man dann doch einfach per "Listview1" ansprechen, verstehe nicht, warum man da Unterschiede zwischen dem Designer und per Code macht.

    Da bei mir die Aktualisierung der Listview über Module läuft, habe ich noch eine Variable "mylistview1" als Public definiert, da die "Private WithEvents MyListView As ListView" ja nur in der Userform aktiv ist. Sobald ich ein Modul aufrufe, passe ich anschließend die Werte dann an:

    Visual Basic-Quellcode

    1. Call baum 'Daten in Listview einlesen
    2. Set MyListView = MyListView1


    Könnte man sicher auch per Klassenmodul einfacher machen, aber da habe ich keine Ahnung von. :) Hauptsache das Ergebnis passt.

    Danke

    Gruss

    petaod schrieb:

    ​Private WithEvents MyListView As ListView
    Kannst du auch Public statt Private definieren, dann musst du keine Klimmzüge machen.

    Blaupunkt79 schrieb:

    Da bei mir die Aktualisierung der Listview über Module läuft
    ist deine Architektur wohl nicht so optimal.
    Aber das zu ändern, würde wohl einem kompletten Redesign entsprechen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --