Anzeige
Archiv - Navigation
1576to1580
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - Wert in neue Excel schreiben

VBA - Wert in neue Excel schreiben
06.09.2017 13:55:44
Alexander
Hallo zusammen,
ich habe einen Ordner mit Excel-Dateien, in denen eine jeweils eine Tabelle (Spaltenzahl immer gleich) ist. Diese vielen Tabellen möchte ich einer neuen Excel in eine große Tabelle schreiben. Die große Tabelle soll sich automatisch aktualisieren sobald eine neue Excel-Tabelle in den Ordner eingefügt wird. Die Werte sollen ab Zeile 2 aus den kleinen Tabellen ausgelesen und in der großen Tabelle in die nächste freie Zeile geschrieben werden.
Nehmen wir an die Excel-Dateien mit den kleinen Tabellen befinden sind im Ordner C:\abc\def\ghi und die neue Tabelle ist in C:\abc\def und heißt Uebersicht.xlsx
Da ich keinerlei Erfahrung in VBA-Programmierung wäre ich Euch sehr dankbar, wenn ich mir weiterhelfen könnt.
Gruß

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Wert in neue Excel schreiben
07.09.2017 10:23:59
Michael
Hallo!
Da ich keinerlei Erfahrung in VBA-Programmierung wäre ich Euch sehr dankbar, wenn ich mir weiterhelfen könnt.
Du meinst damit sicher: Kann mir bitte jemand so etwas fertig programmiert liefern? Dann schreib das auch ;-).
Ist prinzipiell machbar, es gilt aber einiges zu beachten:
jeweils eine Tabelle (Spaltenzahl immer gleich) ist
Ab Zeile 2 sollen die Daten übertragen werden, wenn die Spalten aber auch klar sind, wäre es eine nette Info, wo die Daten stehen. Also zB A1:Lx (x = zB letzte befüllte Zelle/Zeile in A) - wieviele Zeilen der Bereich dann umfasst, ist egal (siehe Berechnung von "x); interessant ist dann nur noch, nach welcher Spalte sich das Zeilen-Ende der Tabelle berechnen soll.
in eine große Tabelle schreiben
Du willst die Daten der Quell-Tabellen ja untereinander auf einem Blatt in der Ziel-Tabelle. Was soll passieren, wenn Daten eingefügt werden sollen, die maximale Zeilenanzahl in der Ziel-Tabelle damit aber überschritten wird? Sollen die Daten abgeschnitten werden, kann ein neues Tabellenblatt eröffnet werden,...?
sich automatisch aktualisieren sobald eine neue Excel-Tabelle in den Ordner eingefügt wird
Automatisch ginge nur in dem Sinn, dass die Ziel-Datei beim Öffnen prüft, ob neue Dateien im Quell-Pfad vorhanden sind. Dafür müsste aber in der Ziel-Datei, zB auf einem eigenen Blatt, ein Liste geführt werden, welche Dateien schon importiert wurden, um entsprechend abzugleichen, ob neue Dateien hinzugekommen sind. Außerdem bedeutet das, dass sichergestellt sein muss, dass die Dateien im Quell-Pfad niemals umbenannt werden - andernfalls würden sie mehrfach importiert (da ja nur der ursprüngiche Name in der Dateiliste vorkommt!). D.h. die Ziel-Datei muss in jedem Fall zumindest geöffnet werden für den Import-Vorgang, "automatisch" im Sinne von völlig selbständig, ohne User-Interkation, ist nicht möglich.
LG
Michael
Anzeige
AW: VBA - Wert in neue Excel schreiben
11.09.2017 08:45:21
Alexander
Hallo Michael,
danke erstmal für deine Hinweise.
Der Wertebereich der ausgelesen werden soll ist momentan A2:ANx (x letzte befüllte Zelle in A), wobei ich AN als Variable deklarieren würde.
Was passieren soll, wenn die maximale Zeilenanzahl erreicht ist, braucht nicht betrachtet zu werden. So weit ich weiß liegt das Maximum für Ecxel 2010 bei 2^20 Zeilen. So viele werden es nie werden.
Zu deinem letzten Absatz: Wie du schon vorgeschlagen hast, soll die Ziel-Datei beim Öffnen überprüfen, ob neue Dateien im Quellpfad sind. Probleme wie doppelte oder sich ändernde Dateinamen können ignoriert werden.
Gruß
Anzeige
AW: VBA - Wert in neue Excel schreiben
11.09.2017 12:01:32
Michael
Alex,
...folgende Datei: https://www.herber.de/bbs/user/116151.xlsm
In der Mappe habe ich den Teil, der beim Öffnen der Mappe aktiv wird, noch auskommentiert - das Makro im allgemeinen Modul1 kannst Du dann dennoch manuell auslösen um zu testen; wenn alles nach Wunsch läuft, bitte das Ereignis-Makro "WorkbookOpen" aktiv setzen.
Diese Mappe kannst Du umbenennen, ist unerheblich, allerdings gehe ich gem. Deiner Angaben davon aus, dass diese Mappe NICHT im gleichen Verzeichnis liegt, wo die Import-Dateien liegen.
Die Daten werden ins Blatt "Import" fortlaufend übernommen, im Blatt "Dateiliste" werden die Dateinamen der importierten Dateien gesammelt.
Nach Makroduchlauf per Ereignis "WorkbookOpen" wirst Du informiert, aus wievielen Dateien Daten importiert wurden (nicht beim manuellen Auslösen).
Im Funktionsmakro "ImportAusVerzeichis" kannst Du zentral definieren, ab wo der zu kopierende Zellbereich beginnt (aktuell "A2") und bis zu welcher Spalte (aktuell "AN") - das Zeilenende wird jeweils mit der letzten befüllten Zelle aus Spalte "A" berechnet.
Übernommen werden die Zellwerte und Zahlenformate - falls Du da auch andere Formatierungen übernehmen willst, müsste man das ändern.
Die Datei wird aktuell NICHT automatisch gespeichert nach den Importvorgängen; das könnte noch geändert werden, falls erforderlich (und ggf. auch autom. geschlossen werden).
Hier noch die Codes:
Code für das Arbeitsmappen-Modul (DieseArbeitsmappe):
Private Sub Workbook_Open()
ImportCounter = 0
Call ImportAusVerzeichnis
MsgBox "Datei-Import abgeschlossen. Es wurden Daten aus " & _
ImportCounter & " Dateien übernommen.", vbInformation, "AutoImport"
End Sub
Code für ein allgemeines Modul (zB Modul1):
Public ImportCounter As Long
Sub ImportAusVerzeichnis()
Const HAUPTPFAD$ = "C:\abc\def\ghi" 'anpassen, wo liegen die Import-Dateien
Const STARTZELLE = "A2" 'anpassen, wo beginnt der Import-Bereich
Const LETZTESPALTE = "AN" 'anpassen, in welche Spalte reicht der Import-Bereich
Dim WbZ As Workbook: Set WbZ = ThisWorkbook
Dim WsZ As Worksheet: Set WsZ = WbZ.Worksheets("Import")
Dim WsI As Worksheet: Set WsI = WbZ.Worksheets("Dateiliste")
Dim WbQ As Workbook, WsQ As Worksheet
Dim Pfad$, ImportDateien As Object, Datei$, D As Range, Z&
Application.ScreenUpdating = False
Set ImportDateien = CreateObject("Scripting.Dictionary")
With WsI
If .Cells(.Rows.Count, "A").End(xlUp).Row > 2 Then
For Each D In .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp))
ImportDateien.Add D, ""
Next D
End If
End With
Pfad = IIf(Right(HAUPTPFAD, 1) = "\", HAUPTPFAD, HAUPTPFAD & "\")
Datei = Dir(Pfad & "*.xls*", vbDirectory)
Do Until Datei = ""
If Not ImportDateien.exists(Datei) Then
ImportCounter = ImportCounter + 1
WsI.Cells(WsI.Rows.Count, "A").End(xlUp).Offset(1, 0) = Datei
Set WbQ = Workbooks.Open(Pfad & Datei)
With WbQ
Set WsQ = .Worksheets(1)
With WsQ
Z = .Cells(.Rows.Count, "A").End(xlUp).Row
.Range(STARTZELLE & ":" & LETZTESPALTE & Z).Copy
End With
WsZ.Cells(WsZ.Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial _
xlPasteValuesAndNumberFormats
.Close False
End With
Set WsQ = Nothing: Set WbQ = Nothing
End If
Datei = Dir
Loop
Set WbZ = Nothing: Set WsZ = Nothing: Set WsI = Nothing
ImportDateien.RemoveAll: Set ImportDateien = Nothing
Set D = Nothing
End Sub
Gib Bescheid!
LG
Michael
Anzeige
AW: VBA - Wert in neue Excel schreiben
11.09.2017 14:00:36
Alexander
Hallo Michael,
vielen Dank erstmal. Jedoch vermute ich, dass dir irgendwo ein kleiner Fehler unterlaufen ist.
Das Programm schreibt jetzt aus jeder Quell-Datei den Tabellenkopf in die Ziel-Datei. Dieser soll ja übersprungen werden (deswegen Beginn ab Zeile 2). Bei der allerletzten Zeile tut das Programm das richtige (siehe Bildausschnitt).
Userbild
Gruß
Kann ich so nicht ganz nachvollziehen...
11.09.2017 14:50:17
Michael
mein Lieber!
Der zu kopierende Bereich wird in meinem Code so bestimmt: A2:ANx, wobei x die Zeilennummer der letzten gefüllten Zelle aus A:A ist; ich bin davon ausgegangen, dass Deine Überschriften in Zeile 1 stehen. Oder beginnen Deine Tabellen generell erst ab Zeile 2, sodass A2:AN2 die Überschriftenzeile ist? Kann es vorkommen, dass nur eine Datenzeile vorhanden ist? Oder auch gar keine (also nur Überschrift)?
Du hast außerdem angegeben, dass Deine Quell-Dateien immer gleich aufgebaut sind - das scheint mir gemäß Deiner Fehlerbeschreibung nicht so (das Makro übernimmt nicht zufällig eine andere Zeile, sondern je Quell-Datei immer den Bereich A2:ANx, wobei das x natürlich variabel sein kann).
LG
Michael
Anzeige
AW: Kann ich so nicht ganz nachvollziehen...
11.09.2017 15:07:54
Alexander
Hallo Michael,
der Tabellenkopf meiner Tabellen ist immer in Zeile 1. Die Daten beginnen immer ab Zeile 2. Also der Tabellenaufbau ist immer gleich. Es gibt immer mindestens eine Zeile mit Daten. Es kommt auch oft vor, dass es nur eine Datenzeile gibt. Könnte das das Problem sein?
Gruß
Dann kann ich es umso weniger nachvollziehen...
11.09.2017 15:35:14
Michael
Alex!
der Tabellenkopf meiner Tabellen ist immer in Zeile 1. Die Daten beginnen immer ab Zeile 2
Aber genau darauf nimmt mein Makro Bezug; die Startzelle ist "A2", sofern Du im Code nichts Gegenteiliges spezifiziert hast.
nur eine Datenzeile stellt kein Problem dar, denn dann wäre Ax eben Zeile zwei, d.h. der kopierte Bereich A2:AN2.
Da kann ich mit den bisherigen Informationen nicht helfen...
LG
Michael
Anzeige
AW: Dann kann ich es umso weniger nachvollziehen...
11.09.2017 15:52:39
Alexander
Michael,
ich kann es mir leider auch nicht erklären. Im Programm habe ich nichts geändert. Könntest du vielleicht deinen Code noch etwas kommentieren, da mir die VBA-Syntax nicht geläufig ist. Vielleicht kann ich die Lösung dann finden.
Gruß
AW: Meine Datei kommentiert...
12.09.2017 08:34:13
Alexander
Hallo Michael,
okay, dein Programm läuft einwandfrei. Es liegt irgendwie an meinen Tabellen. Habe jetzt manuell Tabellen erstellt und mit beliebigen Zahlenwerten gefüllt und es funktioniert. Danke dir nochmal.
Anzeige
Ok! Danke für die Rückmeldung und falls...
12.09.2017 09:47:14
Michael
Hallo Alex,
...Du noch Hilfe brauchst, müsste ich zumindest irgendeine der Quelldateien (anonymisiert) sehen, sonst kann ich da nicht viel machen.
Aber es ist natürlich schön, wenn der Code an sich funktioniert ;-).
Viel Erfolg noch,
LG
Michael
AW: Ok! Danke für die Rückmeldung und falls...
12.09.2017 11:16:30
Alexander
Hallo Michael,
Das Erstellen der Tabelle läuft schon mal :)
Jedoch scheint der Teil nicht zu funktionieren, in dem der Code abfragt, ob die Datei schon in der Dateiliste vorhanden ist. Wenn ich die Ziel-Tabelle wieder öffne und schließe schreibt er die alle Quell-Dateien nochmals in die Tabelle und in die Dateiliste. Hast du eine Idee?
Gruß
Anzeige
AW: Ok! Danke für die Rückmeldung und falls...
12.09.2017 11:18:05
Alexander
Edit: "Wenn ich die Ziel-Tabelle wieder schließe und öffne" muss es natürlich heißen
Kleiner Fehler meinerseits,
12.09.2017 12:34:02
Michael
Alex,
...ich hab schlampig geschrieben. Damit das mit der Dateiliste klappt, muss im Code diese Stelle

For Each D In .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp))
    ImportDateien.Add D, ""
Next D
'...
so angepasst werden

For Each D In .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp))
ImportDateien.Add D.Text, ""
Next D
'...
LG
Michael
AW: Kleiner Fehler meinerseits,
12.09.2017 13:58:19
Alexander
Hallo Michael,
es läuft, danke nochmal für die Mühe.
Anzeige
Na super, Danke für die Rückmeldung, owT
12.09.2017 14:37:24
Michael
AW: Na super, Danke für die Rückmeldung, owT
13.09.2017 10:23:10
Alexander
Hallo Michael,
ich bin's nochmal. Kannst du den Code noch erweitern, dass alle Unterordner im Pfad C:\abc\def\ghi durchsucht werden. Jetzt wird ja nur der Ordner C:\abc\def\ghi durchsucht. Hatte mich da nicht klar ausgedrückt.
Gruß
AW: Na super, Danke für die Rückmeldung, owT
14.09.2017 08:48:08
Alexander
Hallo Michael,
ich vermute mal, dass du meinen Beitrag gestern nicht gelesen hast. Deswegen schreibe ich nochmal. Kannst du den Code noch so erweitern, wie ich es beschrieben habe?
Gruß

312 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige