# Brauche Hilfe bei einer Suchfunktion



## ozak (6. April 2006)

Hallo!

Also ich habe nicht soviel ahnung von VBA.
Meine Problem:
Ich habe eine Excel Datei mit 11 Tabellen. Die Tabelle "Start" beinhaltet eine Textbox wo man einen Namen eingeben kann, und ein Button "Suchen".
Wenn man nun den Namen eingibt soll man den Button betätigen und dann soll er in die Tabelle "Namen" Springen den oder die entsprechenden Namen raussuchen nach denen ich suchen möchte und  auf der Tabelle "Start" in einer oder mehreren Zeilen ausgeben.

Ich wäre euch sehr dankbar wenn ihr mir helfen könntet.

MFG

ozak


----------



## Nirraven (6. April 2006)

Hi, Also es müsste


```
Private Sub CommandButton1_Click()
Dim bla
Dim i
Dim z
bla = TextBox1
Worksheets("Namen").Activate
i = 1
z = 1
Do While Not Worksheets("Namen").Cells(i, 1) = ""
If Worksheets("Namen").Cells(i, 1) = bla Then
    Cells(z, 1) = Worksheets("Namen").Cells(i, 1)
    z = z + 1
End If
i = i + 1
Loop
End Sub
```
damit klappen.

Oder willst du auch ne entsprechungssuche?


----------



## ozak (6. April 2006)

Ich versuch es mal mit dem Quelltext
was ist den eine Entsprechungssuche ?

Sorry für meine Dummheit wie gesagt bin ein n4p


----------



## ozak (6. April 2006)

Funktioniert nicht.
worksheets("Namen") <--- ist doch die tabelle mit den Datensätzen 
und Dim bla <--- steht doch für die Variable die in der Textbox eingegeben wird

Also von Tabelle Start soll er die Daten aus der Tabelle Kunden.


----------



## Nirraven (6. April 2006)

> worksheets("Namen") <--- ist doch die tabelle mit den Datensätzen



äh, der Name is laut der Aussage



			
				ozak hat gesagt.:
			
		

> ... dann soll er in die Tabelle "Namen" Springen den oder die entsprechenden Namen raussuchen nach denen ich suchen möchte und  auf der Tabelle "Start" in einer oder mehreren Zeilen ausgeben...



deiner Phantasie entsprungen


Und "Dim bla" ist eine Variablendefinition um den inhalt der Textbox in eine variable (bla) zu speichern

btw. 





> Funktioniert nicht.


 ist eine hammer aussage.

Er Markiert eine Zeile gelb die nicht klappt, gibt eine Fehlermeldung und einen Fehlercode aus.
Das wäre u.U. hilfreich.


----------



## ozak (6. April 2006)

Das mit dem Worksheet und der deklaration ist mir jetzt auch klar

die Fehlermeldung

Fehler beim kompilieren
Sprungmarke nicht definiert


----------



## Nirraven (6. April 2006)

hm... Ok, also zu den Rahmenbedingungen die ich hatte... der Fehler ist wohl da zu suchen.

In der Excel Tabelle "Start" hatte ich eine Textbox mit dem Namen TextBox1

Und einen Button mit Namen CommandButton1

Die Prozedur ist in der Tabelle "Start" selber hinterlegt.

Wie sieht es bei dir aus?


----------



## ozak (7. April 2006)

Genauso commandbutton_click und textbox1_change sind in der Start tabelle.
Dann habe ich die Tabelle Kunden wo die ganzen kunden hinterlegt sind.

Also ich habe das jetzt so abgeändert:

Private Sub CommandButton1_Click()
Dim Kunden
Dim i
Dim z
Kunden = TextBox1_Change
Worksheets("Start").Activate
i = 1
z = 1
Do While Not Worksheets("Start").Cells(i, 1) = ""
If Worksheets("Start").Cells(i, 1) = Kunden Then
    Cells(z, 1) = Worksheets("Start").Cells(i, 1)
    z = z + 1
End If
i = i + 1
Loop
End Sub
Private Sub TextBox1_Change()
End Sub

Mittlerweile erscheint die Fehlermeldung:
Function oder Variable erwartet: und bezieht sich auf die Zeilen 1 und 5 vom quelltext


----------



## Nirraven (7. April 2006)

Hm... mist, musste rechner neu starten, während ich am antwort tippern war. Also:

"TextBox1_Change"?
_Change ist ein Ereignis was beim ändern des Textbox1 Inhalts eintritt, das gehört aber nicht zum Namen.
oder hast du die umbenannt?

Und um nochmal deine Situation zu klären, du hast die Tabelle Kunden (In der gesucht werden soll)
Und die Tabelle "Start" in die das ergebnis geschrieben werden soll, richtig?

Ich hab mal ne Datei angehängt, dann kannst es dir anschauen


----------



## ozak (12. April 2006)

Genau in der Tabelle Kunden soll gesucht werden, ind der Tabelle Start ist die Textbox und der Button zusätzlich soll das ergebnis in der tabelle start ausgegeben werden, egal wie. Mein Problem ist das ich die Datei garnet erstellt habe soll aber diese suchfunktion integrieren. Da sind noch zwei Module ist das wichtig.

das mit dem change hab ich weggemacht.

Die Suchfunktion von dir ist genau das was ich brauche nur halt für 22 Spalten (ausgabe ist 22 spaltig). Aber das ist ja egal denk ich.


Hey der macht mittlerweile nen sprung auf die tabelle Kunden es fehlt nur noch die ausgabe in der tabelle Start.


----------



## Nirraven (12. April 2006)

Das is ja recht einfach, dann Definiert man noch z.B. x as Integer und ändert


```
Cells(z, 1) = Worksheets("Start").Cells(i, 1)
```

in


```
For x = 1 to 22
Cells(z, x) = Worksheets("Start").Cells(i, x)
Next x
```


----------



## ozak (12. April 2006)

Es findet leider immer noch keine ausgabe statt 
So sieht mein Code aus bis jetzt


```
Private Sub CommandButton1_Click()
Dim Name
Dim i
Dim z
Dim x As Integer
Name = TextBox1
Worksheets("Kunden").Activate
i = 1
z = 1
Do While Not Worksheets("Kunden").Cells(i, 1) = ""
If Worksheets("Kunden").Cells(i, 1) = Name Then
    For x = 1 To 22
    Cells(z, x) = Worksheets("Kunden").Cells(i, x)
    Next x
    z = z + 1
End If
i = i + 1
Loop
Worksheets("Start").Activate
End Sub
```
Wenn ich den button betätige dann jumpt der nur kurz rüber und ist wieder in der tabelle start.


----------



## Nirraven (12. April 2006)

Ich nehme an, dass es noch ein Problem mit

```
Do While Not Worksheets("Kunden").Cells(i, 1) = ""
```
 gibt

Er fängt bei Zeile 1 an und geht weiter runter, sobald Zelle Ax leer ist, bricht er ab.
Also wenn die Tabelle etwa so aussieht

1 Überschrift
2 
3 Name1
4 Name2


Bricht er ab, bevor alles begonnen hat.


----------



## ozak (12. April 2006)

Also Tabelle sieht so aus

Überschrift Überschrift Überschrift ......
Name        Name        Name        ......                   
..
..
..
..
..


----------



## Nirraven (12. April 2006)

Ah, Spalten und nicht zeilen...

dann versuchs mal so


```
Private Sub CommandButton1_Click()
Dim Name
Dim i
Dim z
Dim x As Integer
Name = TextBox1
Worksheets("Kunden").Activate
i = 1
z = 1
Do While Not Worksheets("Kunden").Cells(2, i) = ""
If Worksheets("Kunden").Cells(2, i) = Name Then
    For x = 2 To 23
    Cells(x, z) = Worksheets("Kunden").Cells(x, i)
    Next x
    z = z + 1
End If
i = i + 1
Loop
Worksheets("Start").Activate
End Sub
```


----------



## ozak (12. April 2006)

Ich hab die datei mal leicht verändert hoch geladen kannste mal reingucken.


----------



## Nirraven (12. April 2006)

Nun wird einiges klar.
Also, zu allererst schmeiß mal das weiße rechteck raus, und stell lieber die Zellenfüllfarbe auf weiß ein.

Und dann ersetz mal deinen code durch


```
Private Sub CommandButton1_Click()
Dim Name
Dim i
Dim z
Dim x As Integer
Name = TextBox1
Worksheets("Kunden").Activate
i = 7
z = 1
Do While Not Worksheets("Kunden").Cells(i, 1) = ""
If Worksheets("Kunden").Cells(i, 1) = Name Then
    For x = 1 To 22
    Cells(z, x) = Worksheets("Kunden").Cells(i, x)
    Next x
    z = z + 1
End If
i = i + 1
Loop
Worksheets("Start").Activate
End Sub
```

i = 7, weil es bei deiner Tabelle ja erst bei Zeile 7 los geht.


----------



## ozak (13. April 2006)

Hi es funktioniert.
Gibt es eine Möglichkeit das irgendwie in geordneter weise auszugeben.

gibt es eine befehl das die Zeilen 4,5,6 immer mitausgegeben werden damit mein ich die überschriften der tabelle kunden


----------



## ozak (18. April 2006)

kannst du mir noch bei einer sache helfen: 

1. Wäre toll wenn das Suchwort halt durch so ne sternchentaste gehen würde. Damit man nicht unbedingt genau den Namen haben muss. Habe einen Operator gefunden "Like" kann den aber nicht einbinden so das es 

2. In der Tabelle Kunden sind ja die Spalten überschriften wäre cool wenn die immer mit ausgegeben werden.

MFG


----------



## Nirraven (24. April 2006)

Wie die Zellen kopiert werden weißt du ja nu, sollte also nicht schwer sein, die Zellen davor mit den Überschriften auch zu übernehmen.

Und Like ist in der Hilfe wunderbar erklärt.


```
If Worksheets("Kunden").Cells(i, 1) Like Name = True Then
```


----------



## ozak (25. April 2006)

Danke für deine Hilfe die Suchfunktion ist super geworden.

kennst du eine funktion womit ich die ausgabe auf eine extra tabelle übergeben kann, so das sich beim klick auf den button eine neue tabelle öffnet und die suchergebnisse ausgibt.
Reicht wenn du mir die funktion nur nennst.

Ich sage danke gracias thx und tschöööö


----------



## Nirraven (25. April 2006)

Am besten ist es wohl mit Sheets.add, und später (z.b. beim verlassen der Tabelle) sheets.delete


----------



## ozak (26. April 2006)

ich krieg das doch nicht hin nirraven  
kannst du mir sagen wo ich das hinsetzen muss. kennst den code ja noch oder 

wie du sehen kannst habe ich das mit like und ucase so hinbekommen das er groß und kleinschreibung nicht beachtet und jeden buchstaben halt einzeln sucht.
Das mit der neuen Tabelle geht halt net

```
Private Sub CommandButton1_Click()
Dim Name
Dim i
Dim z
Dim x As Integer
Name = TextBox1
Worksheets("Kunden").Activate
i = 7
z = 1
Do While Not Worksheets("Kunden").Cells(i, 1) = ""
If UCase(Worksheets("Kunden").Cells(i, 1)) Like "*" + UCase(Name) + "*" Then
    For x = 1 To 22
    Cells(z, x) = Worksheets("Kunden").Cells(i, x)
    Next x
    z = z + 1
    End If
i = i + 1
Loop
Worksheets("Start").Activate
End Sub
```


----------



## Nirraven (26. April 2006)

ozak hat gesagt.:
			
		

> ich krieg das doch nicht hin nirraven
> kannst du mir sagen wo ich das hinsetzen muss. kennst den code ja noch oder
> 
> wie du sehen kannst habe ich das mit like und ucase so hinbekommen das er groß und kleinschreibung nicht beachtet und jeden buchstaben halt einzeln sucht.
> ...



Und beim Schließen der Suchergebnis Tabelle würd ich se dann wieder Löschen, damit du se für eine neue suche neu anlegen kannst.


----------



## ozak (26. April 2006)

Es kommt eine Fehlermeldung: 

Laufzeitfehler 9
Index außerhalb des gültigen Bereichs

Habe das so eingefügt


```
Private Sub CommandButton1_Click()
Dim Name
Dim i
Dim z
Dim x As Integer
Name = TextBox1
Worksheets("Kunden").Activate
i = 7
z = 1
Do While Not Worksheets("Kunden").Cells(i, 1) = ""
If UCase(Worksheets("Kunden").Cells(i, 1)) Like "*" + UCase(Name) + "*" Then
    For x = 1 To 22
    Worksheets("Suchergebnis").Cells(z, x) = Worksheets("Kunden").Cells(i, x)
    Next x
    z = z + 1
End If
i = i + 1
Loop
Worksheets("Suchergebnis").Activate
End Sub
```


----------



## Nirraven (26. April 2006)

Und wo steht dein sheets.add in dem code?

Außerdem musst du, um auf die Tabelle "Suchergebnis" zuzugreifen, die neu angelegte Tabelle auch erst "Suchergebnis" nennen


----------



## ozak (2. Mai 2006)

Hab ich doch habs nur falsch reinkopiert sorry.
Die Fehlermeldung lautet:
Anwendungs- und objektdefinierter Fehler

Hier nochmal 

```
Private Sub CommandButton1_Click()
Dim Name
Dim i
Dim z
Dim x As Integer
Name = TextBox1
Worksheets("Kunden").Activate
i = 7
z = 1
Do While Not Worksheets("Kunden").Cells(i, 1) = ""
If UCase(Worksheets("Kunden").Cells(i, 1)) Like "*" + UCase(Name) + "*" Then
    For x = 1 To 22
    Sheets.Add ([Before])
    Worksheets("Suchergebnis").Cells(z, x) = Worksheets("Kunden").Cells(i, x)
    Next x
    z = z + 1
End If
i = i + 1
Loop
[COLOR="Red"]Worksheets("Suchergebnis").Activate
End Sub
```


----------



## Nirraven (2. Mai 2006)

```
Sheets.Add ([Before])
Worksheets("Suchergebnis").Cells(z, x) = Worksheets("Kunden").Cells(i, x)
```

Bei sheets.add bekommst du einen Fehler, weil er automatisch davor einfügt
Will sagen, da der Code aus der ersten Tabelle ausgeführt wird, kannst du das before weg lassen.

Nebenbei gesagt wäre die Benutzung von before

```
Sheets.Add Before
```
so korrekt

So, zur Zeile 2
Welche Tabelle ist Suchergebnis? die Tabelle die erzeugt wird heißt "TabelleXY" sofern du diese nicht umbenennst, kannst du auch nicht in eine Tabelle "Suchergebnis" einfügen.


----------



## ozak (2. Mai 2006)

Die Tabelle Suchergebnis ist die, die erzeugt werden soll.
Habe gedacht das diese direkt so bennant wird wenn cih das so eingliedere in den code. 

wenn ich alles wieder umbennene in Kunden anstatt Suchergebnis dann erzeugt der mir 20 tabellen oder so.


----------



## Nirraven (2. Mai 2006)

Also, erstmal, mit before hab ich einen Fehler gemacht 


```
Private Sub CommandButton1_Click()
Dim Name
Dim i
Dim z
Dim x As Integer
Name = TextBox1
Worksheets("Kunden").Activate
i = 7
z = 1
Do While Not Worksheets("Kunden").Cells(i, 1) = ""
If UCase(Worksheets("Kunden").Cells(i, 1)) Like "*" + UCase(Name) + "*" Then
    For x = 1 To 22
    Sheets.Add Before:=Sheets("test")
    Sheets(1).Name = "Suchergebnis"
    Worksheets("Suchergebnis").Cells(z, x) = Worksheets("Kunden").Cells(i, x)
    Next x
    z = z + 1
End If
i = i + 1
Loop
Worksheets("Suchergebnis").Activate
End Sub
Sub test()

End Sub
```

So wird die Tabelle vor der aktiven eingefügt(Sollte ja "Start" sein, also Tabelle 1, wenn nicht, bitte index anpassen), dann umbenannt in "Suchergebnis".


```
Private Sub Worksheet_Activate()
  Application.DisplayAlerts = False
  Sheets("Suchergebnis").Delete
  Application.DisplayAlerts = True
End Sub
```

Hier wird, wenn Start aktiviert wird(also auch in "Start" einfügen) "Suchergebnis" gelöscht, undzwar ohne Nachfrage.

Wenn Start nicht die erste Tabelle in der Liste ist, unbedingt die Indexe anpassen, sonst löscht er dir andere tabellen.


----------

