PDA

Vollständige Version anzeigen : Suchfunktion


T0601
09.07.2014, 08:20
Grüßt Euch.

Ich hoffe man kann mir hier weiterhelfen, da ich mir das selbst zusammengefrickelt und wenig Ahnung von VBA habe.

Ich habe eine Tabelle mit Informationen in den Spalten von A bis L.
Die Informationen beginnen in Zeile 3.

Jetzt möchte ich eine Suchfunktion per VBA machen. Ich möchte in ein Textfeld den Suchnamen eingeben (die durchsuchende Spalte ist A). Da es sein kann, dass es mehrere gleiche Einträge gibt, soll die Zeile in einer Listbox angegeben werden, also jede Zeile für sich. Diese möchte ich dann mit einem Doppelclick auswählen und in eine Userform übersichtlich darstellen.

Ich habe mich schonmal versucht. Mit Additem geht es nicht, da es mehr als 10 Spalten sind. Somit habe ich mit Row gearbeitet.

Dieser Code sieht bis dato so aus:


Private Sub Adresse_suchen_Click()
Dim ZeileMAx As Long
Dim Vardat As Variant

ZeileMAx = Tabelle1.Cells(Tabelle1.Rows.Count, 1).End(xlUp).Row
Vardat = Tabelle1.Range("A1:L" & ZeileMAx).Value

With Me.ListBox1
.ColumnHeads = True
.ColumnWidths = "140"
.ColumnCount = Tabelle1.Range("A1:L1").Columns.Count
.RowSource = Tabelle1.Range("A2:L" & ZeileMAx).Address
End With
End Sub

Problem ist nur, er stellt jede Zeile dar. Irgendwie habe ich das Gefühl, da fehlt etwas Code.

Danke schonmal. Ich habe die Datei mal angehangen.

Gruß

R J
09.07.2014, 09:22
Hi TO,

ich vermute mal, Du suchst sowas... (http://www.online-excel.de/excel/singsel_vba.php?f=65) (mehrspaltige Listbox)

T0601
09.07.2014, 09:44
Wie gesagt, ich bin nicht so konform auf dem Gebiet VBA.

In erster Linie geht es mir um die Suchfunktion.

Wie im Anhang dargestellt.

In der Suchform die Schule (z.B. Real) eingeben und auf "Schule suchen klicken.
Dann soll in der ListBox die Zeile angezeigt werden.

Das wäre schonmal ein Schritt für mich, der mir weiterhilft.

R J
09.07.2014, 11:10
..ok... und vermutlich suchst Du die Zeilennummer :


Sub SucheZeile()
Dim zeile&
'Suche in Tabelle1, Spalte A (1. Spalte), nach String 23....
zeile = FindeZeile("Tabelle1", 1, "23")
End Sub

Function FindeZeile(Blatt As String, Spalte As Integer, SuchBegriff As String) As Double
Dim lz&
lz = 0
On Error Resume Next
lz = Worksheets(Blatt).Columns(Spalte).Find(what:=SuchBegriff, lookat:=xlWhole).Row
On Error GoTo 0
FindeZeile = lz
End Function

T0601
10.07.2014, 08:37
Ich habe das jetzt etwas anders gelöst. (siehe Anhang)

Jetzt bekomme ich eine Fehlermeldung beim Datensatz_ändern, wenn ich die Schulnummer eingebe.

Private Sub CommandButton1_Click()
Dim rng As Range
Set rng = Sheets("Stammdaten").Columns(1).Find(what:=Datensatz_ändern.TextBox1, lookat:=xlWhole)
If Not rng Is Nothing Then
Änderform.Show
Else
MsgBox ("Schule nicht gefunden")
End If
End Sub

Ich habe immo keine Ahnung warum?

Kann mir da einer weiterhelfen?

chris-kaiser
10.07.2014, 08:49
Hi,

ja aber der Fehler liegt in "Änderform"

Private Sub UserForm_Initialize()
Dim i As Integer, rng As Range
With Worksheets("Stammdaten")
Set rng = .Columns(1).Find(what:=Datensatz_ändern.TextBox1, lookat:=xlWhole)
For i = 1 To 32
Me.Controls("TextBox" & CStr(i)) = .Cells(rng.Row, i)
Next i
End With
TextBox1.Enabled = False
End Sub

Du hast auf dieser Form keine Textbox2
da liefert Me.Controls("TextBox" & CStr(i)) = .Cells(rng.Row, i)
das bei i = 2 einen Fehler.

T0601
10.07.2014, 09:18
Ich habe es getestet.

Jetzt meckert er bei Deinem Code.

Ich glaube ich sollte weniger Fussball bis spät abends schauen. :grins:

Er soll ja die Daten in die Änderform übernehmen, damit ich Sie dann ändern kann.

Vorher hatte ich es so. Da hatte ich die Schulnummer in einer festen Form (Schreibweise) deklariert (siehe Anhang). Das soll aber raus.
Ich will einfach das er in der Tabelle "Stammdaten" in Spalte 1 nach der Schulnummer sucht (ohne irgendwelche festen Formen). Wenn ich dann mit "suchen" bestätige, soll es in der Userform "Änderform" übernommen werden.

chris-kaiser
10.07.2014, 09:21
Hi,

Jetzt meckert er bei Deinem Code.

Ich habe keinen Code geschrieben, nur darauf hinweisen das es bei Dir keine Textbox2 gibt und deshalb der Fehler dort auftritt!

T0601
10.07.2014, 09:23
Scheint mir ein Fehler zu sein, der auf den weiteren Ablauf hinweist.

Ich teste mal weitere und grenze den ein.

Wenn einer schneller ist, immer her mit

:grins: :grins:

T0601
10.07.2014, 09:34
Gefunden - erldigt

Den Baum im Wald gefunden^^

T0601
10.07.2014, 09:49
Aber ich muss es nochmal versuchen, da mir gerade etwas eingefallen ist.

Wenn ich unter "Schule anlegen" jetzt meine Daten einpflege oder später neue hinzukommen, sind diese ja so sortiert in dem Tabellenblatt "Stammdaten" wie ich diese eingebe.

Wie schaff ich es, wenn ich auf "eintragen" klicke, dass diese dann einsortiert werden. Und zwar sortiert nach Schulnamen.

Danke schonmal.

T0601
10.07.2014, 09:50
Hier noch die Datei.

kein Passwort!

T0601
11.07.2014, 05:44
Hat geklappt. Danke.

T0601
11.07.2014, 06:10
Es funktioniert auch alles wie es soll (ist noch nicht in den Ausdrucken genau formatiert), aber ich würde gerne noch etwas umsetzen. Die Datei habe ich hier mal angehangen. (Adminebene ist ohne Passwort).

Also, es existiert folgender Code:

Dim rngCell As Range, rng As Range
Dim strFirstAddress As String
If Me.TextBox1 = "" Then
Me.ListBox1.Clear
Exit Sub
End If
With Worksheets("Stammdaten")
Set rng = .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp))
End With
Set rngCell = rng.Find(Me.TextBox1.Value, LookIn:=xlValues, lookat:=xlPart)
With Me.ListBox1
.Clear
.ColumnCount = 9
.ColumnWidths = "3,9cm;2,5cm;2,5cm;2,6cm;2,5cm;3,5cm;3,5cm;3,5cm;3,5cm"
End With
If Not rngCell Is Nothing Then
strFirstAddress = rngCell.Address
Do
With Me.ListBox1
.AddItem
.List(.ListCount - 1, 0) = rngCell.Value
.List(.ListCount - 1, 1) = rngCell.Offset(0, 1).Value
.List(.ListCount - 1, 2) = rngCell.Offset(0, 2).Value
.List(.ListCount - 1, 3) = rngCell.Offset(0, 8).Value
.List(.ListCount - 1, 4) = rngCell.Offset(0, 9).Value
.List(.ListCount - 1, 5) = rngCell.Offset(0, 10).Value
.List(.ListCount - 1, 6) = rngCell.Offset(0, 11).Value
.List(.ListCount - 1, 7) = rngCell.Offset(0, 12).Value
.List(.ListCount - 1, 8) = rngCell.Offset(0, 17).Value
.List(.ListCount - 1, 9) = rngCell.Row
End With
Set rngCell = rng.FindNext(rngCell)
Loop While Not rngCell Is Nothing And rngCell.Address <> strFirstAddress
Else
MsgBox "Schule nicht gefunden", 48
End If

Es klappt alles. Aber ich möchte eine weitere Suche implementieren, die genauso aufgebaut ist, wie die Userform:Suchenform. Ich möchte jetzt aber wenn ich diese anklicke, dass die Zeile (Spalte A-N) in ein neues Tabellenblatt kopiert wird.

Am liebsten wäre mir es, wenn ich meine 70 Schulen in einer Listbox alle drin habe (mit Infos aus Zeile A-E) und dann per Häkchen setzen, diese Zeilen in ein neues Tabellenblatt übernommen werden. Also Haken setzen, auf übernehmen klicken und die Zeile (bestimmte Spalten) ist in einem neuen Tabellenblatt und zwar sortiert nach Schulname (Sortierfunktion bekomme ich auch selbst hin).

Vielleicht kann man mir weiterhelfen.

T0601
11.07.2014, 08:34
Keiner eine Idee?