Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Tabelle kopieren wenn...
#1
Hallo zusammen,

folgend mein Anliegen
ich muss Tabellen einer Datei (Datei 1) übertragen auf Tabellen einer anderen Datei (Datei 2).
Datei 1 wird immer wieder überschrieben, sodass die Anzahl der Tabellen variiert.
Von VBA habe ich weniger als keine Ahnung und meine einzige Hoffnung ist der Makro Recorder. Meine Idee ist es gewesen eine maximal Anzahl an Tabellen in Datei 1 zu generieren (10 Tabellen) und diese dann innerhalb der Aufzeichnung des Recorders zu übertragen.
Das Problem dabei:
enthält Datei 1 statt 10 nur 9 Tabellen funktioniert der Code nicht mehr, weil Active.Sheet10 nicht ausgeführt werden kann.
Habe ich also die Möglichkeit vor jedem Active.sheet eine wennfunktion einzubauen, die folgendes macht:
wenn sheetname=1; dann kopieren (dieser Teil wird mit dem Recorder bereits erledigt); ansonsten: wenn sheetName=2; dann kopieren; ansonsten wenn sheetName 3=dann kopieren.. und so weiter.

Vielen Dank für eure Antworten!

PS:
bei Bedarf kann ich die Aufzeichnung vom Recorder senden
Antworten Top
#2
Hi,

wenn du schreibst, dass du von VBA überhaupt keine Ahnung hast, dann wird es schwierig, wenn wir den Aufbau deiner Datei nicht kennen.

Wenn es nun darum geht, alle Arbeitsblätter anzusprechen, dann nutze ein For Each-Schleife. Die sieht in etwa so aus:


Code:
Sub easy()

Dim wks As Object

For Each wks In Worksheets
Hier dein Code, was passieren soll. Die Blätter werden dann mit wks angesprochen, z.B. wks.copy (s.a. https://docs.microsoft.com/de-de/office/vba/api/excel.worksheet.copy)
Next wks

End Sub


Vielleicht hilft dir das ja schon weiter.

Gruß
[-] Folgende(r) 1 Nutzer sagt Danke an EasY für diesen Beitrag:
  • Ilyas55
Antworten Top
#3
Hallo,

Zitat:bei Bedarf kann ich die Aufzeichnung vom Recorder senden

... das darfst Du gerne tun.

Allerdings sind Deine Info's bezüglich Deines Gesamtvorhabens mir persönlich zu schwammig.
Da solltest Du noch mal nachlegen.
Zusätzlich würde ich gerne eine Beispieldatei zum Testen haben wollen.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!

Grüße aus Norderstedt, Peter
[-] Folgende(r) 1 Nutzer sagt Danke an Käpt'n Blaubär für diesen Beitrag:
  • Ilyas55
Antworten Top
#4
Hallo

ich habe die Schleife nur um den Befehl "ThisWorkbook" erweitert.  Waere gut den ganzen Recorder Code zu sehen, der laessst sich bestimmt verbessern!

Code:
Sub gezieltes_Kopieren()
Dim i As Integer
  For i = 1 To ThisWorkbook.Worksheets.Count
     'Hier kommt der Macro recordr code hin!
     '..........
  Next i
End Sub

mfg  Gast 123
[-] Folgende(r) 1 Nutzer sagt Danke an Gast 123 für diesen Beitrag:
  • Ilyas55
Antworten Top
#5
Hallo,

folgend die Aufzeichnung vom Recorder. Im Grunde kopiere ich eine bestimmte Range eines Worksheets einer 2. Datei und kopiere es in meine eigene.
Das mache ich so oft wie ich Tabellennamen mit dem identischen Namen habe.
Enthalte ich nun eine andere Kalkulation (als Beispiel Test Datei 3) würde ich diesen auf Testdatei 3 überschreiben und dann den Makro starten.
Allerdings funktioniert das ganze nicht wenn in Test Datei 3 nur 2 Tabellen enthalten sind bzw. keine Tabelle mit der Überschrift "Kalkulation 3" gefunden werden kann.

Code:
Sub Makro4()
'
' Makro4 Makro
'
'
    Windows("Testdatei 2.xlsm").Activate
    Range("A1:G17").Select
    Selection.Copy
    Windows("Test Datei 1.xlsm").Activate
    ActiveSheet.Paste
    Windows("Testdatei 2.xlsm").Activate
    Sheets("Kalkulation 2").Select
    Range("A1:H29").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Test Datei 1.xlsm").Activate
    Sheets("Kalkulation 2").Select
    ActiveSheet.Paste
    Windows("Testdatei 2.xlsm").Activate
    Sheets("Kalkulation 3").Select
    Range("A1:H31").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Test Datei 1.xlsm").Activate
    Sheets("Kalkulation 3").Select
    ActiveSheet.Paste
    Windows("Testdatei 2.xlsm").Activate
    Sheets("Kalkulation bis max 10").Select
    Range("A1:J28").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("Test Datei 1.xlsm").Activate
    Sheets("Kalkulation bis max 10").Select
    Range("A1").Select
    ActiveSheet.Paste
End Sub


Vielen Dank für deine Antwort!
Es soll nicht jede Tabelle kopiert werden. Es sollen nur die Tabellen kopiert werden, die die identische Überschriften enthalten.

Hallo Gast 123,

Vielen Dank auch für deine Antwort.

"For i = 1 To ThisWorkbook.Worksheets.Count"

verstehe ich das richtig, dass dieser Befehl folgendes bewirkt:
ab dem 1. Tabellenblatt wird angefangen den Code aus dem Recorder auszuführen bis kein Worksheet mehr vorhanden ist?
Antworten Top
#6
Hallo

um mal zu zeigen was man mit VBA machen kann, wenn man sich auskennt, hier dein elegant verkürzter Code.

Um ihn in eine For Next Schleife einzubauen sind noch ein paar Angaben notwendig. Wir können auch das "Kalkulationsblatt 3" prüfen ob es real vorhanden ist.  Ich glaube die Anzahl der zu kopierenden Blaetter sollte man aus Datei 2 laden, oder??  Ist sonst noch was zu berücksichtigen?  

Mit Select ohne genaue Blatt und Range Angabe in ein Blatt kopieren ist immer ein Risiko das man das falsche Blatt oder einen undefinierten Berich erwischt!  Dazu haette ich lieber genaue Angaben, verzichte auf Selektieren!!

mfg  Gast 123

Code:
Sub Makro4()
Dim Test1 As Workbook, Test2 As Workbook
Set Test1 = Workbooks("Testdatei 1.xlsm")
Set Test2 = Workbooks("Testdatei 2.xlsm")

   Test2.Activate      'welches Quell Blatt??
   Range("A1:G17").Copy
   Test1.Activate      'welches Ziel Blatt??
   ActiveSheet.Paste
   
   Test2.Sheets("Kalkulation 2").Range("A1:H29").Copy
   Test1.Sheets("Kalkulation 2").Range("A1:H29").PasteSpecial xlPasteAll
   
   Test2.Sheets("Kalkulation 3").SRange("A1:H31").Copy
   Test1.Sheets("Kalkulation 3").Range("A1:H29").PasteSpecial xlPasteAll
   
   Test2.Sheets("Kalkulation bis max 10").Range("A1:J28").Copy _
   Test1.ActivateSheets("Kalkulation bis max 10").Range("A1")
   Application.CutCopyMode = False
End Sub


Sub Makro5()
Dim ShtMax As Worksheet
Dim Sht2 As Worksheet, Sht3 As Worksheet
Dim Test1 As Workbook, Test2 As Workbook
Set Test1 = Workbooks("Testdatei 1.xlsm")
Set Test2 = Workbooks("Testdatei 2.xlsm")
Set Sht2 = Worksheets("Kalkulation 2")
Set Sht3 = Worksheets("Kalkulation 3")
Set ShtMax = Sheets("Kalkulation bis max 10")
 
   'verkürzte Schreibweise über Set Objekte
   Test2.Activate      'welches Quell Blatt??
   Range("A1:G17").Copy
   Test1.Activate      'welches Ziel Blatt??
   ActiveSheet.Paste
   
   Test2.Sht2.Range("A1:H29").Copy
   Test1.Sht2.Range("A1:H29").PasteSpecial xlPasteAll
   
   Test2.Sht3.SRange("A1:H31").Copy
   Test1.Sht3.Range("A1:H29").PasteSpecial xlPasteAll
   
   'hier ist das Ziel direkt angegben  (ohne Paste!)
   Test2.ShtMax.Range("A1:J28").Copy _
   Test1.ShtMax.Range("A1")
   Application.CutCopyMode = False
End Sub
[-] Folgende(r) 1 Nutzer sagt Danke an Gast 123 für diesen Beitrag:
  • Ilyas55
Antworten Top
#7
Mahlzeit,

Also nochmal:
Meine Zieldatei hat 10 Musterblätter. Hier muss nichts kontrolliert werden.
Es muss geschaut werden, ob in der Quelldatei Kalkulation 2,3,4,5,6,7,8,9,10,"MON", vorhanden ist.
Wenn Quelldatei Beispielsweise "Kalkulation 3" und "MON" vorhanden sind; sollen diese in die Zieldatei mit den Arbeitsblättern "Kalkulation 3" und "MON" übertragen werden. Die Festlegung der Range ist eine Fachspezifische Frage. Hier müsste ich meinen Chef fragen, der nächste Woche aus dem Urlaub kommt. Ich denke aber ung. A1:BZ500.
Was mir noch einfällt wäre folgende Idee:
Ich baue keine For Schleife ein sondern erstelle 10 Buttons. Für jedes Button erstelle ich dann ein Makro, welches ein Quellarbeitblatt auf ein Zielarbeitsblatt überträgt.
Allerdings bräuchte ich dazu einen Code welches mir Fehlermeldungen abfängt, falls das Quellarbeitsblatt nicht vorhanden ist. Im Grunde die VBA Version von wennfehler(Code;""). Und ich müsste wissen wie man ein Makro einem Button zuweist.

Dann habe ich noch eine Frage:
wenn ich meine Quelldatei mit einer anderen Datei überschreibe funktioniert mein Makro nicht mehr. Das ist allerdings existenziell, da die ganze Sache sonst nicht sinnig ist.
Du schreibst:
Set Test2 = Workbooks("Testdatei 2.xlsm")
Testdatei 2 ist in diesem Beispiel die Quelldatei. Woher weiß das Programm welches Testdatei 2 es öffnen muss? Müsste ich nicht einen Pfad eingeben zu dem Ordner indem es abgespeichert wird? Wenn ja wie mache ich das?
Antworten Top
#8
Hallo

ich bin nicht jeden Tag im Forum, kann aber am Projekt bleiben!

Mein Vorschlag:  erstelle bitte eine Beispieldatei, in dem Fall die Datei in die kopiert werden soll, mit einigen Fantasie Daten von Hand, aus denen ich sehen kann wohin kopiert werden soll.  Mit Angaben aus welcher Datei bzw. Dateien die Daten geholt werden müssen.  Ich brauche bitte eine Kopie vom Blatt "Kalkulation 3" im Beispiel damit ich sehe wo genau der Text  "Mon" zum prüfen steht und was es mit 2,3,4,5,6 usw. auf sich hat? Was soll da noch geprüft werden und in welchen Zellen stehen die Werte?  Die anderen Daten können gelöscht werden. s. Datenschutz

Wenn wir das für einen Button gemeinsam entwickeln bis es funktioniert kannst du das VBA für die andren Button selbst schreiben.  Da aendert sich ja nur für jeden weiteren Button der Dateiname und der Zielbereich. Wohin jeder Button kopieren soll muss ich aber schon wissen, denn der Bereich sollt vor dem Kopieren bestimmt gelöscht werden, oder? 

mfg  Gast 123
Antworten Top
#9
Hallo du Gastarbeiter,

das mit der Musterdatei, haben ihm ... wenn ich das in allen seinen Threads richtig gezählt habe ... bereits 12 Leute gesagt !!! Mich ... mal nicht mitgezählt.

Er weigert sich aber nachwievor ...
VG Sabina

bei mir läuft Win 7 32-Bit - Office 2010 Pro Plus 32-Bit und Office 2016 Pro Plus 32-Bit
Wer auch weiter Hilfe erwartet, sollte sich nicht zu schade sein, ein kurzes Feedback zu geben.
Antworten Top
#10
Hallöchen,

Zitat:Meine Zieldatei hat 10 Musterblätter. Hier muss nichts kontrolliert werden.
Es muss geschaut werden, ob in der Quelldatei Kalkulation 2,3,4,5,6,7,8,9,10,"MON", vorhanden ist.
Wenn Quelldatei Beispielsweise "Kalkulation 3" und "MON" vorhanden sind; sollen diese in die Zieldatei mit den Arbeitsblättern "Kalkulation 3" und "MON" übertragen werden. Die Festlegung der Range ist eine Fachspezifische Frage. Hier müsste ich meinen Chef fragen, der nächste Woche aus dem Urlaub kommt. Ich denke aber ung. A1:BZ500.

Die Zieldatei hat 10 Blätter Kalkulation 2,3,4,5,6,7,8,9,10,"MON"
Die Quelldatei hat 10 Blätter Kalkulation 2,3,4,5,6,7,8,9,10,"MON"
Kopiert werden soll der Bereich A1:BZ500

Die Frage
Zitat:Wohin jeder Button kopieren soll muss ich aber schon wissen, denn der Bereich sollt vor dem Kopieren bestimmt gelöscht werden, oder?
ist noch offen.

@ Ilyas55 - ob ein Blatt vorhanden ist, musst Du nicht unbedingt prüfen.

Weiter oben gab es schon mal einen Code mit einer Schleife … wks … Die kannst Du auch für einzelne Blätter verwenden. So würde der Code der dann bei "... tu was .." steht, z.B, nur für Blatt 3 ausgeführt. Gibt es das Blatt nicht, wird auch nichts ausgeführt.
Wenn Du 10 Buttons erstellst könntest Du dann in jedem Makro diese Schleife verwenden, eben nur mit jeweils einem anderen Blatt. Das wäre aber erst mal die "Einfachvariante" zum anlernen Smile und zum schauen, ob und wie das funktioniert. Im nächsten Schritt könnte man dann schauen, wie man das flexibel für verschiedene Blätter gestaltet.

Dim wks As Object
For Each wks In Worksheets
 if wks.Name = "Kalkulation 3" Then
    .. tu hier was
 end if
Next

Das mit dem Überschreiben lässt sich auch lösen, indem Du eine Datei nur für den Code machst. Die wird dann nicht überschrieben. Du kannst von der aus das Ziel öffnen und auch die Quelle(n) …
Das mit dem Öffnen der Datei in einem bestimmten Ordner kannst Du übrigens auch aufzeichnen. Wenn die aktualisierten Dateien immer die gleichen Namen haben und im gleichen Ordner liegen, muss man nicht mal was ändern.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste