Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1468to1472
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

Kopieren von einer Tabelle in eine Andere

Kopieren von einer Tabelle in eine Andere
12.01.2016 13:10:49
einer
Hallo,
ich habe mal wieder ein Problem. Ich habe in Excel ein Steuerungssheet, auf dem nur ein Button liegt um ein Makro auszuführen. Das Makro macht folgendes:
- es erstellt mir ein neues Sheet mit dem Aktuellen Datum
- es ruft einen Dialog auf um ein weiteres Workbook zu öffnen.
Jetzt möchte ich gerne dass alle Daten aus dem 2. geöffneten Workbook (nur ein Sheet) komplett mit Formatierungen in das (zuvor vom Makro) neu erstellte Sheet (in der Ausgangsdatei) kopieren.
Leider stelle ich mich dafür zu blöd an.
ich weiß, dass dass ich sowohl in der AUsgangsdatei, als auch in der zu kopierenden Datei die Sheets-Namen einer Variablen zuweisen muss. Aber ich bekomme es einfach nicht sauber hin und das mit dem Kopieren auch nicht.
Könnt ihr mir helfen?

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kopieren von einer Tabelle in eine Andere
12.01.2016 13:33:48
einer
Hallo Christian!
zB so, als Bsp:
Sub a()
Dim wbQuelle As Workbook
'anpassen
Const wbPfad As String = "\DeinPfad\DeineDatei.xlsx"
Const wsName As String = "Tabelle1"
Application.ScreenUpdating = False
With ThisWorkbook
Set wbQuelle = Workbooks.Open(Filename:=wbPfad)
ActiveWorkbook.Sheets(wsName).Copy After:=.Sheets(.Sheets.Count)
wbQuelle.Close savechanges:=True
.Sheets(.Sheets.Count).Activate
.Sheets(.Sheets.Count).Name = Date
End With
Application.ScreenUpdating = True
End Sub
Ansonsten müsstest Du uns Deine konkreten Verhältnisse aufzeigen (Blattnamen etc.).
Als Hinweis - Du musst nicht zunächst ein Blatt erstellen, wenn Du sowieso ein Blatt kopierst; durch das erstellen der Kopie entsteht ja bereits ein Blatt.
Passt?
LG
Michael

Anzeige
AW: Kopieren von einer Tabelle in eine Andere
12.01.2016 14:58:34
einer
Hallo,
Den Code bisher hab ich zum größten Teil mit Hilfe erstellt, angepasst. Ich bin noch stark am Lernen :).
Das ist der Code bisher. Du hast recht, das mit dem Einfügen des neuen Blattes kann ich mir klemmen. Aber es wäre in dem Zuge schön, wenn dass durchs Kopieren erstelle Blatt als Name das Erstelldatum der importierten Datei hätte.
Sub OP_Listen_Import()
On Error GoTo Fehler
Dim Vorgabe As String   ' Vorgabe für den Dateinamen zur Dateiauswahl
Dim Pfad As String  ' Vorgabe für den Pfad zur Dateiauswahl
Dim Dialog As FileDialog
Dim strDateiName1 As String
Application.ScreenUpdating = False
Vorgabe = "Liste"   ' Nur Dateien mit einem bestimmten Muster werden gelistet
Pfad = Environ("UserProfile") & "\Desktop\" ' Desktop als Anfangsverzeichnis
Set Dialog = Application.FileDialog(msoFileDialogFilePicker)    ' Dialog zur Dateiauswahl
With Dialog
.AllowMultiSelect = False
.InitialFileName = Pfad & "*" & Vorgabe & "*"
.InitialView = msoFileDialogViewDetails
.Title = "Datei auswählen"
End With
ActiveWorkbook.Worksheets.Add after:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets. _
Count) ' Neues Blatt mit aktuellem Datum einfügen
ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count).Name = VBA.Date
strDateiName1 = ActiveWorkbook.Name
If Dialog.Show = True Then
Workbooks.Open Filename:=Dialog.SelectedItems(1)    ' Dialog öffen um die zu  _
bearbeitende Datei auszuwählen
' >> hier den Importskript für den Import der gefilterten OP-Datei auf das neu erstellte  _
Arbeitsblatt
End If
Err.Clear
Fehler:
If Err.Number  0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub

Anzeige
AW: Ui, ui, ui...
12.01.2016 15:37:40
Michael
Christian,
Den Code bisher hab ich zum größten Teil mit Hilfe erstellt, angepasst. Ich bin noch stark am Lernen :).
Jeder fängt mal an; das ist nicht das Thema. Aber ich hab das Gefühl Du näherst Dich der Sache falsch an. Es ist schon mal Herausforderung genug _eigenen_ Code zu schreiben, geschweige denn _fremden_ Code zu lesen/interpretieren. Wenn Du einen erhaltenen Code abänderst, solltest Du zuerst versuchen, zu verstehen was da grds. passiert. Da ist's evtl. sinnvoller Dir mit ganz konkreten Fragen ganz konkret helfen zu lassen - und wenn Du mal die ersten Zusammenhänge verstanden hast (evtl. auch gelernt, nachgelesen... ) dann kannst Du Dich ja an eigene Umsetzungen wagen und ggf. Codes abändern.
Zu Deinem Problem, schau Dir das mal an: - Code ist kommentiert -
Sub b()
Dim DateiDialog As FileDialog
Dim wbPfad As String
Dim wbQuelle As Workbook
Const wsName As String = "Tabelle1"
Dim objDateiSystem As Object
Dim objDatei As Object
'Bildschirm-Aktualisierung ausschalten
Application.ScreenUpdating = False
Set objDateiSystem = CreateObject("Scripting.FileSystemObject")
Set DateiDialog = Application.FileDialog(msoFileDialogFilePicker)
'Dateiauswahl über Dialog...
With DateiDialog
.Title = "Bitte Quell-Arbeitsmappe wählen"
.AllowMultiSelect = False
If .Show  -1 Then
MsgBox "Vorgang abgebrochen", vbInformation
Exit Sub
Else: wbPfad = .SelectedItems(1)
End If
End With
'...mit dem entsprechenden Datei-Pfad
With ThisWorkbook
'...die Quell-Datei öffnen
Set wbQuelle = Workbooks.Open(Filename:=wbPfad)
'...Zugriff auf Datei über Datei-System für Erstelldatum
Set objDatei = objDateiSystem.getfile(wbQuelle.FullName)
'...das gewünschte Blatt in _diese_ Datei kopieren
'--> gesuchter Blattname im Quell-Blatt als Konstante definiert (s.o.)
ActiveWorkbook.Sheets(wsName).Copy after:=.Sheets(.Sheets.Count)
'...dem kopierten Blatt das Erstelldatum der Quell-Datei als Name übergeben
.Sheets(.Sheets.Count).Name = Left(objDatei.DateCreated, 10)
'...Quell-Datei schließen, Änderungen speichern
wbQuelle.Close savechanges:=True
End With
'Bildschirm-Aktualisierung einschalten
Application.ScreenUpdating = True
End Sub
Ok?
Michael

Anzeige
AW: Ui, ui, ui...
13.01.2016 07:41:10
Christian
Hallo Michael,
danke vorab für deine Hilfe. Du hast recht, genau so gehe ich vor. Wenn ich einen Code bekomme, versuche ich für mich zu interpretieren was genau an welcher Stelle gemacht wird. Die Kommentare im Code helfen dabei natürlich ungemein (macht aber glücklicherweise fast jeder hier :) ) Aber ich muss auch sagen, dass es ja immer 100 Wege gibt ein Problem/Fragestellung zu lösen. Und diese Tatsache macht es nicht einfacher. Jeder geht wieder etwas anders an die Lösung ran.
Zu deinem Code:
Es funktioniert soweit alles wie ich mir das vorgestellt habe. Danke auch für das Einbauen des Erstelldatums als Tabellenname. Ich habe da schon mehrere Varianten probiert, aber so richtig funktioniert hat nichts.
Warum verwendest du eine Konstante für den Tabellennamen der Importdatei? ich kann doch hier sicher auch eine variable nutzen, da der Tabellenname der Ursprungsdatei von einem Kollegen händisch gepflegt wird. Ich verlasse mich nicht drauf, dass der immer gleich ist :)
    Const wsName As String = "Tabelle1"
LG
Christian

Anzeige
AW: Fortgesetzt...
13.01.2016 10:12:02
Michael
Morgen Christian!
dass es ja immer 100 Wege gibt ein Problem/Fragestellung zu lösen. Und diese Tatsache macht es nicht einfacher. Jeder geht wieder etwas anders an die Lösung ran.
Da hast Du Recht; und nix für ungut - ich wollte Dich nicht belehren, war nur gestern mein Eindruck.
Es funktioniert soweit alles wie ich mir das vorgestellt habe.
Das freut mich.
Warum verwendest du eine Konstante für den Tabellennamen der Importdatei? ich kann doch hier sicher auch eine variable nutzen
Ja, eine Variable ist auch möglich; die Frage ist hier aber, ob Dir die mehr hilft. Ich hab jetzt mal auf eine Konstante gesetzt, weil dadurch der Code etwas bequemer anzupassen ist, und es wird sofort im Prozedurkopf klar, dass im folgenden Code immer auf einen bestimmten Blattnamen zugegriffen wird. Wenn bspw. das Quell-Tabellenblatt bisher immer "Tabelle1" hieß, aber dann einigt Ihr Euch auf "Quelle" - so musst Du im Code nicht lange suche, sondern änderst nur den Wert der Konstanten und fertig.
Genauso könnten wir ja auch sagen, wir verwenden keine Konstante für den Blatt-Namen sondern für die Blatt-Indexnummer. Da wär's zB egal, wie das Blatt heißt, wenn nur seine Position in der Mappe immer gleich bleibt; also sinngemäß

Const wsNummer as Byte = 1
ActiveWorkbook.Sheets(wsNummer).Copy after:=.Sheets(.Sheets.Count)
Du sagst aber richtigerweise
Ich verlasse mich nicht drauf, dass der immer gleich ist :)
Sowohl Blatt-Name als auch Position (also Index-Nummer) können sich schnell ändern; ob das auch auf die Blattposition zutrifft musst Du bei Deinen Gegebenheiten (und Kollegen) beurteilen. Aber es bleibt Dir noch die Alternative den Codenamen des gewünschten Tabellenblattes in der Quell-Datei zu nutzen - also den Objekt-Namen des Tabellenblattes in VBA zu ändern:
Userbild
Dann ist sowohl die Position des Blattes als auch der angezeigte Blattname egal, und Du beziehst Dich im Code auf den Codenamen; den Codenamen zu nutzen geht aber nur innerhalb einer Mappe ohne Umwege, bei zwei Mappen dann zB so:
Sub b()
Dim DateiDialog As FileDialog
Dim wbPfad As String
Dim wbQuelle As Workbook
Dim wsQuellBlatt As Worksheet
Dim objDateiSystem As Object
Dim objDatei As Object
'Bildschirm-Aktualisierung ausschalten
Application.ScreenUpdating = False
Set objDateiSystem = CreateObject("Scripting.FileSystemObject")
Set DateiDialog = Application.FileDialog(msoFileDialogFilePicker)
'Dateiauswahl über Dialog...
With DateiDialog
.Title = "Bitte Quell-Arbeitsmappe wählen"
.AllowMultiSelect = False
If .Show  -1 Then
MsgBox "Vorgang abgebrochen", vbInformation
Exit Sub
Else: wbPfad = .SelectedItems(1)
End If
End With
'...mit dem entsprechenden Datei-Pfad
With ThisWorkbook
'...die Quell-Datei öffnen
Set wbQuelle = Workbooks.Open(Filename:=wbPfad)
'...Zugriff auf Datei über Datei-System für Erstelldatum
Set objDatei = objDateiSystem.getfile(wbQuelle.FullName)
'...das Quell-Blatt über den Code-Namen definieren...
Set wsQuellBlatt = BlattCodeHolen(ActiveWorkbook, "Vorlage")
'...und in diese Mappe ans Ende kopieren
wsQuellBlatt.Copy after:=.Sheets(.Sheets.Count)
'...dem kopierten Blatt das Erstelldatum der Quell-Datei als Name übergeben
.Sheets(.Sheets.Count).Name = Left(objDatei.DateCreated, 10)
'...Quell-Datei schließen, Änderungen speichern
wbQuelle.Close savechanges:=True
End With
'Bildschirm-Aktualisierung einschalten
Application.ScreenUpdating = True
End Sub
Function BlattCodeHolen(wb As Workbook, BlattCode As String) As Worksheet
' Funktion benötigt um zwischen zwei Mappen auf den Blatt-CodeNamen
' referenzieren zu können
Dim ws As Worksheet
'Blätter in Ziel-Mappe durchgehen...
For Each ws In wb.Worksheets
'Und Blatt-Namen auslesen wenn
'Code-Name übereinstimmt
If ws.CodeName = BlattCode Then
Set BlattCodeHolen = ws
Exit For
End If
Next
End Function
In diesem Code gehe ich jetzt davon aus, dass das Quell-Blatt im CodeNamen "Vorlage" getauft wird.
Passt?
LG
Michael

Anzeige
AW: Fortgesetzt...
13.01.2016 11:20:42
Christian
Hallo Michael,
Da hast Du Recht; und nix für ungut - ich wollte Dich nicht belehren, war nur gestern mein Eindruck.
Alles gut, ich hab es nicht negativ aufgefasst. Du hast ja Recht :).
Ich hab es jetzt so übernommen, dass in der Quelldatei immer nur ein Arbeitsblatt enthalten ist. Das lässt sich auch so umsetzen.
Nochmal vielen Dank für deine Kompetente Hilfe!!!

AW: Gerne, Danke für die Rückmeldung! Und zu owt
13.01.2016 12:24:53
Michael

AW: Gerne, Danke für die Rückmeldung! Und zu owt
13.01.2016 12:33:46
Christian
Sag mal kannst du mir noch eine Zeile einbauen, um in der importierten Tabelle die Spalte B und D zu löschen? Ich hab es mit
Range(Columns(2),Columns(Columns.Count)).delete
Range(Columns(4),Columns(Columns.Count)).delete
und mit
ActiveSheet.Columns(2).Delete
ActiveSheet.Columns(4).Delete
probiert, am Ende des Codes. Aber es werden immer auf dem ersten Tabellenblatt (von wo aus ich das Makro per Button aufrufe) die Spalten gelöscht.

Anzeige
AW: Klar, so...
13.01.2016 12:51:38
Michael
Christian,
.ActiveSheet.Columns("B:B").Delete

aber
.ActiveSheet.Columns(2).Delete

würde genauso funktionieren.
im Code (beziehe mich auf den ersten von mir geposteten Code, ohne Zugriff auf Blatt-Codenamen):
Sub b()
Dim DateiDialog As FileDialog
Dim wbPfad As String
Dim wbQuelle As Workbook
Const wsName As String = "Tabelle1"
Dim objDateiSystem As Object
Dim objDatei As Object
'Bildschirm-Aktualisierung ausschalten
Application.ScreenUpdating = False
Set objDateiSystem = CreateObject("Scripting.FileSystemObject")
Set DateiDialog = Application.FileDialog(msoFileDialogFilePicker)
'Dateiauswahl über Dialog...
With DateiDialog
.Title = "Bitte Quell-Arbeitsmappe wählen"
.AllowMultiSelect = False
If .Show  -1 Then
MsgBox "Vorgang abgebrochen", vbInformation
Exit Sub
Else: wbPfad = .SelectedItems(1)
End If
End With
'...mit dem entsprechenden Datei-Pfad
With ThisWorkbook
'...die Quell-Datei öffnen
Set wbQuelle = Workbooks.Open(Filename:=wbPfad)
'...Zugriff auf Datei über Datei-System für Erstelldatum
Set objDatei = objDateiSystem.getfile(wbQuelle.FullName)
'...das gewünschte Blatt in _diese_ Datei kopieren
'--> gesuchter Blattname im Quell-Blatt als Konstante definiert (s.o.)
ActiveWorkbook.Sheets(wsName).Copy after:=.Sheets(.Sheets.Count)
'...dem kopierten Blatt das Erstelldatum der Quell-Datei als Name übergeben
.Sheets(.Sheets.Count).Name = Left(objDatei.DateCreated, 10)
'...Spalten B, D im kopierten Blatt löschen
.ActiveSheet.Columns("B:B").Delete
.ActiveSheet.Columns("D:D").Delete
'...Quell-Datei schließen, Änderungen speichern
wbQuelle.Close savechanges:=True
End With
'Bildschirm-Aktualisierung einschalten
Application.ScreenUpdating = True
End Sub
Der "." (Punkt) vor dem ActiveSheet ist nicht zufällig da ;-), eingebettet in With-Anweisung. Aber das kannst Du ja evtl. mal recherchieren? ;-)
Passt?
LG
Michael

Anzeige
AW: Klar, so...
13.01.2016 13:04:56
Christian
manchmal kann es so einfach sein (mit dem ".")
aber es funktioniert noch nicht so ganz.
es wird erst die 1. Codezeile abgearbeitet
.ActiveSheet.Columns("B:B").Delete

das ist richtig. Jetzt verschiebt sich aber Spalte D (die weg soll) auf Spalte C
Gibt es da nicht eine Möglichkeit mehrere Spalten direkt über eine Codezeile anzusprechen?

AW: Klar, so...
13.01.2016 13:11:32
Daniel
Hi
Range("B:B,D:D").Delete
Gruß Daniel

AW: 4 Augen sehen mehr, oder so ;-) owT
13.01.2016 13:13:33
Michael

AW: Ups, da war ich schlampig...
13.01.2016 13:12:24
Michael
Christian,
...sorry! Du hast Recht, die Löschung müsste "von hinten" erfolgen, also

.ActiveSheet.Columns("D:D").Delete
.ActiveSheet.Columns("B:B").Delete
aber natürlich lässt sich das in einem Rutsch machen (ich war nur nicht super konzentriert vorher):
.ActiveSheet.Range("B:B, D:D").Delete
Aber jetzt ;-)
LG
Michael

Anzeige
AW: Ups, da war ich schlampig...
13.01.2016 13:16:21
Christian
och Mensch, du warst schneller :). Mir ist es gerade selber aufgefallen, dass ich nur die Reihenfolge der Abarbeitung ändern muss.
wobei das mit der Range schicker ist.
Jatzt haben wir es dann aber.
Also nochmals vielen lieben Dank!!!

AW: Kein Thema! Gern, lg und owt
13.01.2016 13:23:03
Michael

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige