Anzeige
Archiv - Navigation
1212to1216
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

If And Then

If And Then
Ingo
Hi!
Ich habe eine ComboBox, in der Daten aus einer Spalte aufgeführt werden sollen. Wichitg ist, dass nur Daten im Datumsformat enthalten sein sollen, um den Tabellenkopf auszuschließen, die Daten in aufsteigender Reihenfolge in der Box stehen sollen (es kommen mehrere gleiche Daten hintereinander vor) und leere Zellen nicht mit aufgenommen werden sollen.
Das ist wahrscheinlich gar nicht so schwer, aber ich bekomme die Formulierung für den Code einfach nicht hin...
Ich hoffe, ihr könnt mir dabei helfen!
Grüße
Ingo

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
sortiere doch vorher ...
17.05.2011 16:29:37
Matthias
Hallo Ingo
Du kannst doch Deine Spalte mit dem Datum vorher einfach aufsteigend Sortieren
und beim Befüllen der Combobox kannst Du die Zelle der ersten Zeile weglassen.
Userbild
Wie füllst Du die denn?
Mit AddItem oder durch RowSource
Zeig mal was Du schon hast.
Userbild
AW: Auswahlliste für Combobox
17.05.2011 16:49:47
fcs
Hallo Ingo,
so ein Code ist nicht ganz trivial. Insbesondere, wenn die Randbedingungen entsprechend zahlreich sind.
Über die Parameter der Function "ListeErstellen" kann festgelegt werden, welche Daten in die Auswahlliste der ComboBox übernommen werden sollen.
Gruß
Franz
'Diese Prozeduren müssen im Code-Modul des Objekts mit der Combobox stehen (Tabelle oder  _
Userform)
Sub Combobox1_Fuellen()
'Beispiel für Axtive-X-Combobox auf Tabellenblatt oder Userform
Me.ComboBox1.List = ListeErstellen(wksQuelle:=Worksheets("Tabelle1"), Spalte:=8, _
Doppelte:=False, Zeile1:=2, lFormat:=2)
End Sub
Sub DropDown_Fuellen()
'Beispiel für DropDown aus Formular-Steuerelemente auf Tabellenblatt
Dim oShape As Shape, aData, ii As Long
Set oShape = Me.Shapes("DropDown 6")
aData = ListeErstellen(wksQuelle:=Worksheets("Tabelle1"), Spalte:=8, _
Doppelte:=False, Zeile1:=2, lFormat:=2)
With oShape.ControlFormat
.RemoveAllItems
For ii = LBound(aData) To UBound(aData)
.AddItem aData(ii)
Next
End With
End Sub
'### Diese Prozeduren sollten in einem allgemeinen Modul eingefügt werden ###
Function ListeErstellen(wksQuelle As Worksheet, Spalte As Long, _
Optional Doppelte As Boolean = False, _
Optional Zeile1 As Long = 1, _
Optional lFormat As Long = 0, _
Optional bBlank As Boolean = False) As Variant
'Erstellt eine 1-spaltige Liste der Eintrage in der Spalte gemäß gewählten Optionen
'wksQuelle: Tabelle aus der Daten ausgelesen werden sollen
'Spalte:    Nummer der Spalte aus der Werte ausgelesen werden sollen
'Doppelte:  Wenn True, dann werden doppelte in Liste aufgenommen
'Zeile1:    Zeile ab der Werte eingelesen werden sollen
'lFormat:   0 = Variant(beliebig), _
1 = nummerisch, _
2 = Datum, _
3 = Text(Zelle wie formatiert)
'bBlank:    Wenn True, dann werden Leerzellen in Liste aufgenommen
Dim arrListe(), ii As Long, Zeile As Long
Dim oCollection As New Collection
On Error GoTo Fehler
With wksQuelle
ii = 0
'Werte aus Spalte einlesen in Datenarray
For Zeile = Zeile1 To .Cells(.Rows.Count, Spalte).End(xlUp).Row
If bBlank = False And IsEmpty(.Cells(Zeile, Spalte)) Then GoTo Next_Zeile
Select Case lFormat
Case 0 'Variant (beliebige) Werte
If Doppelte = False Then oCollection.Add Item:=.Cells(Zeile, Spalte), _
Key:=CStr(.Cells(Zeile, Spalte))
ii = ii + 1
ReDim Preserve arrListe(1 To ii)
arrListe(ii) = .Cells(Zeile, Spalte)
Case 1 'nummerische Werte
If IsNumeric(.Cells(Zeile, Spalte)) Then
If Doppelte = False Then oCollection.Add Item:=.Cells(Zeile, Spalte), _
Key:=CStr(.Cells(Zeile, Spalte))
ii = ii + 1
ReDim Preserve arrListe(1 To ii)
arrListe(ii) = .Cells(Zeile, Spalte).Value
End If
Case 2 'Datums-Werte
If IsDate(.Cells(Zeile, Spalte)) Then
If Doppelte = False Then oCollection.Add Item:=.Cells(Zeile, Spalte), _
Key:=Format(.Cells(Zeile, Spalte), "YYYY-MM-DD hhmmss")
ii = ii + 1
ReDim Preserve arrListe(1 To ii)
arrListe(ii) = .Cells(Zeile, Spalte).Value
End If
Case 3 'Textwerte, Zellinhalte wie formatiert
If Doppelte = False Then oCollection.Add Item:=.Cells(Zeile, Spalte), _
Key:=.Cells(Zeile, Spalte).Text
ii = ii + 1
ReDim Preserve arrListe(1 To ii)
arrListe(ii) = .Cells(Zeile, Spalte).Text
Case Else
MsgBox "Für ""lFormat"" wurde falscher Parameter-Wert übergeben!"
ListeErstellen = Array("")
GoTo Fehler
End Select
Next_Zeile:
Next
End With
If ii > 0 Then
'Liste sortieren
Call QuickSort(arrListe)
ListeErstellen = arrListe
Else
ListeErstellen = Array("")
MsgBox "Es wurden keine passenden Einträge gefunden"
End If
Fehler:
With Err
Select Case .Number
Case 0
Case 457 'Doppeltes Element in Collection
Resume Next_Zeile
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
Erase arrListe
Set oCollection = Nothing
End Function
Sub QuickSort(ByRef VA_array, Optional V_Low1, Optional V_high1)
On Error Resume Next
Dim V_Low2, V_high2, V_loop As Integer
Dim V_val1, V_val2 As Variant
If IsMissing(V_Low1) Then
V_Low1 = LBound(VA_array, 1)
End If
If IsMissing(V_high1) Then
V_high1 = UBound(VA_array, 1)
End If
V_Low2 = V_Low1
V_high2 = V_high1
V_val1 = VA_array((V_Low1 + V_high1) / 2)
While (V_Low2  V_val1 And _
V_high2 > V_Low1)
V_high2 = V_high2 - 1
Wend
If (V_Low2  V_Low1) Then Call _
QuickSort(VA_array, V_Low1, V_high2)
If (V_Low2 

Anzeige
AW: Auswahlliste für Combobox
17.05.2011 21:26:02
Ingo
Mein Code lautet soweit:
Private Sub UserForm_Initialize()
Dim Zelle As Range
For Each Zelle In Worksheets("Tabelle1").Range("B2:B56")
If Not IsEmpty(Zelle) Then
ComboBox1.AddItem Zelle
End If
Next
Er funktioniert soweit, dass die leeren Zellen (Spaltenendeerkennung) nicht mit aufgenommen werden. Ich habe angenommen, ich kann einfach zwischen if und then noch die anderen zwei Bedingungen packen und das wärs dann...
Gruß
Ingo
AW: Auswahlliste für Combobox
17.05.2011 21:56:54
fcs
Hallo Ingo,
probiere mal folgendes
Private Sub UserForm_Initialize()
Dim Zelle As Range
'Combobox1.Clear 'vorhandene Liste in Combobox löschen
For Each Zelle In Worksheets("Tabelle1").Range("B2:B56")
If Not IsEmpty(Zelle) Then
If Zelle.Offset(-1, 0).Value  Zelle.Value And IsDate(Zelle.Value) Then
Combobox1.AddItem Zelle
End If
End If
Next
Gruß
Franz
Anzeige
AW: Auswahlliste für Combobox
18.05.2011 02:55:49
Ingo
Hallo Franz,
die Zeile:
If Zelle.Offset(-1, 0).Value Zelle.Value And IsDate(Zelle.Value) Then
in deinem Code ist das, wonach ich gesucht habe! Vielen Dank dafür!
Mein Code sieht nun so aus:
Private Sub UserForm_Initialize()
Dim Zelle As Range
For Each Zelle In Worksheets("Tabelle1").Range("B:B")       'gesamte Spalte B aufnehmen
If IsDate(Zelle.Value) Then                             'nur aufnehmen, wenn Datum vorliegt
If Zelle.Offset(-1, 0).Value  Zelle.Value Then    'und der Nachfolgewert größer ist
ComboBox1.AddItem Zelle
End If
End If
Next
End Sub
Das funktioniert nun so, wie es soll!
Ich brauche den Range der Spalte auch nicht einschränken, da die "Datums-Bedingung" die Kopfzeile ausschließt. Die Bedingung "If Not IsEmpty..." ist auch nicht notwendig. Ich bin mir nicht sicher, ob die "Datums-Bedingung" oder die Bedingung, dass Nachfolgewerte größer sein müssen, das erledigt oder beides.
Die Excel-Tabelle sieht so aus:
Tabelle1
 BCD
1DatumZweckBetrag
227.01.2011Einkauf1,00
327.01.2011Essen2,00
427.01.2011Unterkunft3,00
528.01.2011Einkauf4,00
628.01.2011Essen5,00
728.01.2011Unterkunft6,00
829.01.2011Einkauf7,00
929.01.2011Essen8,00
1029.01.2011Unterkunft9,00

Tabellendarstellung in Foren Version 5.43


In meiner Userform "sagen" die, in der ComboBox ausgewählten Werte den Textfeldern, welche Beträge für "Einkäufe", "Essen" und "Unterkunft" eingetragen werden sollen. Der Code dafür lautet eigentlich:
Private Sub ComboBox1_Change()
TextBox1 = Worksheets("Tabelle1").Cells(ComboBox1.ListIndex + 2, 4)
TextBox2 = Worksheets("Tabelle1").Cells(ComboBox1.ListIndex + 3, 4)
TextBox3 = Worksheets("Tabelle1").Cells(ComboBox1.ListIndex + 4, 4)
End Sub
Nun habe ich das Problem, dass nur für das erste Datum die korrekten Werte angezeigt werden. Für die anderen Daten sind die Werte verschoben.
Wie kann ich der Textbox mitteilen, dass nur die Werte ab der Zeile, in der das Datum ausgewählt wurde, übernommen werden?
Gruß
Ingo
Anzeige
AW: Auswahlliste für Combobox
18.05.2011 19:17:18
fcs
Hallo Ingo,
die Prüfung auf "IsDate" eliminiert auch die leeren Zellen aus der Liste.
Damit du aus der Combobox-Auswahl anschliessend die korrekten Werte aus der Tabelle einlesen kannst, muss du zusätzlich zum Datum auch die zugehörige Zeilennummer einlesen.
Dazu unter den Eigenschaften der Combobox1 im Userform-Editor für "ColumnCount" den Wert 2 eingeben.
Damit die Zeilennummern in der Auswahlliste der Combox1 nicht angezeigt wird unter der Eigenschaft "ColumnWidths" eintragen: 35Pt;0 Pt
Den Wert 35 ggf. anpassen.
Code-Anpassungen:
Private Sub UserForm_Initialize()
Dim Zelle As Range
With Worksheets("Tabelle1")
For Each Zelle In .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp)) 'gesamte Spalte B  _
aufnehmen
If IsDate(Zelle.Value) Then                             'nur aufnehmen, wenn Datum  _
vorliegt
If Zelle.Offset(-1, 0).Value  Zelle.Value Then    'und der Nachfolgewert größer ist
With ComboBox1
'Wert nächstes Item in 0. Spalte der Itemliste einlesen
.AddItem Zelle
'zugehörige Zeilennummer in 1. Spalte der Itemliste einlesen
.List(.ListCount - 1, 1) = Zelle.Row
End With
End If
End If
Next
End With
Private Sub ComboBox1_Change()
With ComboBox1
TextBox1 = Worksheets("Tabelle1").Cells(.List(.ListIndex, 1), 4)
TextBox2 = Worksheets("Tabelle1").Cells(.List(.ListIndex, 1) + 1, 4)
TextBox3 = Worksheets("Tabelle1").Cells(.List(.ListIndex, 1) + 2, 4)
End With
End Sub

Du solltest die For-Next-Schleife nicht alle Zellen in Spalte B abarbeiten lassen, sondern nur den mit Daten belegten Bereich. Das ist in der Ausführung deutlich schneller.
Gruß
Franz
Anzeige
AW: If And Then
17.05.2011 21:40:16
Ingo
Mein Code lautet soweit:
Private Sub UserForm_Initialize()
Dim Zelle As Range
For Each Zelle In Worksheets("Tabelle1").Range("B2:B56")
If Not IsEmpty(Zelle) Then
ComboBox1.AddItem Zelle
End If
Next
Er funktioniert soweit, dass die leeren Zellen (Spaltenendeerkennung) nicht mit aufgenommen werden. Ich habe angenommen, ich kann einfach zwischen if und then noch die anderen zwei Bedingungen packen und das wärs dann...
Gruß
Ingo

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige