Bestimmte Zellen für alle Blätter kopieren und hintereinander in eine Zeile einfügen

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von An Nie.

    Bestimmte Zellen für alle Blätter kopieren und hintereinander in eine Zeile einfügen

    Hallo zusammen,
    ich bin neu hier und habe direkt ein Anliegen. Ich taste mich derzeit langsam an Excel VBA Operationen heran, habe allerdings offenbar schon bei den Grundlagen ziemlich große Lücken...
    Vielleicht kann mir ja jemand hier helfen.
    Um genau zu sein, benötige ich zwei Makros (in der Suche habe ich nichts passendes ausgraben können):

    1.) Makro 1 kopiert für jedes Arbeitsblatt (ab z.B. Arbeitsblatt Nummer 3) bestimmte Zellen (F17, F24, F31, ...) und fügt Sie in einem Arbeitsblatt (nennen wir es mal hochgestochen "Datenbank") hintereinander in jeweils eine Zeile kopiert (für F17 z.B. Zeile 3 ab B3, Für F24 Zeile 4 ab B4, etc.). Wie löst man das?
    Meine Ansätze, bestehend aus Fragmente bei google stehlen, Halbwissen anlesen und Segmente aus der "Makro aufnehmen"-Funktion scheitern bisher grandios :) .

    2.) Makro 2 greift sich wiederum Werte aus allen Mappen (z.B. Zeile B3, B5, B7) eines Ordners und konsolidiert diese in einer Tabelle zeilenweise untereinander zu einer Tabelle, mit der man dann weiterarbeiten kann. Auch hier tappe ich im Dunkeln bzw. habe mich mangels Makro 1 (hier sollen die Ergebnisse verarbeitet werden) noch nicht herangetraut.

    Bin für Hinweise, Beispielmakros (das kann ja eigentlich nicht so lang sein?) und Erklärungen dazu äußerst dankbar!

    Gruß
    Jens
    Ok, hier steht ein paar Beiträge weiter unten schon einmal etwas, nur mit Spalten... Ich versuche mich auch mal daran, das etwas umzubauen.

    Okay, ich habe jetzt zumindest hinbekommen, die Werte zu kopieren. Zielzelle ist leider fix. Wie bekomme ich es hin, hintereinander zu kopieren, damit nicht immer der letzte Wert die anderen überschreibt?

    Visual Basic-Quellcode

    1. Sub copycells()
    2. Dim I As Integer
    3. For I = 4 To Sheets.Count
    4. Worksheets(I).Activate
    5. Range("F17").Select
    6. Selection.Copy
    7. Sheets("Tabelle1").Select
    8. Range("F17").Select
    9. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    10. :=False, Transpose:=False
    11. Next I
    12. End
    13. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „plotz“ () aus folgendem Grund: VBA Prototyp eingefügt.

    Visual Basic-Quellcode

    1. Sub copycells()
    2. For i = 4 To Sheets.Count
    3. For j = 17 to 31 Step 7
    4. Worksheets(i).Cells(j,6).Copy Sheets("Tabelle1").Cells(Rows.Count,2).End(xlUp).Offset(1)
    5. Next
    6. Next
    7. End Sub
    Dein Ansatz ist aber sehr statisch.
    Ich hoffe, dass deine Tabellenblätter alle gleich aussehen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi Petaod,

    das sieht schonmal super aus. Die Tabellenblätter sind vorgefertigte Templates, in die nur noch Daten eingetragen werden sollen. Daher auch der statische Ansatz.
    Ich bin soeben auch auf eine Lösung gekommen, die vermutlich nicht sehr sauber ist, aber zumindest "einzeln" funktioniert.
    Deine ist allerdings besser, werde sie übernehmen :) .
    Danke!

    Das Problem mit den Dateien habe ich leider immernoch.


    PS: Um wenigstens irgendwie beizutragen - hier ist "meine" Lösung:

    Visual Basic-Quellcode

    1. Sub Kat1()
    2. Sheets("Database").Activate
    3. Range("C3").Select
    4. Dim I As Integer
    5. Dim Wert As Variant
    6. For I = 3 To Sheets.Count
    7. Worksheets(I).Activate
    8. Range("F17").Select
    9. Wert = Selection.Value
    10. Selection.Copy
    11. Sheets("Database").Activate
    12. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    13. :=False, Transpose:=False
    14. ActiveCell.Offset(0, 1).Activate
    15. Next I
    Du solltest darauf achten, dass folgende Ausdrücke in deinem Code nicht vorkommen:
    .Activate
    .Select
    .Active....
    .Selection
    .Paste...

    Diese aus dem Macrorecorder übernommenen Relikte machen den Code sehr anfällig für Beeinflussung durch parallele Aktivitäten des Anwenders und/oder anderer Programme.
    Der Pastebuffer z.B. wird systemweit verwendet.

    Und wie du oben siehst, ist der Code bei Vermeidung dieser Methoden wesentlich kürzer und effizienter.
    Falls du nur die Werte benötigst (ohne Format), kannst du die Kopierzeile auch so anlegen:

    Visual Basic-Quellcode

    1. Sheets("Tabelle1").Cells(Rows.Count,2).End(xlUp).Offset(1).Value = Worksheets(i).Cells(j,6).Value
    Evtl. musst du die Konstanten noch anpassen, dass sie tatsächlich auf deine Sheets passen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Da meine Frage ähnlicher Natur ist (soweit ich beurteilen kann), möchte ich sie hier anschließen und hoffe auf rasche Hilfe:

    Zu mir: Ich habe keinerlei Vorwissen und kann von daher auch mit den oben stehenden Codes und Erläuterungen nichts anfangen bzw. sie nicht für meine Zwecke ummodeln.

    Anliegen: Ich brauche eine Funktion/ein Makro, welches mir einzelne Tabellen Zeile für Zeile ausliest und dann zeilenweise hintereinander (innerhalb einer Zeile) einfügt.

    Hintergrund: Ich habe eine mehr oder weniger überschaubare (ca. 180, später mehr) Menge an Text-Dateien, in zwei unterschiedlichen Versionen, die wiederum ich über die Import-Funktion in jeweils ein Excel-Sheet hole: Somit erhalte ich eine Tabelle von 20 bzw. 80 Zeilen. Diese möchte ich in eine weitere Tabelle überführen, und zwar alle Zeilen hintereinander in eine einzige Zeile.

    Letztlich kommen die Inhalte von je 6 Text-Dateien = Tabellen in eine Zeile, danach wird die nächste Zeile mit wiederum je 6 zueinander gehörigen Text-Dateien befüllt.

    Es ist okay, wenn ich den Text-Import in die Tabelle (anderes Sheet) händisch mache. Die Copy-und-Paste-Transformation aus einer Tabelle in eine einzige Zeile (in ein anderes Sheet derselben Datei) ist mir jedoch zu zeit- (und Fehler-)aufwendig.

    Im Idealfall würde ich gern jeweils 6 Tabellenblätter mit den Tabellen befüllen und das Makro dann die Sortierarbeit in das 7. Ziel-Tabellenblatt übernehmen lassen.

    Fragen: Ist das möglich, das als Makro zu programmieren? Wenn ja, wie gehe ich vor? Wie komme ich also zum Code, wie implementiere ich ihn? Und welche Parameter muss ich wie verändern, um den Code auf die andere Tabellenform abzuwandeln?

    Vielen Dank im Voraus, ich hoffe auf rasche und umfassende Hilfe. :)
    Ideen hätte ich genügend.
    Aber nicht die Zeit, dir eine Komplettlösung vorzukauen.
    Zumal sich mir die Sinnhaftigkeit deines Verfahrens nicht komplett erschließen will.

    Aber ich werfe mal einen Vorschlag in den Raum:
    Warum nicht die Dateien zeilenweise einlesen und dabei gleich in die Zielzellen schreiben?
    Wozu benötigst du die ersten 6 Sheets später?

    Ansatz: msdn.microsoft.com/en-us/library/h7se9d4f(v=vs.84).aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Sie direkt auszulesen, ist eine Idee, danke! Allerdings muss ich ohnehin immer erst mehrere Txt-Dateien öffnen und sichten, um heraus zu bekommen, ob es diejenigen sind, die ich aktuell brauche.

    Die Sheets brauche ich nicht mehr später. Wenn die Funktion das schaffen sollte, das fehlerfrei (sind ja eigentlich spaltenweise angelegte Txt-Dateien, falls das relevant ist) in Excel zu ziehen und am besten irgendwie hintereinander in die Zieldatei zu kopieren, würde mir das verdammt viel Arbeit ersparen.

    Ich habe das erste dann einfach in Excel importiert, weil ich gehofft habe, da eher auf "vertrautem Terrain" zu sein und letztlich ja eine Excel-Tabelle erstellen möchte. Auch kam ich schlichtweg nicht auf die Idee, dass etwas anderes möglich wäre. (Ich programmiere, wie man unschwer erkennen können dürfte, für gewöhnlich nicht: Nicht meine Welt.)

    Woher das Chaos kommt? - Ich habe die Daten selbst nicht erstellt. Mir wurde sehr viel Kram hingeworfen, mit dem ich erst einmal gar nichts anfangen konnte, rein inhaltlich war nur schwer ein System zu erkennen. Mein Job ist es nun, das alles auszuwerten; selbst verständlich habe ich eine Deadline, und selbstverständlich hängt für mich viel mit drin.

    Ich habe schlichtweg nicht die Zeit, mich endlos einzuarbeiten, obwohl ich zwischenzeitlich einige Tutorials und Kram gelesen habe. Es würde mir sonst auch Spaß machen, nicht in dieser Situation, weil es so vrdmmt lang dauert. :)

    Meine Erwartung sind keine kompletten Lösungen; wie ich gemerkt habe, geht das auch nicht mal eben so schnell. Und ich will meine Arbeit gern selbst machen. Hilfe zur Selbsthilfe ist ein netter Ansatz. Von daher sind derlei Links schon mal super.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „An Nie“ ()