gimli3311
Goto Top

Variable Tabelle kopieren und in neue Excel-Datei verschieben

Guten Zusammen,

ich bin grad Praktikant bei einem Unternehmen und muss aus verschiedenen Excel Dateien die jeweils eine Tabelle haben eine groß Datei machen.
Eine Datei ist Folgendermaßen aufgebaut es ist eine Art Logbuch das bei Zelle A29 anfängt und N29 endet. Nach unten hin ist sie Variable je nachdem wie viel Einträge vorhanden sind.
Nun muss ich alle Dateien durchsuchen die Tabellen kopieren und in eine neue Datei schreiben.

Meine Probleme sind:
- Ich kann einen Wertebereich definieren aber nur einen festen. Wie kann ich es so programmieren das es variabel ist und den Wertebereich so setzt das es erkennt hier kommt nichts mehr?
- Wenn ich den Wertebereich habe, kann ich ihn zwar kopieren aber nur in der Excel-Datei, heißt wenn ich es in eine neue Datei kopieren will funktioniert es nicht.

Wäre schön wenn Ihr mir weiterhelfen könntet. Bin was VBA angeht Neuling.

Gruß Gimli3311

Content-ID: 263949

Url: https://administrator.de/contentid/263949

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

a47ae-ro
a47ae-ro 19.02.2015 aktualisiert um 12:39:10 Uhr
Goto Top
Hallo, leider habe ich nicht so ganz verstanden, wo jetzt das Problem ist.
Wenn du einen variablen Bereich hast kannst du die Daten als Tabelle formatieren und dieser einen Namen geben (z.B. Log1) und mit diesem Namen dann alle Daten, welche in der Tabelle liegen ansprechen.

Wenn du diese Daten jetzt in einem anderen Dokument verknüpfen möchtest, sollte dir hier geholfen werden.
https://support.office.com/de-AT/article/eine-Beziehung-zwischen-zwei-Ta ...
Ich hoffe ich konnte dir etwas weiterhelfen!
Mit freundlichen Grüßen,
Robin
Gimli3311
Gimli3311 19.02.2015 aktualisiert um 13:33:07 Uhr
Goto Top
Hallo a47ae-ro,

erstmals Danke für deine schnell Antwort face-smile

Zu meinem Ersten Problem das die Tabellen unterschiedlich lang sind muss ich doch dann bei jeder Excel-Datei die Tabelle formatieren und einen Namen geben oder? Da sehe ich das Problem das es über 500 verschiedene Excel-Dateien sind.

Danke für den Link, hab mich da mal reingelesen aber dort steht das es den s-verweis ersetz und nur möglich ist zwischen zwei Tabellen in der gleichen Datei und nicht von Datei zu Datei.
Als Beispiel: Datei 1. Logbuch Tabelle
Datei 2. Logbuch Tabelle
Datei 3. soll die Logbuch Tabellen von 1 und 2 kopiert bekommen.

Ich hoffe es ist bisschen verständlicher geworden.
Freue mich auf jede Hilfe und jeden Link.

Gruß Gimli3311

EDIT:

Hier mal das Vorhaben das ich habe:
Sub Tabelle_kopieren()
' 
' Tabelle_kopieren Makro 
' 
'Dateien müssen beide offen sein 
' 
    'Datei ausgewählt. Zukunft --> Durch Variable angegeben 
    Windows("IT37660_Logbuch.xlsx").Activate 
    'Den zu makierten bereich selektiert. Zukunft --> Wertebereich automatisch defninieren 
    Range("A29:N31").Select 
    'Bereich kopiert 
    Selection.Copy
    'Allgmeine Logbuch ausgewählt 
    Windows("Allg_Logbuch.xlsx").Activate 
    'Die Zelle ausgewählt in den die Kopier kopiert werden soll. Zukunft --> Schauen wo die nächste Zeile ist 
    Range("A32").Select 
    'Kopie eingefügt 
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    
End Sub
goldfisch
Lösung goldfisch 19.02.2015 aktualisiert um 16:39:36 Uhr
Goto Top
hallo,

das läuft in etwa so, wie Du es auch in Excel selbst machen würdest:
- Mappe öffnen
- das richtige Blatt auswählen
- in Spalte A ganz nach unten springen - auf [A65535]
- mit Ctlr-Cursor_hoch auf die letzte gefüllte Zelle springen

In VBA geht das so:
- Mappe öffnen
- das richtige Blatt auswählen
With worksheets("Bla")... End With)
- letzte gefüllte Zeile bestimmen:
maxrow = Range(Cells(1, 1), Cells(1, Rows.count).End(xlUp).row
Rows.count ist soweit ich weiß immer 65535, besser, man verwendet keine Konstante.
Hier wird die letzte Zelle in Spalte A bestimmt. Wenn das unsicher ist, ob die gefüllt ist, dann nimm eine andere Spalte.
So bestimmst Du den Bereich, der zu kopieren ist.

Dann kopierst Du den Inhalt, am besten auf eine VBA-Variable und nicht in die Zwischenablage, so etwa:
- DIM tab as Variant
   tab = range("A29:N" & maxrow).value
- zur Gesamtmappe wechseln und dort hineinkopieren, etwa
workbooks("Gesamt").worksheets(1).[A500].value = tab

Du kannst Dir ja merken, wo die nächste freie Zeile in der Gesamttabelle ist.

HTH,

goldfisch
114757
Lösung 114757 19.02.2015, aktualisiert am 20.02.2015 um 09:10:37 Uhr
Goto Top
Moin zusammen,
das ist schnell zusammengeschrotet face-wink. Guckst du hier:
(In Zeile 4 einfach den Pfad zu den *.xlsx Dateien angeben und freuen. Die Daten werden im aktuellen Sheet untereinander zusammengefasst. Der Rest ist im Code kommentiert)
Sub ImportTables()
    Dim wb As Workbook, fso As Object, rngOut As Range, f As String
    'Pfad in dem die *.xlsx Dateien liegen  
    Const PATHFILES = "D:\daten"  
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    With ActiveSheet
        'erste Ausgabezelle festlegen  
        Set rngOut = .Range("A1")  
        'hole die erste *.xlsx-Datei des Ordners  
        f = Dir(PATHFILES & "\*.xlsx")  
        'Loope solange bis alle Dateien verarbeitet wurden  
        Do While f <> ""  
            'öffne Datei  
            Set wb = Workbooks.Open(PATHFILES & "\" & f, ReadOnly:=True)  
            'kopiere den Inhalt der Tabelle in das aktuelle Sheet  
            With wb.Sheets(1)
                .Range("A29:N" & .Cells(Rows.Count, 1).End(xlUp).Row).Copy rngOut  
            End With
            'schließe Dokument wieder  
            wb.Close False
            'Ausgabezelle für den nächsenm Import ermitteln  
            Set rngOut = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            'hole Namen der nächsten Datei  
            f = Dir
        Loop
    End With
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
Gruß jodel32
Gimli3311
Gimli3311 19.02.2015 um 15:36:39 Uhr
Goto Top
Vielen Dank Ihr zwei =)

Jodel32 dein Code funktioniert perfekt hast mir super weitergeholfen face-smile
Es macht genau das was es soll =)

Ich werde mich aber spätestens morgen wieder melden da ich mir sicher bin das ich noch einige Sachen nicht hinbekomme.
Wills aber erst mal selber versuchen, bevor ich euch um Rat bitte face-smile