Daten in bestimmten Zellen aus Excel auslesen
#1
Hallo liebe Forumsmitglieder,

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?

Danke schon mal vorab für Eure Hilfe.


Angehängte Dateien Thumbnail(s)
   
Top
#2
Hallo,

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.
Gruß
Michael
Top
#3
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.
Top
#4
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.
Gruß
Michael
Top
#5
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.
Top
#6
Hallo,

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.
Top
#7
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?
Top
#8
Hallo,

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)
Top
#9
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.
Gruß
Michael
[-] Folgende(r) 1 Nutzer sagt Danke an Der Steuerfuzzi für diesen Beitrag:
  • Druckvertrieb
Top
#10
(16.07.2018, 16:02)Der Steuerfuzzi schrieb: 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.

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.
Top


Gehe zu:


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