[VBA] freie Wahl von ListBox oder TextBox
#1
Hallo,

ich habe zwei Userformen, eine mit ListBox und eine mit TextBox und kann entweder die eine oder die andere verwenden.

Ich will das jetzt in eine einzige Userform zusammenführen, damit der User die Wahl hat, etwas aus der ListBox auszuwählen oder die Nummer in die TextBox einzugeben. Je nachdem soll dann die Auswahl weiterverarbeitet werden, wie wird das gelöst? Wie kann ich da eine Entscheidung einbauen, je nachdem, ob etwas ausgewählt oder in die Textbox eingegeben wird.

Makro für Userform mit nur ListBox:
Code:
Private Sub okButton1_Click()          ' Übernehmen
  boAbbruch = False
 
  Application.ScreenUpdating = False
 
  'Datenzeile aus Formular ermitteln
  lngAdressZeile = ListBox1.ListIndex + 2
...  

Makro für Userform mit nur TextBox:
Code:
Private Sub okButton_Click()
   Call Suchen_ReNr
...

Sub Suchen_ReNr()
  Dim i As Long, j As Long
  Dim loLetzte As Long
  Dim strText As String
  Dim arrTab
  Dim rngData As Range
 
  strText = "*" & strSuchbegriff & "*"
  Application.ScreenUpdating = False
 
  With Sheets("Datenbankliste")
     loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row 'Letzte Zeile der Spalte A (1)
     Set rngData = .Range("H2:H" & loLetzte).Find(strText, LookIn:=xlValues, LookAt:=xlPart, _
         SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)
     If Not rngData Is Nothing Then
        lngAdressZeile = rngData.Row
        'MsgBox lngAdressZeile
     End If
  End With
 
  If rngData Is Nothing Then
     MsgBox "Rechnungsnummer wurde nicht gefunden!"
  Else
     Set rngData = Nothing
  End If
 
End Sub

Wie können die miteinander kombiniert werden?
Top
#2
Hi,

Auf Grund von Usability würde ich beide kombinieren!
Wird was in der Listbox gewählt erscheint das auch in der TextBox, wird was in der TextBox gewählt in der Listbox.
Inklusive einer Überprüfung ob das was in der TextBox steht auch in der Listbox vorkommt.

Wobei ich statt einer TextBox gleich eine Combo wählen würde!

.xlsm   rabe.xlsm (Größe: 22,13 KB / Downloads: 11)
lg
Chris
lg Chris
Feedback nicht vergessen.
[Bild: v.gif]
3a2920576572206973742064656e20646120736f206e65756769657269672e
Top
#3
Hi Ralf,

verknüpft dann z.B. so:

Private Sub ListBox1_Change()
 If Me.ActiveControl.Name = "ListBox1" Then
   If ListBox1.ListIndex > -1 Then
     TextBox1 = ListBox1
   End If
 End If
End Sub

Private Sub okButton_Click()
 boAbbruch = False

 Application.ScreenUpdating = False

 'Datenzeile aus Formular ermitteln
 lngAdressZeile = ListBox1.ListIndex + 2
 ...
End Sub

Private Sub TextBox1_Change()
 Dim lngZ As Long
 If Me.ActiveControl.Name = "TextBox1" Then
   With Me.ListBox1
     .ListIndex = -1
     If Len(TextBox1) Then
       For lngZ = 0 To .ListCount - 1
         If TextBox1.Text = Left(.List(lngZ), Len(TextBox1)) Then
           .ListIndex = lngZ
           Exit For
         End If
       Next lngZ
     End If
   End With
 End If
End Sub

Gruß Uwe
Top
#4
Code:
Private Sub cmbOK_Click()
   msgbox Listbox1.value & Texbox1.Text
End Sub
Top
#5
Vielen Dank, ich habe die Version von Chris verwendet!
Top
#6
Combobox ist entworfen um Wahl und eigene Texte zu kombinieren.
Statt Textbox + Listbox, oder Textbox + Combobox reicht eine Combobox.
Top
#7
Hi,

(16.02.2016, 13:11)snb schrieb: Statt Textbox + Listbox, oder Textbox + Combobox reicht eine Combobox.

aaah, ja, interessant.

Wie sieht denn der Code aus, wenn ich nur eine Combobox habe und da eine Liste drin haben will, aber auch die Möglichkeit, eine manuelle Eingabe zu ermöglichen?
Wie wird die ComboBox mit der Liste befüllt?

Bisher ist der Code so:
Code:
Option Explicit

Private Sub ListBox1_Click()
  Dim i As Long
  Me.txt_nr.Text = Me.ListBox1.List(Me.ListBox1.ListIndex)
End Sub

Private Sub txt_nr_Change()
  Dim i As Long
  If IsNumeric(Me.txt_nr.Text) Or Me.txt_nr.Text = "" Then
  For i = 0 To Me.ListBox1.ListCount - 1
     If Me.txt_nr.Text = Me.ListBox1.List(i) Then
     Me.ListBox1.ListIndex = i
     End If
  Next
  End If
End Sub

'Private Sub UserForm_Activate()
'   Dim i As Integer
'   For i = 1 To 40
'      Me.ListBox1.AddItem i
'   Next
'End Sub

Private Sub UserForm_Initialize()
  Dim objWs As Worksheet
  Dim objZeile As Range
  Set objWs = ThisWorkbook.Worksheets("Datenbankliste")
 
  For Each objZeile In objWs.UsedRange.Rows
     If objZeile.Row > 1 Then
     Me.ListBox1.AddItem objZeile.Cells(1, 8)
     End If
  Next objZeile
  Set objWs = Nothing
  Set objZeile = Nothing
  strDatei = ThisWorkbook.Path & "\Logo.jpg"
  If Dir(strDatei) = "" Then               ' prüfen, ob Bild vorhanden
  MsgBox ("Firmenlogo fehlt! " & Chr(10) & Chr(13) & strDatei)
Else
  Me.Image1.Picture = LoadPicture(strDatei)
  End If
End Sub

Private Sub CancelButton_Click()           ' Eingabe abbrechen
  boAbbruch = True
  Unload Me
  '   Me.Hide
End Sub

Private Sub okButton1_Click()          ' Übernehmen
  boAbbruch = False
 
  Application.ScreenUpdating = False
 
  'Datenzeile aus Formular ermitteln
  lngAdressZeile = ListBox1.ListIndex + 2

...
Top
#8
Diese Code reicht:

Code:
Private Sub UserForm_Initialize()
  combobox1.list=ThisWorkbook.Worksheets("Datenbankliste").usedrange.value
 
  If Dir(ThisWorkbook.Path & "\Logo.jpg") <> "" Then Image1.Picture = LoadPicture(ThisWorkbook.Path & "\Logo.jpg")
End Sub

Private Sub okButton1_Click()
  msgbox combobox1.value
end sub
Top
#9
(16.02.2016, 14:11)Rabe schrieb: Wie sieht denn der Code aus, wenn ich nur eine Combobox habe und da eine Liste drin haben will, aber auch die Möglichkeit, eine manuelle Eingabe zu ermöglichen?
Wie wird die ComboBox mit der Liste befüllt?

Haaah! Selbst rausbekommen:
Code:
Private Sub UserForm_Initialize()
   Dim objWs As Worksheet
   Dim objZeile As Range
   Set objWs = ThisWorkbook.Worksheets("Datenbankliste")
  
   For Each objZeile In objWs.UsedRange.Rows
      If objZeile.Row > 1 Then
         loLetzte = objWs.Cells(Rows.Count, 1).End(xlUp).Row                     ' letzte belegte in Spalte A (1)
         ComboBox1.RowSource = "Datenbankliste!H2:H" & loLetzte
      End If
   Next objZeile
   Set objWs = Nothing
   Set objZeile = Nothing
End Sub

Private Sub CancelButton_Click()           ' Eingabe abbrechen
   boAbbruch = True
   Unload Me
End Sub

Private Sub okButton1_Click()          ' Übernehmen
   boAbbruch = False
  
   Application.ScreenUpdating = False
  
   'Datenzeile aus Formular ermitteln
   lngAdressZeile = ComboBox1.ListIndex + 2
...

Das gefällt mir jetzt! Super Lösung!
Top
#10
Hallo Ralf,

erkennst Du, was hier passiert:


Code:
  For Each objZeile In objWs.UsedRange.Rows
     If objZeile.Row > 1 Then
        loLetzte = objWs.Cells(Rows.Count, 1).End(xlUp).Row                     ' letzte belegte in Spalte A (1)
        ComboBox1.RowSource = "Datenbankliste!H2:H" & loLetzte
     End If
  Next objZeile
Gruß Atilla
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste