Suchfunktion über mehrere int. Tabellen + automatisches sortieren nach Eingabe
#1
Hallo Ihr Lieben,
 
ich komme mit meiner VBA nicht weiter, vielleicht hat jemand von auch eine Lösung…
Ziel:
a)    automatisches sortieren nach Eingabe auf alle einzelnen intelligenten Tabellen auf Blatt „Kunden“
b)    benutzerfreundliche Suchfunktion über alle intelligenten Tabellen auf Blatt „Kunden“ - soll also alle 4 intelligenten Tabellen durchsuchen, nicht nur „Angebote“
c)    benutzerfreundliche Suchfunktion über alle intelligenten Tabellen auf Blatt „BSM“ – soll auch hier die beiden intelligenten Tabellen durchsuchen
 
Das Problem:
Wenn ich versuche die einzelnen Codes einzusetzen, kommt dann leider der Fehler beim Kompilieren mit Anmerkung „mehrdeutiger Name“.
 
Hier der Code, den ich zusammengestellt habe (ist aber auch in der Test-Tabelle). Funktioniert nur einzeln bzw. die Suchfunktion nur in einer intelligenten Tabelle (Angebote).
 
Code:
Option Explicit
 
Private Sub TextBox1_Change()
 
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
 
If Not Intersect(Target, Range("Suchkriterium1")) Is Nothing Then Call Suche
 
End Sub
 
Option Explicit
 
 
 
Private Sub Worksheet_Change(ByVal Target As Range)
 
'Prüfen, ob Name_ANGEBOT verändert wurde
If Not Intersect(Target, Range("Angebote[Name_ANGEBOT]")) Is Nothing Then
 
'Variable dimensionieren
Dim Name_ANGEBOT As String
 
'Name_ANGEBOT merken
Name_ANGEBOT = Target.Value
 
'Sortieren
Range("Angebote").Sort Key1:=Range("Angebote[Name_ANGEBOT]"), Order1:=xlAscending, Header:=xlYes
 
'Bestand suchen
Range("F:F").Find(What:=Name_ANGEBOT).Activate
 
End If
 
End Sub

 
Liebe Grüße und schon mal vielen, vielen Dank  Blush

Annika


Angehängte Dateien
.xlsm   Teyt VBA.xlsm (Größe: 28,07 KB / Downloads: 3)
Antworten Top
#2
Hallo Annika,

mehrere Sachen:

Option Explicit gehört in die 1. Zeile eines Moduls und ist einmalig im jeweiligen Modul einzutragen.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
gehört ins Modul des jeweiligen Tabellenblattes.

Das Sortieren soll wie in welcher Spalte der jeweiligen Tabelle stattfinden?

Wie soll die Suchfunktion arbeiten (auf vollständige Begriffe oder Teilstring).
Soll das Suchergebnis gefiltert in den Listobjekten ausgegeben werden.
Wenn ja müssen die Listobjekte untereinander.


Da ist einiges an Aufklärung deinerseits erforderlich.

Gruß Uwe
Antworten Top
#3
Hallo,

vor allem solltest du deine Dateistruktur überdenken / -arbeiten.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#4
@Egon12  vielen dank, lieber Egon12.
Sorry, na klar muss ich das ansagen, in welcher Spalte der jeweiligen Tabelle stattfinden soll  30

Es sollen auf Blatt "Kunden" die Namen sortiert werden - Name, Name_ANGEBOT, Ansprechpartner, und wieder Name (dieser zweite muss halt unbenannt werden in z. B. Name_2)
und auf Blatt "Tabelle2" ebenfalls je der "Name" - dort dann auch ggf. Name_3 & Name_4

Wie soll die Suchfunktion soll nach Teilstring arbeiten, ich dachte, dass ich das im Code schon so hinbekommen hatte. Ich habe einen Filtercode mit Vermerk 
Zitat:Value = "*" & Range("Suchkriterium2").Value & "*"


Hier der ganze Code - ausgeweitet auf G8, da ich hoffte, dass so 2 Tabellen mit einbezogen werden... hat aber nicht geklappt.

Code:
Sub Suche()

'Werte für Filter eintragen
Tabelle_Filter.Range("A2, B3, C4, D5, E6, F7, G8").Value = "*" & Range("Suchkriterium2").Value & "*"

'Erweiterten Filter anwenden
Range("Angebote[#All]").AdvancedFilter xlFilterInPlace, Tabelle_Filter.Range("A1:G8")

End Sub

und das Suchergebnis soll dann gefiltert in den jeweiligen einzelnen Tabellen angezeigt ausgegeben werden.
Muss ja nicht in den gleichen Zeilen angeführt werden, sondern kann ja auf verschiedene Zeilenebenen sein, so dass dann in den anderen Tabellen dort freie Zellen zu sehen sind - als Beispiel.

Danke schon mal, für die Mühe  Heart
Antworten Top
#5
Hallo Annika,
 
Filtern im Listobjekt bedeutet, dass Zeilen ohne Treffer ausgeblendet werden.
 
Damit sind wir bei Thema Tabellenstruktur(en) angekommen.
 
Da du offensichtlich mit mehreren Listobjekten arbeiten willst, wirst du diese untereinander anordnen müssen. Zeilen, die keinen Treffer enthalten, werden ausgeblendet.
Nebeneinander die Listobjekte anlegen und dann getrennt filtern kann so nicht funktionieren.
 
Einzige Möglichkeit ohne Zeilenausblenden dies so wie vorgegeben zu bewerkstelligen (Listojekte nebeneinander), ist den Urzustand jedes Listobjekts in ein Array zu packen aus dem Array heraus in ein temporäres Array zu filtern und dieses Filterergebnis in die Listobjekte zu übergeben. Da muss man aber vor dem Speichern der Datei den Urzustand wieder aus den Arrays in die Listobjekte zurückschreiben.
Dies ist mit dem Risiko verbunden, dass wenn man nicht aufmerksam ist versehentlich den Filterzustand speichert und die Datei schließt dann damit der ursprüngliche Datenbestand nicht mehr vorhanden ist.
Das ist so nicht zu empfehlen.
 
Gruß Uwe
Antworten Top
#6
Hallöchen Uwe,
leider kann ich die verschiedenen Tabellen nicht untereinander legen.
Dann ist es so und dann geht es halt nicht - dann muss ich die Suchfunktion nur für eine einzelne Tabelle nutzen und der Rest hat halt Pech. - Schade.

Eine Idee wäre vielleicht noch über jede einzelne int. Tabelle ein Suchfeld für diesen Bereich anzulegen - also, dass es nur in der jeweiligen Tb gesucht wird. Aber das wird dann wohl auch nicht gehen.
Antworten Top
#7
Hallo Annika,
 
ich habe es mal auf das Machbare zusammengestellt. Teste mal.

.xlsm   Teyt VBA(1).xlsm (Größe: 44,13 KB / Downloads: 4)  
 
Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Egon12 für diesen Beitrag:
  • MIPOLI
Antworten Top
#8
Das ist ja eine geniale Idee von dir lieber Uwe.
Einfach eine Auswahl - da muss man erst mal drauf kommen.
Klasse. Ich bin wirklich platt. Besser als ich mir es hätte vorstellen hab können. DANKE.

Nun habe ich den Sortierungscode versucht mit einzuführen:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

'Prüfen, ob eine Zelle verändert wurde
If Target.Count > 1 Then Exit Sub

'Prüfen, ob Bestand verändert wurde
If Not Intersect(Target, Range("Angebote[Name_ANGEBOT]")) Is Nothing Then

    'Variable dimensionieren
    Dim Bestand As String

    'Bestand merken
    Bestand = Target.Value

    'Sortieren
    Range("Angebote").Sort Key1:=Range("Angebote[Name_ANGEBOT]"), Order1:=xlAscending, Header:=xlYes, _
    Key2:=Range("Angebote[Produkt-ID]")

    'Bestand suchen
    Range("F:F").Find(What:=Name_ANGEBOT).Activate

End If

End Sub
Das funktioniert aber leider noch nicht automatisch. Ich muss immer erst den Code manuell in der VBA-Oberfläche auslösen und dass ist ja nicht im Sinne des Erfinders.

Aber, ich kann auch das Datenblatt nicht auf "Change" bzw. worksheet umstellen. Bestimmt liegt es daran, den der Code würde ja funktionieren... 

Hast du da noch einen Tipp, wie ich das einfügen könnte?
Antworten Top
#9
Der soll funktionieren??
 
Es sind mehrere Fehler drin.
 
Das soll doch nur Sortieren, wenn in der Spalte "Name_ANGEBOT" des Listobjekts "Angebote" eine der Zellen geändert wurde?
Die Methode .Find kann kein Objekt suchen  sondern nur Zellinhalte (Zahlen, Text).
 
Gruß Uwe
Antworten Top
#10
Naja,
als ich den Code hab laufen lassen, hat er den Namen an der richtigen Stelle eingesetzt. weiß auch nicht warum Huh

Das Ziel sollte eigentlich sein, wenn ich unten in der Spalte Name_Angebot einen neuen Namen einfüge, dass er dann alphabetisch automatisch an der richtigen Stelle einsortiert wird (nach Eingabe Enter)
Antworten Top


Gehe zu:


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