Registriert seit: 03.05.2019
Version(en): Office 2013
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
Registriert seit: 28.05.2017
Version(en): 365
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:1 Nutzer sagt Danke an EasY für diesen Beitrag 28
• Ilyas55
Registriert seit: 11.04.2014
Version(en): '97 bis 2016; 365
06.05.2019, 18:55
(Dieser Beitrag wurde zuletzt bearbeitet: 06.05.2019, 18:57 von Käpt'n Blaubär.)
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.
Registriert seit: 12.03.2016
Version(en): Excel 2003
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:1 Nutzer sagt Danke an Gast 123 für diesen Beitrag 28
• Ilyas55
Registriert seit: 03.05.2019
Version(en): Office 2013
07.05.2019, 13:24
(Dieser Beitrag wurde zuletzt bearbeitet: 07.05.2019, 13:32 von Ilyas55.
Bearbeitungsgrund: Codetags
)
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?
Registriert seit: 12.03.2016
Version(en): Excel 2003
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:1 Nutzer sagt Danke an Gast 123 für diesen Beitrag 28
• Ilyas55
Registriert seit: 03.05.2019
Version(en): Office 2013
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?
Registriert seit: 12.03.2016
Version(en): Excel 2003
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
Registriert seit: 03.10.2018
Version(en): 2010 ProPlus / 2016 ProPlus
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 ...
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
11.05.2019, 23:10
(Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2019, 23:13 von schauan.)
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 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)
|