1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

EXCEL VBA, bestimmte Zellen identifizieren

Discussion in 'Office-Programme' started by yorck, Jun 22, 2008.

Thread Status:
Not open for further replies.
  1. yorck

    yorck Byte

    Verehrte Gemeinde,

    ich brauche bitte Eure Hilfe:

    In einer Tabelle "quelle" befinden sich Datensätze, die sich auf verschiedene Artikel beziehen. Zu jedem Artikel gibt es mehrere Datensätze, die sich über eine Artikelnummer und ein Tagesdatum eindeutig identifizieren lassen. Ausserdem sind die Datensätze bereits nach Artikelnummer und Tagesdatum sortiert.

    Täglich werden von Extern neue Datensätze importiert.

    In eine Tabelle "ziel" sollen die Daten kopiert werden. Dies muß täglich neu erfolgen, um die neuen Daten nachzuhalten.

    Bis hier unterscheiden sich die beiden Tabellen nicht.

    "ziel" soll aber die Daten für eine weitere Aufbereitung in Blöcke trennen. "quelle" soll immer nur ein Datenpool für den Import bleiben.

    Könnte ich EXCEL direkt ansprechen, läse sich das so:

    Lies mir aus der Tabelle "quelle" aus der Spalte "Artikelnummer" Zelle für Zelle die Daten aus und kopiere den gesamten Datensatz (Zeile) nach "ziel". Mach das so lange, bis Du eine neue/andere Artikelnummer entdeckst. Lass eine Zeile leer und mach mit der nächsten Artikelnummer das gleiche, so lange, bis du wieder eine neue Artikelnummer findest. Etc...

    Warum ich keinen Autofilter verwende?
    Dadurch, dass es mehrere/viele Artikelnummern gibt, müßte der Filter vor jedem Kopieren neu gesetzt werden. Die Daten sind in "quelle" bereits aufsteigend sortiert (über ein Tagedatum). Deshalb fand ich es einfacher, Artikelnummer für Artikelnummer abzuarbeiten.

    Weiss jemand Rat?

    Dank im Voraus

    Yorck
     
    Last edited: Jun 22, 2008
  2. Urs2

    Urs2 Megabyte

    @Thomas > Du glaubst doch nicht wirklich, man könne das Problem in die Google-Suchmaske quetschen?

    @york
    Zuerst einige Fragen, dann sehe ich, ob ich helfen könnte >

    - Grössenordnung der Tabellen (Datensätze insgesamt + Anzahl der Artikelnummern) ?
    - Die Datensätze sind alle gleich strukturiert ?

    - "quelle" enthält die die früheren und die laufend neu eintreffenden Daten ?
    - Das wird alles sortiert nach Datum ?

    - Datum unterscheidet klar zwischen Datensätzen, die schon übertragen wurden, und solchen, die noch zu übertragen sind ?
    - Keine Konfusion möglich ?

    - In "quelle" sind die Datensätze fortlaufend geschrieben, ohne Leerzeilen ?


    - "ziel" enthält nach getaner Arbeit die gleichen Datensätze wie "quelle", die alten und die neuesten Daten ?

    - Die einzelnen "Artikel-Absätze" sind durch eine Leerzeile getrennt, aber in sich ein kompakter Block ?


    Ich würde in "quelle" die Neuzugänge nach (heutigem? gestrigem?) Datum abarbeiten und jeweils den Artikelnummern in "ziel" zuweisen.

    Wenn es nicht zu viele davon gibt, könnte man den einzelnen Artikelnummern benannte Bereiche zuweisen. Sonst muss man sie halt suchen lassen...

    Immer unter Vorbehalt einer zu grossen Anzahl, könnte man den einzelnen Artikeln jeweils ein eigenes Tabellenblatt namens "Artikelnummer" spendieren...


    Der eigentliche Uebertrag mit Zeileneinfügen wäre dann kein grösseres Problem mehr.
    Wir werden dann sehen...

    Gruss Urs
     
  3. yorck

    yorck Byte

    Hallo Urs,

    anbei die ergänzenden Informationen:


    - Grössenordnung der Tabellen (Datensätze insgesamt + Anzahl der Artikelnummern) ?
    * Bislang etwa 8.000. Die Artikelnummer ist jeweils Teil eines Datensatzes (Spalte 4). Arbeitstäglich kommen etwa 150 Datensätze hinzu. Täglich für jeden Artikel ein neuer Datensatz.


    - Die Datensätze sind alle gleich strukturiert ?
    * Ja.


    - "quelle" enthält die die früheren und die laufend neu eintreffenden Daten ?
    * Genau.

    - Das wird alles sortiert nach Datum ?
    * Erst nach Artikelnummer, dann aufsteigend nach Datum.


    - Datum unterscheidet klar zwischen Datensätzen, die schon übertragen wurden, und solchen, die noch zu übertragen sind ?
    - Keine Konfusion möglich ?
    * Das Datum macht die Datensätze eindeutig. Eine Trennung nach bereits übertragenen und noch zu übertragenden Daten ist nicht nötig, wenn "ziel" täglich gelöscht und neu erstellt wird. Wenig elegant, reicht aber für meine Zwecke. Da die Daten in "quelle" bereits sortiert sind, besteht die Hauptaufgabe darin, die Daten in Blöcke für jede Artikelnummer zu trennen.

    - In "quelle" sind die Datensätze fortlaufend geschrieben, ohne Leerzeilen ?
    * Fortlaufend, ohne Leerzeilen.

    - "ziel" enthält nach getaner Arbeit die gleichen Datensätze wie "quelle", die alten und die neuesten Daten ?
    * Genau.

    - Die einzelnen "Artikel-Absätze" sind durch eine Leerzeile getrennt, aber in sich ein kompakter Block ?
    * In "ziel" sollen die Daten weiter verarbeitet werden. Dazu brauche ich für jede Artikelnummer einen klar abgegrenzten Block. Inzwischen bin ich nicht mehr sicher, ob man die Blöcke mit einer Leerzeile trennt, oder ob es geschickter ist, sie spaltenweise nebeneinander zu plazieren. Wird aber eng bei 265 EXCEL-Spalten.


    Ich würde in "quelle" die Neuzugänge nach (heutigem? gestrigem?) Datum abarbeiten und jeweils den Artikelnummern in "ziel" zuweisen.
    * Siehe oben. Wenn "ziel" täglich nach dem Import neu erstellt wird, ist die Trennung nach alt und neu gar nicht nötig.

    Wenn es nicht zu viele davon gibt, könnte man den einzelnen Artikelnummern benannte Bereiche zuweisen. Sonst muss man sie halt suchen lassen...


    Immer unter Vorbehalt einer zu grossen Anzahl, könnte man den einzelnen Artikeln jeweils ein eigenes Tabellenblatt namens "Artikelnummer" spendieren...
    * Gute Idee...

    Gruß

    Yorck
     
  4. Hascheff

    Hascheff Moderator

    Vermutlich werden die Leerzeilen in "ziel" für Überschriften oder Zusammenfassungen benötigt. Für mich ist das ein klarer Fall für das, was in Access ein Bericht mühelos leistet. Du hättest keine Arbeit mit Sortieren, das läuft in Access automatisch.
    Der Import aus Excel ist kein Problem, sogar für den täglichen automatischen Import gibt es Beispiele.

    Willst du es nicht mal mit Access versuchen? Deine Datenbank scheint mir ein gutes Einstiegsbeispiel zu sein.
     
  5. yorck

    yorck Byte

    @Hascheff,

    habe ich auch schon dran gedacht, möchte aber zunächst in EXCEL bleiben. Schon aus Gründen des Lerneffektes. Früher oder später wird EXCEL an seine Grenzen stossen, dann werde ich mich damit befassen müssen.
    Jetzt ist erst einmal wichtig, die Datensätze zu identifizieren und wie beschrieben zu kopieren. Bin noch ganz am Anfang meines Projekts und habe noch nicht alles zu Ende gedacht. Trotzdem Danke für die Idee.

    Gruß
    Yorck
     
  6. Urs2

    Urs2 Megabyte

    @yorck

    Na so was... Ich hatte hier gestern ca. um 06.00 einen Beitrag geschrieben mit Vorschlägen und einigen Fragen...
    ... jetzt ist der Beitrag weg... keine Spur von ihm...

    Ich hatte gewartet,bis er vom Forum akzeptiert wurde und ich hatte ihn gesehen...weiss der Teufel, wer den gefressen hatte...

    Da mein heutiger Vorschlag ohne meine gestrigen Bemerkungen in der Luft hängt, muss ich jetzt zuerst erforschen, was ich vor 24 Stunden denn wohl geschrieben haben könnte...

    <Pause> .... Gruss Urs
     
  7. Urs2

    Urs2 Megabyte

    Na ja… schreib ich halt nochmals...mit Word, zur Beweissicherung… jetzt wird es dafür etwas länger…

    Geht es hier um das Projekt mit den zweizeiligen Datensätzen ? > http://www.pcwelt.de/forum/office-programme-microsoft-office-openoffice-org-staroffice/302546-excel-zweizeiliger-datensatz.html
    Von damals 2000 auf heute 8000 Datensätze, könnte passen… in 3 Monaten.

    Dann könnte man doch diese Befehle direkt an das dortige Makro anhängen. In einem Aufwasch hätte man dann >
    1. Formatieren der zweizeiligen Datensätze
    2. Eintrag in „ziel“ und
    3. Eintrag in „quelle“

    Dazu brauchte es ein neues Blatt „Neu_Tag“, das nur die täglich neu eintreffenden Daten enthält, die nach der Verarbeitung wieder gelöscht werden.
    „quelle“ wäre dann wie bis anhin das Sammelblatt für alle Datensätze
    „ziel“ hätte das Doppel der Daten, geordnet nach Artikelnummern.

    Es stört mich, jeden Tag zig-tausende von Einträgen zu erstellen, wenn es auch mit nur 150 geht…

    „ziel“ ist noch etwas in der Schwebe >
    - Von den 12-zelligen Datensätzen bringt man natürlich nicht 150 nebeneinander auf ein Blatt…
    - Untereinander in Blöcken > wie willst Du diese Menge dann sortieren und weiterverarbeiten?
    - Ein Tabellenblatt pro Artikelnummer > das könnte Excel > ein Monument wird das ja so oder so…

    Beim Testen des Makros hatte ich den Haltepunkt vergessen > es hatte mir blitzartig 450 leere Blätter in die Datei gesetzt… zusätzliche Datei-Grösse = 1.5 MB

    >> Teste ob die Artikel-Nummern in der Form vorliegen, dass man sie direkt als Blattnamen verwenden kann. Sonst müsste man sie noch entsprechend formatieren.

    >> …und dann teste dieses Makro - so >>

    - Kopie Deines Blattes „quelle“ mit allen Daten in eine neue Datei (Rechtsclick auf das Tab des Blattes > Verschieben/Kopieren > neue Arbeitsmappe + Kopie erstellen > OK

    - In dieser Versuchs-XLS >
    - Benenne das einzige Blatt um in „Neu_Tag“
    - Erstelle ein neues leeres Blatt, mit Namen „quelle“

    - wenn die Artikelnummern nicht direkt als Blattname zulässig sind, kannst Du die ganze Spalte „D“ mit
    =ZUFALLSBEREICH(41261;41314) füllen, das reicht für den Test.

    - Datum hier umgekehrt sortieren (neuestes unten), damit es nachher richtig wird

    - Die Datensätze müssen in Zeile 1 beginnen

    - Nach 100 Zeilen eine Leerzeile einfügen, sonst rattert er im ersten Test schon alles durch…

    > Code einfügen und starten…

    Code:
    Option Explicit
    
    Sub DatenSätzeVerteilen()
    
    Dim i As Integer, iRow As Integer
    Dim wsDay As String, wsTotal As String, artNum As String, rngCopy As String
    
    wsDay = "Neu_Tag"       'Namen der 2 Tabellenblätter
    wsTotal = "quelle"
    rngCopy = "A1:L1"       'Bereich mit den 12 Zellen eines Datensatzes
        
                            'läuft so schneller
        Application.ScreenUpdating = False
        
        Sheets(wsDay).Activate
                            'D1 = oberste Zelle mit der Artikelnummer
        Range("D1").Select
        iRow = Selection.CurrentRegion.Rows.Count
        For i = 1 To iRow
                            'liest Artikelnummer aus
            artNum = ActiveCell.Value
                        'schaut ob Artikel-Blatt schon existiert
            On Error Resume Next
            If Len(Sheets(artNum).Name) < 1 Then
                            'wenn kein Blatt > erstellt und benennt neues
                Sheets.Add After:=Worksheets(Worksheets.Count)
                ActiveSheet.Name = artNum
                            'überträgt Daten in das neue Blatt
                Sheets(artNum).Range(rngCopy).Value = Sheets(wsDay).Range(rngCopy).Value
                            'gleiche Daten auch in "quelle", zuoberst
                Sheets(wsTotal).Rows(1).EntireRow.Insert shift:=xlDown
                Sheets(wsTotal).Range(rngCopy).Value = Sheets(wsDay).Range(rngCopy).Value
                            'löscht verarbeitete Zeile in "Neu_Tag"
                Sheets(wsDay).Activate
                Sheets(wsDay).Rows(1).EntireRow.Delete
                            'ab zur nächsten Zeile in "quelle"
                Range("D1").Select
            Else
                        'oder, wenn Artikel-Blatt schon vorhanden...
                             'Eintrag zuoberst im Artikel-Blatt
                Sheets(artNum).Rows(1).EntireRow.Insert shift:=xlDown
                Sheets(artNum).Range(rngCopy).Value = Sheets(wsDay).Range(rngCopy).Value
                            'gleiche Daten auch in "quelle", zuoberst
                Sheets(wsTotal).Rows(1).EntireRow.Insert shift:=xlDown
                Sheets(wsTotal).Range(rngCopy).Value = Sheets(wsDay).Range(rngCopy).Value
                            'löscht verarbeitete Zeile in "Neu_Tag"
                Sheets(wsDay).Rows(1).EntireRow.Delete
                            'ab zur nächsten Zeile in "quelle"
                Sheets(wsDay).Activate
                Range("D1").Select
                
            End If
        Next
        
        Application.ScreenUpdating = True
    
    End Sub
    
    Tut es ungefähr was es soll? Namen, Zellen und wohl noch mehr muss man dann anpassen...

    Die Frage ist natürlich, wie Du die Artikelweisen Datenblöcke weiterverarbeiten willst.
    Vielleicht reicht ja auch eine gezielte Abfrage der Daten, die eine Artikelnummer betreffen, ohne dass diese permanent in der Datei getrennt gespeichert wären...

    Gruss Urs
     
  8. Hascheff

    Hascheff Moderator

    Was heißt das? Kommen da Dateien auf Stick, Diskette oder CD in den PC, oder gibt es eine Netzwerkverbindung? Oder kommen sie aus dem Internet?

    Sind das Excel-Dateien oder stammen die aus anderen Programmen, z.B. als csv-Export?
     
  9. Urs2

    Urs2 Megabyte

    @Hascheff

    Zuerst verschwindet der Beitrag mit meinen Fragen...
    ...dann versuche ich das Fehlende zu rekonstruieren...
    ...dann scheint der TO offenbar das Interesse verloren zu haben...

    Kein Problem >>> Bei jeder Suche nach einer Lösung erschliessen sich auch mir neue Erkenntnisse >
    >>> ausgebucht unter Gewinn/Verlust...

    Gruss Urs
     
  10. Hascheff

    Hascheff Moderator

    So schlimm muss es nicht gleich kommen. Jeder kann mal ein paar Tage verhindert sein. War nicht kürzlich ein TO nur mal alle vier Wochen im Forum?
     
  11. Urs2

    Urs2 Megabyte

    @Hascheff

    Ja, hast natürlich recht !
    Ich war wohl noch etwas aufgeregt über das Zitterresultat heute Abend... in meiner Geburts-Stadt...

    Gruss Urs
     
Thread Status:
Not open for further replies.

Share This Page