Excel / VBA: Vorhandenes Sheed nach bestimmten Kriterien durchsuchen und in ein neues Sheed übertragen
Hallo Forum,
ich stehe vor folgendem Problem:
Ich habe eine gegebene Tabelle mit Informationen. Jetzt sollen im ersten Schritt zwei Spalten nach bestimmten Informationen durchsucht werden und wenn deren Inhalt dem Suchkriterium entspricht in ein neues WorkSheet kopiert werden.
Der zweite Schritt entspricht dem ersten, nur dass sich jetzt die Suchkriterien geändert haben. Wieder sollen die Ergebnisse in einem neuen Sheet aussgegeben werden.
Das ganze soll geschehen, wenn man in der Ursprungstabelle auf einen Button klickt.
Kann mir jemand dabei helfen?
Vielen Dank und viele Grüße
Mike
Antwort schreiben
Antwort 1 von fedjo vom 27.07.2021, 16:33 Options
Hallo Mike,
dazu noch ein paar Fragen:
Kommen die gesuchten Informationen öfter vor?
Soll nur das Suchkriterium der Zelle oder die ganze Zeile übertragen werden?
Gruß
fedjo
Antwort 2 von coros vom 27.07.2021, 17:06 Options
Hallo Mike,
mit ein paar Änderungen sollte die Lösung aus
diesem Beitrag Dir eventuell weiterhelfen.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 3 von Mike_2009 vom 28.07.2021, 13:02 Options
Hallo Oliver,
ja, das geht schon mal in die richtige Richtung.
Kann ich dem Skript denn auch beibringen, dass er nicht alle Spalten nach dem Suchbegriff absucht, sondern nur eine bestimmte?
Wenn ich das so laufen lasse, werden - weil die Suchwörte in mehrern Spalten vorhanden sind, aber nur eine relevant ist - zu viele Dublikate angelegt. Das macht dann eher mehr Arbeit ;-)
Kann ich es auch realisieren, dass als Suchwort eine bestimmte Kombination aus Wörtern (die aber in zwei unterschiedlichen Spalten stammen) genutzt wird?
Vielen Dank schon mal
Mike
Antwort 4 von coros vom 28.07.2021, 13:11 Options
Hallo Mike,
für die Bereichsangabe ändere in dem Makro die Zeile
With objAktSheet.Range("A1:IV65536")
Anstelle A1:IV65536 könnte dort auch, sollte es sich z.B. um Spalte B handeln "B1:B65536" stehen.
Für den Suchbegriff müsstest Du im Makro die Zeile
varSuchtext = InputBox("Bitte Scuchbegriff eintragen")
ändern. Die könnte z.B. für eine Kombination aus Zelle B1 und C1 so aussehen:
varSuchtext = Range("B1") & Range("C1")
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 5 von Mike_2009 vom 28.07.2021, 13:34 Options
Hallo Oliver,
super... das mit der Begrenzung des Suchraumes habe ich verstanden.
Es treten aber noch mehr Fragen auf.
Zum einen muss ich die Zeile
If varSuchtext = "" Or varSuchtext = False Then Exit Sub
zwingend auskommentieren, weil sonst ein
Zitat:
Run-Time Error 13: Type mismatch
erzeugt wird. Ist die Zeile weg, geht alles normal.
Dann noch die Frage nach dem Suchkriterium:
varSuchtext = Range("B1") & Range("C1")
Wenn ich in die beiden Zellen B1 und C1 etwas schreibe, wonach gesucht werden soll, dann wird das ganze mit einem
Zitat:
Fehler 400
abgebrochen.
Leider keine weiteren Erklärungen!
Ich habe aber noch eine weitere Frage:
Da die Tabelle Zeile mit Erklärungen für die ganzen Spalten enthält, würde ich diese auch gern mitkopieren.
Kann ich das hiermit:
With objAktSheet.Range("A1:AX1")
Do
objAktSheet.Rows.Copy
Gruß und schon jetzt vielen vielen Dank für die Hilfe!
Antwort 6 von coros vom 28.07.2021, 13:49 Options
HAllo Mike,
sorry, war ein Fehler bei der Deklaration der Variablen. Ändere im Makro die Zeile
Dim varSuchtext As String
in
Dim varSuchtext As Variant
Zu dem Fehler400 kann ich nicht viel sagen, da ich Deine Datei nicht kenne. Kannst Du die eventuell z.B. mal bei
http://www.fileuploadx.de/ hochladen und den Link, den Du erhälst hier mal posten, damit man sich das in Deiner Datei ansehen kann. Bei mir funktioniert das Makro ohne Probleme.
Die Frage bezüglich des Kopierens habe ich leider nicht verstanden. Was meinst Du mit
Zitat:
Erklärungen für die ganzen Spalten enthält
?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 7 von Mike_2009 vom 28.07.2021, 14:55 Options
Hallo Oliver
Zitat:
Die Frage bezüglich des Kopierens habe ich leider nicht verstanden. Was meinst Du mit
Zitat:
Erklärungen für die ganzen Spalten enthält
Ja, da lag der Fehler zwischen meinen Ohren...
Ich wollte damit sagen, dass es eine Zeile gibt, die den Kopf für die ganze Tabelle bildet. Diese soll mit kopiert werden.
Ich muss hierfür also einen Bereich definieren, welcher dann kopiert wird, oder?
Mike
Antwort 8 von coros vom 28.07.2021, 15:07 Options
Hallo Mike,
mal angenommen, die Daten, die Du noch zusätzlich kopieren möchtest stehen in Zeile 1 und sollen in dem neuen Tabellenblatt ebenfalls in Zeile erscheinen, dann müsstest Du die Zeilen
Do
objAktSheet.Rows(rngSuchbereich.Row).Copy _
objNewSheet.Cells(objNewSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1, 1)
Set rngSuchbereich = .FindNext(rngSuchbereich)
Loop While Not rngSuchbereich Is Nothing And rngSuchbereich.Address <> strAddresse
in
Do
objAktSheet.Rows(1).Copy _
objNewSheet.Cells(1, 1)
objAktSheet.Rows(rngSuchbereich.Row).Copy _
objNewSheet.Cells(objNewSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1, 1)
Set rngSuchbereich = .FindNext(rngSuchbereich)
Loop While Not rngSuchbereich Is Nothing And rngSuchbereich.Address <> strAddresse
ändern.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 9 von Mike_2009 vom 28.07.2021, 15:25 Options
Supi, funktioniert.
Habe ganz eingenmächtig mal bestimmt, dass nicht nur die erste sondern die erste bis vierte Zeile kopiert werden
With objAktSheet.Range("A1:C1000")
Set rngSuchbereich = .Find(What:=varSuchtext, LookIn:=xlValues)
If Not rngSuchbereich Is Nothing Then
strAddresse = rngSuchbereich.Address
Do
objAktSheet.Rows.Range("A1:AY4").Copy _
objNewSheet.Cells(1, 1)
objAktSheet.Rows(rngSuchbereich.Row).Copy _
objNewSheet.Cells(objNewSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1, 1)
Set rngSuchbereich = .FindNext(rngSuchbereich)
Loop While Not rngSuchbereich Is Nothing And rngSuchbereich.Address <> strAddresse
End If
End With
Dummerweise wird wieder mit diesem Fehler 400 abgebrochen.
Die ersten vier Zeilen sind aber kopiert....
Sehr suspekt!
Antwort 10 von coros vom 28.07.2021, 15:32 Options
Hallo Mike,
für den Fehler400 benötige ich, wie bereits in AW6 geschrieben die Datei.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 11 von Mike_2009 vom 28.07.2021, 15:49 Options
http://www.fileuploadx.de/84891
ist eine sehr spatanische Version der eigentlichen Datei. Muss aber aus Datenschutzgründen reichen.
Ziel soll sein, dass dieses Quellsheed bestehen bleibt, und dann weitere Sheets angelegt werden.
In denen sollen die möglichen Kombinationen aa, ab, ba, bc ausgegeben werden, alles andere wird "Sonstiges"
Gruß Mike
Antwort 12 von coros vom 28.07.2021, 18:46 Options
Hallo Mike,
das es sich um eine Dummydatei handelt ist kein Problem. Ich finde aber in der Datei kein Makro. Wie soll ich nun testen, ob bei mir ebenfalls der Fehler400 aufläuft.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 13 von Mike_2009 vom 29.07.2021, 08:51 Options
Hallo Oliver,
sorry... da hab ich gestern die falsche Datei erwischt.
Ist aber auch nicht mehr so wild, denn die Dummy-Datei funktioniert jetzt. Keine Ahnung warum.
Aber es ergeben sich immer mehr Problemchen...
Ich habe einfach nicht genug Wissen über VB um damit richtig umzugehen.
http://www.fileuploadx.de/8744
hier ist die Datei mit dem Macro, die ich dir gestern schon geben wollte.
Er arbeitet schon, aber nicht so, wie ich möchte - das liegt wohl an mir.
Ziel soll, wie schon gesagt sein, dass er alle Spalten die das Wort "alle" (im Bereich "C9:E1000") sucht, in das neue Sheet kopiert und das auch wieder unter die blaue Überschriftenzeile setzt.
Das ist ja erst mal nur der Dummy.
Vision ist, dass ich vielleicht über drei Drop-Down Menüs oder so, alle Kriterien, die in den Spalten C bis E vorkommen auswählen kann, mir so die Kombination zusammenstelle, die ich brauche und diese Filterung dann in einem neuen Sheet - im Idealfall dann mit dem Namen der Filterkriterien - ausgegeben werden!
so long...
Mike
Antwort 14 von coros vom 29.07.2021, 09:16 Options
Hallo Mike,
lade Dir unter
http://www.excelbeispiele.de/Beispiele_Supportnet/test%20-%20Copy%2... Deine Datei mit den Änderungen herunter. Wenn Du auf den Button klickst, kannst Du einen Suchbegriff eingeben. Alle gefundenen Datensätze werden einschließlich der Überschriften neuen Tabellenblatt aufgeführt.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 15 von Mike_2009 vom 29.07.2021, 09:42 Options
Hallo Oliver...
vielen Dank für deine Hilfe! Die Positionierung hat mich gerade verzweifeln lassen und mit dieser Zeile
objNewSheet.Cells(objNewSheet.Range("C65536").End(xlUp).Offset(1, 0).Row, 1)
hätte ich wohl nie gearbeitet (Unwissenheit).
Aber jetzt kann ich es mir zusammenreimen.
Die Funktionsweise steht jetzt - dank dir!
Kannst du mir noch erklären, wie ich doppelte Einträge löschen kann oder von Anfang an verhindern kann, dass diese erzeugt werden?
Problem ist ja, dass er die Spalten "C" bis "E" schon durchsuchen muss, wenn aber in "C" und "E" in einer Zeile der selbe Inhalt steht, darf dafür im Ergebnis nur eine Zeile ausgegeben werden.
Gruß Mike
Antwort 16 von coros vom 29.07.2021, 13:14 Options
Hallo Mike,
lade Dir wieder unter
http://www.excelbeispiele.de/Beispiele_Supportnet/test%20-%20Copy%2... Deine Beispieldatei herunter. Darin habe ich integriert, dass Datensätze, die bereits kopiert wurden, nicht nocheinmal kopiert werden, wenn in dem Bereich der Suchbegriff erneut vorkommt.
Ich hoffe, Du meintest das so?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 17 von Mike_2009 vom 29.07.2021, 14:07 Options
super!
Das ist genau das, was ich brauchte.
Auf die Idee das ganze mit einer "Hilfs Tabelle" zu machen, bin ich natürlich nicht gekommen. Ganz große Klasse.
In der Zwischenzeit habe ich schon weiter gebastelt um meiner Vision mit den Dropdown Boxen näher zu kommen, aber auch da habe ich noch viele Steine im Weg liegen.
Sub ComboInsert()
Dim combo As Object
Set combo = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=Range("a1").Left, Top:=Range("a1").Top, Width:=120, Height:=25.5)
combo.ListFillRange = "Sheet1!C9:C21"
End Sub
Das klappt schon mal... jetzt habe ich da aber auch wieder doppelte Einträge aus der Spalte C.
Da kann ich das
If objAktSheet.Cells(rngSuchbereich.Row, 256) <> "x" Then
objAktSheet.Rows.Range("C7:H8").Copy _
objNewSheet.Cells(7, 3) '(Zeile, Spalte)
objAktSheet.Rows(rngSuchbereich.Row).Copy _
objNewSheet.Cells(objNewSheet.Range("C65536").End(xlUp).Offset(1, 0).Row, 1)
sicher nicht mehr so ohne weiteres verwenden, richtig?
Antwort 18 von coros vom 29.07.2021, 15:01 Options
Hallo Mike,
nein, damit kannst Du so wie der Code im Moment ist, nichts anfangen, da dann der Code anders aussehen müsste.
Warum arbeitest Du eigentlich nicht mit dem Autofilter. Damit kannst Du doch geziehlt Begriffe pro Spalte filtern lassen und erhälst abschließend nur die Zeilen angezeigt, die der Bedingung entsprechen. Diese Zeilen kopierst Du dann einfach.
Ich habe Dir in Deine Deine Beispieldatei mal ein Beispiel eingebaut, mit dem Du die gefilterten Werte in das neue Blatt kopieren kannst. Lade Dir die Datei wieder unter dem Dir bekannten Link herunter.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 19 von Mike_2009 vom 29.07.2021, 15:30 Options
Hallo Oliver,
Autofilter aus dem Grunde nicht, weil die "gefilterten" Daten (über die Auswahl des Dropdowns) dann sofort in einem neuen Sheet gespeichert werden sollen.
Mit der Autofilter-Version habe ich versucht meinen Chef zu befriedigen, aber der will es halt nicht :-( - Wäre ihm zu umständlich... darum drehe ich mich da mit diesen blöden Drop-Down Menüs etwas im Kreis.
So wie du den Autofilter und Kopierfunktion jetzt hast, so bräuchte ich das für den Dropdown...
Antwort 20 von coros vom 29.07.2021, 17:22 Options
Hallo Mike,
sorry, aber das verstehe ich nicht. Wo ist der Unterschied, ob ich nun in 3 Kombinationsfeldern eine Auswahl treffe und die Daten danach gefiltert und kopiert werden oder man das über den Autofilter macht und die Daten danach gefiltert und kopiert werden?
Für solch eine Lösung wie Du sie anstrebst muss man mit Schleifen arbeiten, die dann Spalte für Spalte abarbeiten.
Was ich auch nicht so ganz verstehe, warum Du nicht gleich bei der Aufgabenstellung erwähnt hast, was Du nun jetzt erst nach AW13 erwähnst, Also die Auswahl von 3 Kriterien über ComboBoxen. Wobei nicht die ComboBoxen, sondern eher die 3 Kriterein eine Rolle spielen. Dann hätte man den Code gleich in eine andere Richtung entwickeln können.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.