Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1332to1336
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

Suchfunktion via VBA

Suchfunktion via VBA
24.10.2013 11:03:47
Tim
Guten Tag
Ich habe folgenden Code:
Sub Suchen_und_anzeigen()
Dim Meldung         As Byte, Pos        As Byte
Dim Schleife        As Byte, y          As Byte
Dim Begriff, Suchen()                   As Variant
Dim Bereich                             As Range
Dim n%, x%, xZelle%, yZelle%
Dim xTabelle$(), Adresse$(), Text$
' Suchbegriff eingeben
Begriff = InputBox _
("Bitte den zu suchenden Wert eingeben. Sollen 2 Werte" & vbCrLf & _
"gleichzeitig gesucht werden, dann mit Zeichen  +  " & vbCrLf & _
"voneinander trennen (z.B.: Summe+die)." & vbCrLf & vbCrLf & _
"ENTER ohne Wert = Abbruch", "S U C H M O D U S")
If Begriff = "" Then Exit Sub
Pos = InStr(Begriff, "+")
If Pos Then
ReDim Suchen(2)
Suchen(1) = Left(Begriff, Pos - 1)
Suchen(2) = Right(Begriff, Len(Begriff) - Pos)
Schleife = 2
Else
ReDim Suchen(1)
Suchen(1) = Begriff
Schleife = 1
End If
Application.ScreenUpdating = False
' Eigentlicher Suchvorgang (in allen Tabellenblättern)
x = 1
For y = 1 To Schleife
For n = 1 To Sheets.Count
' Letzte Zelle des Bereiches ermitteln. Diese Zelle wird als Startzelle für
' die Suche deffiniert, da Suche nach dieser Zelle, also in erster Zelle
' des Bereiches beginnt.
'Bereich festlegen
Set Bereich = Worksheets(n).UsedRange
With Worksheets(n).Range(Bereich.Address)
xZelle = .Columns(.Columns.Count).Column
yZelle = .Rows(.Rows.Count).Row
End With
With Sheets(n).Range(Bereich.Address)
Set c = .Find(Suchen(y), after:=Cells(yZelle, xZelle), LookIn:=xlValues)
If Not c Is Nothing Then
ErsteAdresse = c.Address
Do
ReDim Preserve Adresse(x): ReDim Preserve xTabelle(x)
xTabelle(x) = Sheets(n).Name
Adresse(x) = c.Address(RowAbsolute:=False, ColumnAbsolute:=False)
Set c = .FindNext(c)
x = x + 1
Loop While Not c Is Nothing And c.Address  ErsteAdresse
End If
End With
Next n
Next y
Application.ScreenUpdating = True
' Die Anzahl der gefundenen Werte ist (x - 1), wenn keiner
' gefunden wurde dann ist x = 1
Select Case x
Case 1
Meldung = MsgBox("Es wurde kein übereinstimmender Wert gefunden", _
vbOKOnly, "G E F U N D E N E   W E R T E")
Exit Sub
Case Else
Meldung = MsgBox("Es wurden " & (x - 1) & " Übereinstimmungen gefunden.", _
vbOKOnly, "G E F U N D E N E   W E R T E")
'Tabelle einfügen
Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
On Error Resume Next
With ActiveSheet
.Name = "Suchergebnis"
.[A1] = "Tabelle"
.[B1] = "Zelle"
For n = 1 To x - 1
.Cells(n + 1, 1) = xTabelle(n)
.Cells(n + 1, 2) = Adresse(n)
Next n
End With
End Select
End Sub
-----------------------------------------------------------------------
Dieser Code macht folgendes: Wenn ich ein Button drücke, öffnet es ein Fenster; Dort kann ich meine Suchwörter bzw. mehrere Zahlen gleichzeitig eingeben; dann sucht es diese und listet die Treffer in einem seperatem Tabellenblatt, welches neu erstellt wird durch den programmierten Code, auf.
Jedoch möchte ich diese gerne folgendermassen anpassen:
Gemäss meiner Datei: https://www.herber.de/bbs/user/87746.xls
Wenn ich auf das Feld Suchen drücke, möchte ich im Tabellenblatt "Import" Kto.Nr (Spalte A) mehrere Zahlen markieren und nicht eingeben, diese Zahlen sollen gesucht werden in allen Tabellenblätter ausser auf deren Tabllenblatt, auf dieser ich mich aktuell befinde (Tabellenblatt Import). Jedoch soll diese Suche in allen Arbeitspapieren nur auf der Spalte A geschehen. Dies bedeutet, es soll nur auf der Spalte A bei allen Blättern gesucht werden. Soweit ich weiss gibt es für jede Zahl nur einen Treffer. Die Treffer sollen bei F11 & H11 (Tabellenblatt Import) schön untereinander angezeigt werden mit den Namen von Tabellenblatt und mit der Zeile.
Es darf kein zusätzliches Blatt erstellt werden.
Beispiel
Wenn ich die Zahl 1000 (Spalte A, Zeile 5)suche, soll der Treffer auch auf Zeile 5 gezeigt werden, jedoch ein paar Spalten weiter (siehe Download link).
Ich Danke allen die mir eine Antwort schreiben und verbleibe mit freundlichen Grüssen
Tim

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suchfunktion via VBA
24.10.2013 15:49:05
Beverly
Hi Tim,
benutze ein UserForm mit einem RefEdit-Steuerelement - damit kannst du den Zellbereich im Tabellenblatt markieren.
https://www.herber.de/bbs/user/87793.xls


AW: Suchfunktion via VBA
24.10.2013 16:00:14
fcs
Hallo Tim,
ier dein Makro angepasst an deine Wunschliste.
mfg
Franz
Sub Suchen_und_anzeigen()
Dim Meldung As Long
Dim Schleife As Byte, y As Byte
Dim Suchen() As Variant, SuchenZeile() As Long
Dim Bereich As Range
Dim n%, x%, yZelle&
Dim wksImport As Worksheet
Set wksImport = ActiveWorkbook.Worksheets("Import")
If ActiveSheet.Name  wksImport.Name Then
MsgBox "Makro""Suchen_und_anzeigen"" darf nur gestartet " _
& "werden wenn Blatt ""Import"" das aktive Blatt ist!"
Exit Sub
End If
'gesuchte Kontonummern aus Selektion einlesen und Inhalte in Ergebniszellen löschen
Schleife = 0
Application.ScreenUpdating = False
For Each Bereich In Selection.Cells
If Bereich.Column = 1 Then
Schleife = Schleife + 1
ReDim Preserve Suchen(1 To Schleife)
ReDim Preserve SuchenZeile(1 To Schleife)
Suchen(Schleife) = Bereich.Value
SuchenZeile(Schleife) = Bereich.Row
With wksImport.Cells(Bereich.Row, 6)
.ClearContents
.Offset(0, 2).ClearContents
End With
End If
Next
If Schleife = 0 Then
MsgBox "Es wurden keine Werte in Spalte A selektiert!"
Exit Sub
End If
' Eigentlicher Suchvorgang (in allen Tabellenblättern ausßer "Import")
x = 1
For y = 1 To Schleife
For n = 1 To Sheets.Count
If Sheets(n).Name  wksImport.Name Then
'Suchbereich festlegen
Set Bereich = Worksheets(n).Columns(1)
With Bereich
Set c = .Find(Suchen(y), after:=Sheets(n).Cells(Sheets(n).Rows.Count, 1), _
LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
ErsteAdresse = c.Address
Do
With wksImport.Cells(SuchenZeile(y), 6)
If .Value = "" Then
.Value = Sheets(n).Name
.Offset(0, 2).Value = c.Row
Else
Application.ScreenUpdating = True
MsgBox "zu Konto """ & Suchen(y) _
& """ gibt es eine weitere Fundstelle in:" & vbLf _
& Sheets(n).Name & ", Zeile " & c.Row
Application.ScreenUpdating = False
End If
End With
Set c = .FindNext(c)
x = x + 1
Loop While Not c Is Nothing And c.Address  ErsteAdresse
End If
End With
End If
Next n
Next y
Application.ScreenUpdating = True
' Die Anzahl der gefundenen Werte ist (x - 1), wenn keiner
' gefunden wurde dann ist x = 1
Select Case x
Case 1
Meldung = MsgBox("Es wurde kein übereinstimmender Wert gefunden", _
vbOKOnly, "G E F U N D E N E   W E R T E")
Exit Sub
Case Else
Meldung = MsgBox("Es wurden " & (x - 1) & " Übereinstimmungen gefunden.", _
vbOKOnly, "G E F U N D E N E   W E R T E")
End Select
Erase Suchen, SuchenZeile
End Sub

Anzeige
AW: Suchfunktion via VBA
24.10.2013 16:38:53
Tim
Vielen Danke!!!
Beide Varianten sind super. Ich habe mich für Franz's Variante entschieden
Danke und Gruss
Tim

AW: Suchfunktion via VBA
24.10.2013 16:50:33
Tim
Nur noch etwas kleines.
Würde es jetzt auch gehen, wenn man ohne die Zahlen bzw. Konto-Nr. zu markieren auf Suchen klickt dass es automatisch erscheint? Mein Chef will es ohne das Feld zu markieren. Sry!
Mier ist auch aufgefallen, wenn man eine leere Zeile markiert, dass dann ca. 1000 Fenster mit Fehlermeldung aufgehen. Kann man eine Wenn Formel einbauen, wenn die Zeile Leer ist, dass nicht gesucht wird?
Vielen Dank für Eure Antworten.
Gruss Tim

Anzeige
AW: Suchfunktion via VBA
24.10.2013 17:34:37
Beverly
Hi Tim,
in meinem Beispiel ist nur das Start-Makro anzupassen:
Sub start()
UserForm1.RefEdit1.Text = Selection.Parent.Name & "!" & Selection.Address
UserForm1.Show
End Sub
Die Verwendung eines UserForms mit RefEdit-Steuerelement hat den Vorteil, dass man den ausgewählten Bereich "zur Laufzeit" noch ändern kann, indem einfach ein neuer Bereich markiert wird, ohne dass das UserForm geschlossen werden muss.


Anzeige
AW: Suchfunktion via VBA
25.10.2013 06:39:57
fcs
Hallo Tim,
passe den folgenden Abschnitt des Makros an:
     'gesuchte Kontonummern aus Selektion einlesen und Inhalte in Ergebniszellen löschen
Schleife = 0
Application.ScreenUpdating = False
With wksImport
For Each Bereich In .Range(.Cells(12, 1), .Cells(.Rows.Count, 1).End(xlUp)).Cells
'Prüfen, ob Zelle leer
If Bereich  "" Then
'prüfen, ob Zellinhalt nummerisch
If IsNumeric(Bereich.Value) Then
Schleife = Schleife + 1
ReDim Preserve Suchen(1 To Schleife)
ReDim Preserve SuchenZeile(1 To Schleife)
Suchen(Schleife) = Bereich.Value
SuchenZeile(Schleife) = Bereich.Row
With wksImport.Cells(Bereich.Row, 6)
.ClearContents
.Offset(0, 2).ClearContents
End With
End If
End If
Next
End With

Dann werden ab Zeile 12 in Spalte A alle Zellen bearbeitet. Leere Zellen und Zellen mit Text werden übersprungen.
mfg
Franz
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige