Clever-Excel-Forum

Normale Version: VBA: Liste aus intelligenter Tabelle
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen und guten Mittag,

ich hätte eine Frage zum VBA-Programmieren mit bzw. von intelligenten Tabellen.

Ich habe eine intelligente Tabelle, in der Übungen im Fitnessstudio gemeinsam mit deren Widerstand und Zusatzequipment eingetragen werden. Nun möchte ich neue Übungen gerne per UF eintragen lassen. 
In der UF habe ich auch zwei ComboBoxen, um die Eingabe bestehender Widerstände und Equipments zu erleichtern. Nun möchte ich, dass die ComboBoxen aus der zweiten Spalte der Tabelle (ohne Duplikate) gefüttert werden.

Habe mal den Code geschrieben...
Code:
Private Sub UserForm_Initialize()

Dim objDic As Object                          'Definiert "objDic" als Object
Dim lngZ As Long                              'Definiert "lngZ" als Long, um die letzte genutzte Zeile zu finden

Set objDic = CreateObject("Scripting.Dictionary")

For lngZ = 6 To Tabelle10.Cells(Rows.Count, 3).End(xlUp).Row
  objDic(Tabelle10.ListObjects("tbl_KrafttrainingÜbungen[Widerstand]")) = 0
Next

frmÜbungHinzufügen.cboWiderstand.List = objDic.keys

End Sub

'Zur Info:
'lngZ = 6 bedeutet (oder soll bedeuten), dass die intelligente Tabelle ab Spalte 6 mit Werten beginnt (Überschrift ist Zeile 5)

...bei dem aber bei Ausführung Laufzeitfehler 9 "Index liegt außerhalb gültigem Bereich" erscheint.

Kennt sich hier jemand aus und könnte mir auf die Sprünge helfen?

Danke für eure Hilfe, lieben Gruß und schönen Sonntag
Domi
Hallo,

ich habe dir im Arbeitsblatt "Tabelle1" (interner Objektname: Tabelle10) die strukturierte Tabelle "tbl_KrafttrainingÜbungen" eingefügt. Diese enthält die Spalte "Widerstand".

Ferner habe ich eine Userform "frmÜbungHinzufügen" eingefügt mit der Kombobox "cboWiderstand".

Klickt man im Arbeitsblatt "Tabelle1" auf den Button "frmÜbungHinzufügen anzeigen" erscheint die Userform, wobei die Auswahlliste der Kombobox mit den Werten der Spalte "Widerstand" befüllt ist.
Code:
Option Explicit

'UserForm = frmÜbungHinzufügen = Me

Private Sub UserForm_Initialize()
   Dim lstKraftÜbg As ListObject
   Dim arrWiderst As Variant
   
   'Tabelle10 (interner Name der Arbeitsblatt-Objektinstanz)
   'Tabelle1  (Name, der im Arbeitsblatt-Tabulator angezeigt wird)
   Set lstKraftÜbg = Tabelle10.ListObjects("tbl_KrafttrainingÜbungen")
   arrWiderst = lstKraftÜbg.ListColumns("Widerstand").DataBodyRange
   Me.cboWiderstand.List() = arrWiderst
      
End Sub
Hallo Anton, 

vielen lieben Dank für deine Hilfe.

Habe es bereits in meine Datei eingepflegt - funzt perfecto.

Danke nochmal für deine Hilfe/Mühe und schönen Rest-Sonntag.
Domi
Hallo Anton,

habe deinen Code implementiert und er funktioniert soweit gut.

Jedoch habe ich ein anderes Problem: Da in der Spalte "Widerstand" gewisse Einträge doppelt vorkommen, werden mir diese nun auch doppelt angezeigt (da er jede Zeile zur Auswahl stellt). Kann man die Duplikate irgendwie umgehen bzw. die cbo so einstellen, dass keine Duplikate angezeigt werden?

Sorry für die Umstände und trotzdem danke
Domi
Hi

Mit Dictionary würde gehen. 
Hier mal über Zellbereich und Standardfunktion. Für die Datei aus #2.
Code:
Private Sub UserForm_Initialize()

With Sheets("Tabelle1")
   .ListObjects("tbl_KrafttrainingÜbungen").ListColumns("Widerstand").DataBodyRange.Copy Range("M1")
   .Range("M1:M" & .Cells(Rows.Count, 13).End(xlUp).Row).RemoveDuplicates Columns:=1, Header:=xlNo
   Me.cboWiderstand.List = .Range("M1:M" & .Cells(Rows.Count, 13).End(xlUp).Row).Value
   .Range("M1:M" & .Cells(Rows.Count, 13).End(xlUp).Row).Clear
End With

End Sub
Gruß Elex
Hallo Elex,

danke  für deinen Vorschlag, aber ich glaube ich habe mich nicht klar ausgedrückt.

Ursprünglich meinte ich, dass in der Combobox selber keine doppelten Werte auswählbar sein sollen, während aber in der Tabelle die doppelten Werte bestehen bleiben sollen (d.h. im Prinzip soll er nur für die Liste bzw. Combobox die Auswahl von "einfachen" Werten möglich machen, während die ursprüngliche Tabelle nicht angerührt wird.

Ist das möglich?

Danke trotzdem für die Mühe und schönen Abend,
Domi
Hallo zusammen,

habe mich eben nochmal durch Google gewühlt und bin per Zufall auf folgenden Code gestoßen.

Ich poste ihn mal falls jemand anderes davon profitieren kann:
Code:
Dim oDic As Object
Dim meAr
Dim A As Long

Set oDic = CreateObject("Scripting.Dictionary")

'Tabelle anpassen
With Tabelle10.ListObjects("tbl_KrafttrainingÜbungen")

'Bereich für die Combobox zum Auswählen festlegen
meAr = Tabelle10.ListObjects("tbl_KrafttrainingÜbungen").ListColumns("Widerstand").DataBodyRange
End With

For A = 1 To UBound(meAr)
  oDic(meAr(A, 1)) = 0
Next

frmÜbungHinzufügen.cboWiderstand.List = oDic.keys

Danke an die beiden Antworter für eure Hilfe und guten Wochenstart,
Domi
Moin

Rückmeldungen sind immer gern gesehen. Aber getestet hast du meinen Code nicht in der Datei aus #2. Denn er macht genau was du möchtest.
Aber wie geschrieben geht es auch über die Dict. Variante.