Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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)
   
Antworten 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
Antworten 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.
Antworten 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
Antworten 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.
Antworten 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.
Viele Grüße,
Matthias

-------------------------------------------------------------------------------------------

Man muß nicht alles wissen, man muß nur wissen, wie man die Lösung findet.
Antworten 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?
Antworten 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)
Antworten 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
Antworten Top
#10
(16.07.2018, 15: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.
Antworten Top


Gehe zu:


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