vielleicht ist ja ein Excel-Crack hier, der mir helfen kann?
Ich habe eine schier unendlich lange bzw. große Excel Datei mit vielen Datensätzen. Diese stammen wohl aus einem Programm, in dem diese Datensätze als Karteikarten geführt wurden. Die Tabellen sind teilweise über 30000 Zellen oder Spalten lang/breit und bestehen aus Adressdaten und weiteren Informationen. Das Problem: Jede "Karteikarte" ist eine Adresse, geht über eine Seite und es ist keine Struktur dahinter, also weder Zellen noch Spalten. Das einzige feste Merkmal: Direkt neben der Zelle "Firma" und "Straße" etc. steht immer der Datensatz, den ich benötige, aber eben kreuz und quer über die gesamte Excel Datei verteilt.
Gibt es eine Formel, die sich nicht nach Zeilen- oder Spaltensätzen richtet, sondern sich nach "quasi" Suchbegriffen richtet?
Beispiel Aufbau:
Zelle A1 = Bezeichnung "Firma" Zelle B1 = Firmenname Zelle A2 = Straße der Firma Telle B2 = Straßenname usw.
aber dann eben geht es so weiter:
Zelle A8 = Bezeichnung "Firma" Zelle B8 = Firmenname usw.
Kurz um: Die Daten die ich benötige stehen immer rechts neben der Zelle die immer den gleichen textlichen Inhalt hat. Im Anhang findet Ihr ein Bild, die orangenen Felder möchte ich auslesen (links Bezeichnung, rechts Wert).
Ist es denn möglich, über die gesamte Tabelle hinaus, nicht nur in bestimmten Spalten oder Zellen (Bereich von A1 bis ZZZZ9999), 1. nach Spalten mit bestimmten textlichen Inhalt zu suchen und 2. die Daten der rechten Zelle daneben auszulesen und 3. diese Daten unter- oder nebeneinander in einer Tabelle auszugeben?
meiner Meinung nach wäre es besser, die Daten in ein sinnvolles Format zu bringen statt eine Formel zu knstruieren, die das ganze so ausliest, wie es ist.
Am besten Du lädst hier eine Beispieltabelle hoch (mit mindestens 5 anonymisierten Datensätzen), dann kann man sicher per Makro eine Lösung finden, die Daten sinnvoll zu strukturieren.
16.07.2018, 10:15 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2018, 10:16 von Druckvertrieb.)
Das Problem ist, dass das Ding komplett durcheinander, kreuz und quer und ohne Struktur ist. Es würde nichts bringen einen Ausschnitt zu schicken, weil es gefühlt unendlich viele Daten sind, die absolut keine Struktur aufweisen. Darum ja auch meine Frage, ob eine "automatische Suchfunktion mit Datenausgabe" möglich ist.
Wenn es so ein komplettes Durcheinander ist, dann frage ich mich, ob eine Suche zum gewünschten Ergebnis führt.
Nach was genau willst Du denn suchen? Haben die Daten ein eindeutiges Merkmal (z. B. Kundennummer)? Sind die Suchbegriffe eindeutig in der Tabelle? Wenn der Begriff mehrfach vorkommt, sollen dann alle Vorkommnisse aufgelistet werden?
Da die Daten ja immer "zusammen" vorkommen, könnte man diese eventuell auch aus dieser unstrukturierten Tabelle "zusammenführen". Aber ohne Beispieltabelle bastelt hier nur selten jemand etwas zusammen.
Ich antworte noch mal, falls jemand mitliest und evtl. eine Lösung kennt:
Es gibt diverse Begriffe wie "Firma" oder "Straße" usw., die immer fest und gleich sind und der gesuchte Inhalt den ich brauche steht immer in der Zelle daneben.
Im Prinzip brauche ich einen Suchalgorithmus, der eben nach diesen Zellinhalten sucht und mir den Wert der Nebenzelle ausgibt in einer neuen Tabelle. Dabei muss es dem Algorithmus egal sein in welcher Zelle es steht, es soll global über die gesamte Exceldatei bzw. -Tabelle gesucht werden.
prinzipiell ist es natürlich möglich per VBA nach Begriffen wie "Firma" oder "Straße" suchen zu lassen - eine erste Idee für den Code hierfür kriegst du per Makro Rekorder. Aber wenn deine Daten komplett ohne Struktur sind, wird es schwierig zu der gefunden Firma A auch sicherzustellen, dass die Straße auch zur Firma A gehört oder vielleicht doch zu Firma B?? Du wirst vielleicht Ergebnisse kriegen, kannst aber nie sicher sein, dass dein Ergebnis auch stimmt.
Insofern stimme ich da Steuerfuzzi zu, dass es besser ist, die Struktur zu ordnen.
Okay, sagen wir, ich könnte die Daten auf eine bestimmte Spalte reduzieren (Suchbegriff ist immer in Spalte A und das gesuchte Datum in B bzw. Spalte C und D), wäre es dann einfacher für einen Algorithmus?
es ist deshalb immer noch keine Eindeutigkeit für das Auslesen entstanden, denn ich nehme an, dass auch Daten mehrfach vorkommen können. Ich rate dir, den Beitrag hinter diesem Link zu lesen und dann tatsächlich deine Datei umzubauen. https://www.online-excel.de/excel/singsel.php?f=52
Gruß Günter Jeder Fehler erscheint unglaublich dumm, wenn andere ihn begehen. angebl. von Georg Christoph Lichtenberg (1742-1799)
16.07.2018, 16:02 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2018, 16:02 von Der Steuerfuzzi.)
Hallo,
setze das bestehende Tabellenblatt an die erste Stelle in der Arbeitsmappe und füge ein weiteres Tabellenblatt danach ein (also an zweiter Stelle). Öffne den Visual Basic Editor ( z. B. mit Alt+F11), im Projekt-Explorer (links) Rechtsklick auf Deine Datei -> Einfügen -> Modul. Dort fügst Du den folgenden Code ein:
Code:
Sub ListeErstellen() Dim Data As Variant Dim i As Long, j As Long, Z As Long Dim Result As Variant
Data = Sheets(1).UsedRange ReDim Result(UBound(Data, 1) / 35 * UBound(Data, 2) / 16, 9) 'Daten sind anscheinend immer 35 Zellen hoch und 16 Zellen breit -> Dimensionierung mit der 'ungefähren maximalen Anzahl an Datensätzen bei optimaler Ausnutzung des Platzes Result(0, 0) = "Name" Result(0, 1) = "Straße" Result(0, 2) = "PLZ" Result(0, 3) = "Ort" Result(0, 4) = "Telefon" Result(0, 5) = "Fax" Result(0, 6) = "Ansprech." Result(0, 7) = "MaschinenTyp" Result(0, 8) = "Maschinen Nr." Result(0, 9) = "Stellplatz Nr."
Do While j < UBound(Data, 2) j = j + 1 i = 0 Do While i < UBound(Data, 1) i = i + 1 If Data(i, j) = "Name:" Then If Data(i, j + 1) <> "" Or Data(i, j + 13) <> "" Or Data(i + 1, j + 13) <> "" Then 'Wenn "Name", "MaschinenTyp" und "Maschinen Nr" leer sind, dann keinen Datensatz hinzufügen Z = Z + 1 Result(Z, 0) = Data(i, j + 1) Result(Z, 1) = Data(i + 1, j + 1) Result(Z, 2) = Data(i + 2, j + 1) Result(Z, 3) = Data(i + 3, j + 1) Result(Z, 4) = Data(i + 4, j + 1) Result(Z, 5) = Data(i + 5, j + 1) Result(Z, 6) = Data(i + 6, j + 1) Result(Z, 7) = Data(i, j + 13) Result(Z, 8) = Data(i + 1, j + 13) Result(Z, 9) = Data(i + 2, j + 13) End If i = i + 34 'Ich gehe davon aus, dass alle Blöcke gleich groß sind, und springe daher gleich mal an das Ende des Blocks 'Wahrscheinlich kann man hier sogar weiter "springen", da anscheinend große Abstände zum nächsten Block 'bestehen. Das bringt aber mE keinen Vorteil mehr End If Loop Loop Sheets(2).UsedRange.EntireRow.Delete With Sheets(2).Range(Tabelle2.Cells(1, 1), Tabelle2.Cells(Z + 1, 10)) .Value = Result .AutoFilter End With Sheets(2).Activate End Sub
Wenn Du diesen Code ausführst (z. B. mit F5 oder über das Menü "Ausführen" -> "Sub/Userform ausführen"), erstellt das Makro (hoffentlich) eine Liste im zweiten Tabellenblatt.
setze das bestehende Tabellenblatt an die erste Stelle in der Arbeitsmappe und füge ein weiteres Tabellenblatt danach ein (also an zweiter Stelle). Öffne den Visual Basic Editor ( z. B. mit Alt+F11), im Projekt-Explorer (links) Rechtsklick auf Deine Datei -> Einfügen -> Modul. Dort fügst Du den folgenden Code ein:
Code:
Sub ListeErstellen() Dim Data As Variant Dim i As Long, j As Long, Z As Long Dim Result As Variant
Data = Sheets(1).UsedRange ReDim Result(UBound(Data, 1) / 35 * UBound(Data, 2) / 16, 9) 'Daten sind anscheinend immer 35 Zellen hoch und 16 Zellen breit -> Dimensionierung mit der 'ungefähren maximalen Anzahl an Datensätzen bei optimaler Ausnutzung des Platzes Result(0, 0) = "Name" Result(0, 1) = "Straße" Result(0, 2) = "PLZ" Result(0, 3) = "Ort" Result(0, 4) = "Telefon" Result(0, 5) = "Fax" Result(0, 6) = "Ansprech." Result(0, 7) = "MaschinenTyp" Result(0, 8) = "Maschinen Nr." Result(0, 9) = "Stellplatz Nr."
Do While j < UBound(Data, 2) j = j + 1 i = 0 Do While i < UBound(Data, 1) i = i + 1 If Data(i, j) = "Name:" Then If Data(i, j + 1) <> "" Or Data(i, j + 13) <> "" Or Data(i + 1, j + 13) <> "" Then 'Wenn "Name", "MaschinenTyp" und "Maschinen Nr" leer sind, dann keinen Datensatz hinzufügen Z = Z + 1 Result(Z, 0) = Data(i, j + 1) Result(Z, 1) = Data(i + 1, j + 1) Result(Z, 2) = Data(i + 2, j + 1) Result(Z, 3) = Data(i + 3, j + 1) Result(Z, 4) = Data(i + 4, j + 1) Result(Z, 5) = Data(i + 5, j + 1) Result(Z, 6) = Data(i + 6, j + 1) Result(Z, 7) = Data(i, j + 13) Result(Z, 8) = Data(i + 1, j + 13) Result(Z, 9) = Data(i + 2, j + 13) End If i = i + 34 'Ich gehe davon aus, dass alle Blöcke gleich groß sind, und springe daher gleich mal an das Ende des Blocks 'Wahrscheinlich kann man hier sogar weiter "springen", da anscheinend große Abstände zum nächsten Block 'bestehen. Das bringt aber mE keinen Vorteil mehr End If Loop Loop Sheets(2).UsedRange.EntireRow.Delete With Sheets(2).Range(Tabelle2.Cells(1, 1), Tabelle2.Cells(Z + 1, 10)) .Value = Result .AutoFilter End With Sheets(2).Activate End Sub
Wenn Du diesen Code ausführst (z. B. mit F5 oder über das Menü "Ausführen" -> "Sub/Userform ausführen"), erstellt das Makro (hoffentlich) eine Liste im zweiten Tabellenblatt.
Vielen Dank! Da kommt beim ausführen die Meldung "End Sub erwartet" - Fehlt da was oder bin ich zu doof? Muss dazusagen, dass ich keine Ahnung von VBA habe, bin normaler Büro-Office-Anwender.