Komplexere Suchfunktion in Excel
Hallo Zusammen!
Also,...
Bei mir ist es ähnlich wie bei anderen...
Ich habe 10 Tabellen ca. und in 9 davon sind Artikelnummern + Info etc...
Auf dem ersten Tabellenblatt möchte ich eine Suchefunktion ein baun...
Hab bis jetzt es soweit hin bekommen das ich in der ersten Spalte die Artikelnummer angebe und dieser Artikel dann in den nachfolgenden Tabellen herausgesucht wird...
Aber,... die Suchfunktion spinnt noch bissal...
Die Funktion funktioniert nicht wenn ich nur einen Artikel eingebe...
Bei mehr als einem geht es,....
Der Code wo der fehler liegen muss sieht so aus:
Sub Suchen_Item2()
Dim Suche3, letzte, Suche As Variant
Dim Suche2 As Variant
Dim i, Row, j As Integer
Dim a, s1, s2, s3 As String
Dim b As String
Dim c As String
Dim d As String
Dim wks As Worksheet
Dim e As String
Row = 5
Sheets("Tabelle1").Activate
Range("A2").End(xlDown).Offset(1, 0).Select
letzte = ActiveCell.Row - 1
For i = 1 To letzte
Suche = Suche & Cells(i, 1).Value & " "
Next
Range("B6:G65536").Value = ""
Suche2 = Split(Suche)
nachfolgend kommen nur die Such der Tabellenblätter!
Ich hoffe ihr versteht ungefair was ich meine
MFG und danke im vorraus
Thomas
Also,...
Bei mir ist es ähnlich wie bei anderen...
Ich habe 10 Tabellen ca. und in 9 davon sind Artikelnummern + Info etc...
Auf dem ersten Tabellenblatt möchte ich eine Suchefunktion ein baun...
Hab bis jetzt es soweit hin bekommen das ich in der ersten Spalte die Artikelnummer angebe und dieser Artikel dann in den nachfolgenden Tabellen herausgesucht wird...
Aber,... die Suchfunktion spinnt noch bissal...
Die Funktion funktioniert nicht wenn ich nur einen Artikel eingebe...
Bei mehr als einem geht es,....
Der Code wo der fehler liegen muss sieht so aus:
Sub Suchen_Item2()
Dim Suche3, letzte, Suche As Variant
Dim Suche2 As Variant
Dim i, Row, j As Integer
Dim a, s1, s2, s3 As String
Dim b As String
Dim c As String
Dim d As String
Dim wks As Worksheet
Dim e As String
Row = 5
Sheets("Tabelle1").Activate
Range("A2").End(xlDown).Offset(1, 0).Select
letzte = ActiveCell.Row - 1
For i = 1 To letzte
Suche = Suche & Cells(i, 1).Value & " "
Next
Range("B6:G65536").Value = ""
Suche2 = Split(Suche)
nachfolgend kommen nur die Such der Tabellenblätter!
Ich hoffe ihr versteht ungefair was ich meine
MFG und danke im vorraus
Thomas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 97582
Url: https://administrator.de/contentid/97582
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo bulwai und willkommen im Forum!
In welcher Zeile steht denn Dein erster Suchbegriff? Einerseits suchst Du danach erst ab Zeile 2 (Range("A2")), andereseits beginnst Du mit dem Auslesen ("For"-Schleife) in der Zeile 1 ...
Bedingt dadurch, dass Du auch an den letzten Suchbegriff noch ein Leerzeichen anhängst, bekommst Du außerdem in Suche2 ein Element zuviel - das lässt sich durch
vermeiden.
Soferne es keinen besonderen Grund dafür gibt (den Rest Deines Codes kenne ich ja nicht), zuerst die Zelle unterhalb des letzten Suchbegriffes auszuwählen, und dann die Zeile oberhalb zu ermitteln, sollte (falls die Suchbegriffe tatsächlich erst ab A2 eingetragen sind) die folgende Version genügen:
Grüße
bastla
In welcher Zeile steht denn Dein erster Suchbegriff? Einerseits suchst Du danach erst ab Zeile 2 (Range("A2")), andereseits beginnst Du mit dem Auslesen ("For"-Schleife) in der Zeile 1 ...
Bedingt dadurch, dass Du auch an den letzten Suchbegriff noch ein Leerzeichen anhängst, bekommst Du außerdem in Suche2 ein Element zuviel - das lässt sich durch
Suche2=Split(Trim(Suche))
Soferne es keinen besonderen Grund dafür gibt (den Rest Deines Codes kenne ich ja nicht), zuerst die Zelle unterhalb des letzten Suchbegriffes auszuwählen, und dann die Zeile oberhalb zu ermitteln, sollte (falls die Suchbegriffe tatsächlich erst ab A2 eingetragen sind) die folgende Version genügen:
letzte = Range("A1").End(xlDown).Row
For i = 2 To letzte
Suche = Suche & Cells(i, 1).Value & " "
Next
Suche2 = Split(Trim(Suche))
MsgBox CStr(Ubound(Suche2) + 1) & " Suchbegriff(e) gefunden." 'nur als Demo
Range("B6:G65536").Value = ""
bastla
Hallo bulwai!
Den Suchteil habe ich (ua durch das Auslagern des Eintragens in ein eigenes Unterprogramm) ein wenig gestrafft, und wenn die Tabellenstruktur (hinsichtlich der verwendeten Spalten) durchgängig gleich ausgelegt wäre, ließe sich das Ganze noch etwas knapper fassen ...
Das Sortieren / Umkopieren im Anschluss an das Suchen und Übertragen der Daten sieht nach aufgezeichnetem Makro aus - wenn Du die Aufzeichnung (mit auf das wirklich Nötige beschränkten Arbeitsschritten) nochmals durchführst, solltest Du auch diesen Teil noch optimieren können.
Noch als Anmerkung zu den weiteren Änderungen: Das zwischenzeitliche Aktivieren der übrigen Tabellen lässt sich durch Angabe des Blattes (vereinfacht durch "With"-Blöcke) vermeiden, und unter der Annahme, dass jeder Suchbegriff nur einmal in den einzelnen Tabellen steht, sorgt das vorzeitige Verlassen der "For i"-Schleife mit "Exit For" für etwas Performance-Gewinn.
Eine alternative Schreibweise (ohne Verwendung eines Unterprogrammes) könnte (am Beispiel Suche in der ersten Tabelle) so aussehen:
Noch kürzer (da ja die Anzahl der zu übertragenden Zellen = 6) bekannt ist (aber etwas weniger übersichtlich ):
Zum Thema Variablendeklaration: Grundsätzlich ist es natürlich zu empfehlen, alle Variablen zu deklarieren und dann mit "Option Explicit" für mehr Sicherheit zu sorgen, allerdings sollte dann auch hinsichtlich der Typen bzw der tatsächlich verwendeten Variablen konsequent vorgegangen werden - so erzeugt etwa die Zeile
die Variablen "i" und "Row" als Variant, und nur "j" wird ein Integer - in VBA muss der Datentyp (anders als etwa in .NET) für jede einzelne Variable festgelegt werden, also
Du könntest die entsprechenden "Dim"-Statements für den obigen Code noch nachtragen (womit Du diesen Code dann auch gleich besser kennen lernst ).
Grüße
bastla
Den Suchteil habe ich (ua durch das Auslagern des Eintragens in ein eigenes Unterprogramm) ein wenig gestrafft, und wenn die Tabellenstruktur (hinsichtlich der verwendeten Spalten) durchgängig gleich ausgelegt wäre, ließe sich das Ganze noch etwas knapper fassen ...
Sub Suchen_Item2()
Row = 5
Sheets("Tabelle1").Activate
letzte = Range("A1").End(xlDown).Row
For i = 2 To letzte
Suche = Suche & Cells(i, 1).Value & " "
Next
Suche2 = Split(Trim(Suche))
Range("B6:G65536").Value = ""
arrcount = UBound(Suche2)
'CSC - Infrastr. Management ####################################################################
For j = 0 To arrcount
With Sheets("CSC - Infrastr. Management")
For i = 1 To 100
If .Cells(i, 12) = Suche2(j) Then
ServiceName = .Cells(i, 4).Value
ItemNR = .Cells(i, 10).Value
MaterialNR = .Cells(i, 12).Value
Delivery = .Cells(i, 13).Value
Hardware = .Cells(i, 14).Value
InformationX = .Cells(i, 15).Value
Row = Row + 1
Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX)
Exit For
End If
Next i
End With
Next j
'CSC - Service Support #########################################################################
For j = 0 To arrcount
With Sheets("CSC - Service Support")
For i = 1 To 100
If .Cells(i, 12) = Suche2(j) Then
ServiceName = .Cells(i, 4).Value
ItemNR = .Cells(i, 10).Value
MaterialNR = .Cells(i, 12).Value
Delivery = .Cells(i, 13).Value
Hardware = .Cells(i, 14).Value
InformationX = .Cells(i, 15).Value
Row = Row + 1
Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX)
Exit For
End If
Next i
End With
Next j
'CSC - Service Delivery #########################################################################
For j = 0 To arrcount
With Sheets("CSC - Service Delivery")
For i = 1 To 100
If .Cells(i, 12) = Suche2(j) Then
ServiceName = .Cells(i, 4).Value
ItemNR = .Cells(i, 10).Value
MaterialNR = .Cells(i, 12).Value
Delivery = .Cells(i, 13).Value
Hardware = .Cells(i, 14).Value
InformationX = .Cells(i, 15).Value
Row = Row + 1
Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX)
Exit For
End If
Next i
End With
Next j
'Service Packages PLUS #########################################################################
For j = 0 To arrcount
With Sheets("Service Packages PLUS")
For i = 1 To 100
If .Cells(i, 12) = Suche2(j) Then
ServiceName = .Cells(i, 4).Value
ItemNR = .Cells(i, 10).Value
MaterialNR = .Cells(i, 12).Value
Delivery = .Cells(i, 13).Value
Hardware = .Cells(i, 14).Value
InformationX = .Cells(i, 15).Value
Row = Row + 1
Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX)
Exit For
End If
Next i
End With
Next j
'Service Care Packages #########################################################################
For j = 0 To arrcount
With Sheets("Service Care Packages")
For i = 1 To 100
If .Cells(i, 11) = Suche2(j) Then
ServiceName = .Cells(i, 4).Value
ItemNR = .Cells(i, 10).Value
MaterialNR = .Cells(i, 11).Value
Delivery = .Cells(i, 12).Value
Hardware = .Cells(i, 13).Value
InformationX = .Cells(i, 14).Value
Row = Row + 1
Eintragen Row, 2, Array(MaterialNR, ItemNR, ServiceName, Delivery, Hardware, InformationX)
Exit For
End If
Next i
End With
Next j
'Sortierung etc
End Sub
Sub Eintragen(R, C, Values)
For i = 0 To UBound(Values)
Cells(R, C + i).Value = Values(i)
Next
End Sub
Noch als Anmerkung zu den weiteren Änderungen: Das zwischenzeitliche Aktivieren der übrigen Tabellen lässt sich durch Angabe des Blattes (vereinfacht durch "With"-Blöcke) vermeiden, und unter der Annahme, dass jeder Suchbegriff nur einmal in den einzelnen Tabellen steht, sorgt das vorzeitige Verlassen der "For i"-Schleife mit "Exit For" für etwas Performance-Gewinn.
Eine alternative Schreibweise (ohne Verwendung eines Unterprogrammes) könnte (am Beispiel Suche in der ersten Tabelle) so aussehen:
For j = 0 To arrcount
With Sheets("CSC - Infrastr. Management")
For i = 1 To 100
If .Cells(i, 12) = Suche2(j) Then
Row = Row + 1
Values = Array( _
.Cells(i, 10).Value, _
.Cells(i, 12).Value, _
.Cells(i, 4).Value, _
.Cells(i, 13).Value, _
.Cells(i, 14).Value, _
.Cells(i, 15).Value _
)
Sheets("Tabelle1").Cells(Row, 2).Resize(1, UBound(Values) + 1) = Values
Exit For
End If
Next i
End With
Next j
For j = 0 To arrcount
With Sheets("CSC - Infrastr. Management")
For i = 1 To 100
If .Cells(i, 12) = Suche2(j) Then
Row = Row + 1
Sheets("Tabelle1").Cells(Row, 2).Resize(1, 6) = _
Array(.Cells(i, 10), .Cells(i, 12), .Cells(i, 4), .Cells(i, 13), .Cells(i, 14), .Cells(i, 15))
Exit For
End If
Next i
End With
Next j
Dim i, Row, j As Integer
Dim i As Integer, Row As Integer, j As Integer
Grüße
bastla