505 Aufrufe
Gefragt in Tabellenkalkulation von
Hallo VBA Profis,
ich habe ein Makro aufgezeichnet und es funktioniert auch.
Kurz gefasst: eine andere Datei im Laufwerk wird geöffnet, eine
Range von ca. 2.000 Zeilen kopiert, in der Datei wo das Makro
aufgerufen wurde eingefügt und zuletzt die andere Datei geschlossen.
So sieht das Makro aus:

Sub Copy()
'
' Copy Makro
'

Workbooks.Open Filename:= _
"\.....Tabelle1.xlsx"
Range("A2").Select
Range("A2:J2000").Select
Selection.Copy
Windows("File22.xlsm"). _
Activate
ActiveSheet.Paste
Windows("File1.xlsx").Activate
ActiveWindow.Close

End Sub

Folgendes möchte ich im Makro hinzufügen, komme leider nicht
weiter:
In der Datei "File22" Tab "Ansicht" Zelle "H5" Wert entnehmen (z.B.
0005). Wenn "File1.xlsx" vom Makro geöffnet wird, muss das
Tabellenblatt "0005" öffnen und die Daten Aus A2:J2000 kopieren und
in der Datei "Tabellen1.xlsx" einfügen.

Ich hoffe, ihr habt mein Anliegen verstanden, andernfalls bitte ich um
eine kurze Rückmeldung.

Vielen Danke

Beste Grüße
Max

8 Antworten

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Max,

mit deinem vorhandenen Makro kopierst du einen Zellbereich aus der Arbeitsmappe Tabelle1.xlsx in das aktive Blatt einer Arbeitsmappe.

Dann willst du noch aus der Datei File1.xlsx einen Wert entnehmen. Aber wo soll dieser hinkopiert werden?
Und sollen die Daten aus File1.xlsx an ggf. vorhandene Daten in der Datei Tabelle1.xlsx angefügt werden oder sollen diese überschrieben werden. Und gibt es in der Arbeitsmappe Tabelle1.xlsx nur ein Arbeitsblatt oder mehrere? Und falls es mehrere gibt, in welches Arbeitsblatt sollen die Daten eingefügt werden. Und in welchen Verzeichnis(sen) liegen die Dateien? Alle in einem Verzeichnis (in der auch die Zieldatei gespeichert ist) oder in verschiedenen?

Bitte erkläre mal was wohin kopiert werden soll und wo die einzelnen Dateien liegen.

Gruß

M.O.
0 Punkte
Beantwortet von
Hi M.O.
Dank Dir habe ich in der Vergangenheit viele Excel-Makro Probleme
gelöst :-)
Ich habe das Code übernommen und anschließend etwas verändert
und dabei einen kleinen Fehler gemacht :-(

Das Makro wird in der Datei „File22.xlsm“, Tabellenblatt „PL“ gestartet.
Mit der Ausführung dieses Makros wird eine andere Datei mit dem
Namen „Tabelle1.xlsx“ geöffnet. Jetzt werden die Daten aus dieser
Datei der Range A2:J2000 kopiert und in der Datei „File22.xlsm“,
Tabellenblatt „PL“ eingefügt.

Nein, die Daten werden nicht überschrieben.

In der Datei „Tabelle1.xlsx“ gibt es mehrere Tabellenblätter. Es sollen
ca. 40-50 Stück werden.
Aus diesem Grund soll das Makro erweitert werden und zwar wie folgt:

In der Datei „File22.xlsm“ soll auf das Tabellenblatt „Ansicht“ in der
Zelle „H5“ den Wert übernommen werden. Beispiel „0005“. Einer der
40-50 Tabellenblätter wurde mit dem Namen „0005“ definiert. In die
Datei „File22.xlsm“, Tabellenblatt „PL“ sollen die Werte hinzugefügt
werden.
Beide Dateien befinden sich in unterschiedlichen Verzeichnissen.
Die Datei Tabelle1.xlsx befindet sich im Verzeichnis:
\\A\Bali\Con\FI\01 Tax\05_ Acct\06_Rep (ME)\04_Rev\Temp

Die Datei File22.xlsm befindet sich im Verzeichnis:
\\A\Bali\Con\FI\01 Tax\05_ Acct\06_Rep (ME)\04_Rev\Januar

Im nächsten Monat wird diese Datei in einem neuen Order angelegt,
und zwar in:
\\A\Bali\Con\FI\01 Tax\05_ Acct\06_Rep (ME)\04_Rev\Februar.

Und so weiter …..

Hier der korrigierte Quelltext:
Sub Copy()
'
' Copy Makro
'

Workbooks.Open Filename:= _
"\.....Tabelle1.xlsx"
Range("A2").Select
Range("A2:J2000").Select
Selection.Copy
Windows("File22.xlsm"). _
Activate
ActiveSheet.Paste
Windows("Tabelle1.xlsx").Activate
ActiveWindow.Close

End Sub

Bitte einfach erneut melden, wenn noch etwas unklar ist.

Vielen Dank

Gruß
Max
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Max,

anbei die nächste Problemlösung ;-).

Schau mal, ob ich dich richtig verstanden habe:
Sub kopieren()

Dim lngLetzte As Long
Dim strBlatt As String
Dim wkbQuelle As Workbook
Dim bExists As Boolean
Dim bExists2 As Boolean
Dim oWorkbook As Object
Dim i As Long

'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False

'Name des Blattes, aus dem die Daten ausgelesen werden sollen in Variable schreiben
strBlatt = ThisWorkbook.Worksheets("Ansicht").Range("H5").Value

'letzte beschriebene Zeile im Tabellenblatt PL ermitteln und um 1 erhöhen
lngLetzte = ThisWorkbook.Worksheets("PL").Cells(Rows.Count, 1).End(xlUp).Row + 1

' Prüfen ob Datei Tabelle1.xlsx bereits geöffnet ist
bExists = False
With Application
For Each oWorkbook In .Workbooks
If UCase$(oWorkbook.Name) = "TABELLE1.XLSX" Then
' Jetzt aktivieren
Set wbkQuelle = oWorkbook
bExists = True
Exit For
End If
Next
End With

'Falls Arbeitsmappe nicht geöffnet ist, dann Mappe laden!
If bExists = False Then
Set wbkQuelle = Workbooks.Open("\\A\Bali\Con\FI\01 Tax\05_ Acct\06_Rep (ME)\04_Rev\Temp\Tabelle1.xlsx")
End If

'prüfen, ob in Quelltabelle das Arbeitsblatt tatsächlich existiert
bExists2 = False

With wbkQuelle
For i = 1 To .Worksheets.Count
If .Worksheets(i).Name = strBlatt Then
bExists2 = True
Exit For
End If
Next i
End With

If bExists2 = False Then
MsgBox "Das ausgewählte Arbeitsblatt mit dem Namen """ & strBlatt & """ existiert in Tabelle1.xslx nicht!", 16, "Abbruch!"
wbkQuelle.Activate
Exit Sub
End If

'Daten kopieren
wbkQuelle.Worksheets(strBlatt).Range("A2:J2000").Copy

'nur Inhalte einfügen
ThisWorkbook.Worksheets("PL").Cells(lngLetzte, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

'Arbeitsmappe Tabelle1.xlsx wieder schließen, ohne Speicherung, falls diese geöffnet wurde
'ansonsten bleibt die Mappe offen
If bExists = False Then wbkQuelle.Close (False)

'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True

End Sub

Beachte bitte noch, dass im Tabellenblatt PL in Spalte A keine leeren Zellen vorhanden sein dürfen.

Gruß

M.O.
0 Punkte
Beantwortet von
Hi M.O.

rs ist zwar komplizierter als ich dachte, funktioniert jedoch (fast) einwandfrei.
Ich hatte vergessen Dir noch wichtige Dinge zu sagen.
Nicht nur die Daten sollen hineinkopiert werden (im Tabellenblatt „PL“) , sondern auch die Formatierungen. Geht das?

Ferner habe ich dieser Teil-Quelltext angepasst:
ThisWorkbook.Worksheets("PL").Cells(lngLetzte, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

Ich habe lngLetze mit der Ziffer 7 getauscht, denn die Daten müssen immer ab Zelle B7 eingefügt werden.
Könntest Du das bitte noch einbauen?

Wie auch immer, sieht schon jetzt großartig aus und Du hast mir wieder ein mal geholfen

Danke und Gruß
Max
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Max,

wenn die Daten immer in B7 eingefügt werden sollen, dann werden aber eventuell vorhandene Daten überschrieben.

Aber wenn du es so willst, dann ersetze die Zeilen
ThisWorkbook.Worksheets("PL").Cells(lngLetzte, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

durch
With ThisWorkbook.Worksheets("PL").Range("B7")
.PasteSpecial Paste:=xlPasteValues 'Werte
.PasteSpecial Paste:=xlPasteFormats 'Formate
End With
Application.CutCopyMode = False


Wenn du bei Cells(lngLetzte, 1) die 1 durch eine 7 ersetzt, wird der Inhalt erst ab Spalte G ( = 7. Spalte) eingefügt.

Gruß

M.O.
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Max,

noch mal ich ;-). Wenn du die Variable lngLetzte durch 7 austauschst, dann werden die Daten erst ab Zelle A7 eingefügt.
Du müsstest dann Cells(7, 2) schreiben, entspricht Range("B7").

Die Zeilen
'letzte beschriebene Zeile im Tabellenblatt PL ermitteln und um 1 erhöhen
lngLetzte = ThisWorkbook.Worksheets("PL").Cells(Rows.Count, 1).End(xlUp).Row + 1

kannst du dann löschen.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.,

Auch dieser Fall kann in den Akten gelegt werden :-)
Vielen Dank für Deine erneute professionelle Hilfe.

Ich bin mir sicher, Du wirst wieder Gelegenheit haben mich bei einem anderen Problem zu unterstützen ;-)

VG
Max
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Max,

danke für die Rückmeldung.

Dann bis bald ;-).

Gruß

M.O.
...