Registriert seit: 13.01.2017
Version(en): 2013
Moin Moin zusammen, Ich bin seit Stunden am Lösen folgenden Problems: Ich habe eine Datei mit vielen Tabellenblätter. Ich möchte nun auf einem Blatt einen Auszug kopieren und eine neue Datei erstellen - auf VBA-Knopfdruck. Dazu habe ich ein ActiveX-Element angelegt und anschließend eine UserForm. Nach "starten" in der UserForm soll folgendes passieren: - Der Bereich "B12" bis "D200" soll ausgewählt und kopiert werden.
- Es soll eine neue, leere Excel-Datei erstellt werden (Name des Tabellenblatts eigentlich egal; darf "Tabelle1" heißen)
- Kopierter Inhalt soll in diese Tabelle eingefügt werden
Mein bisheriger Code sieht folgendermaßen aus... Funktioniert leider nicht. Code: Private Sub UserForm_Click()
.Range(.Cells(12, 2), .Cells(200, 4)).Copy Set Newbook = Workbooks.Add With Newbook .Worksheets("Tabelle1").Name = "Anschreiben" Sheets("Anschreiben").Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False .Worksheets("Anschreiben").Name = "Anschreiben" End With
End Sub
Über Tipps und Anregungen wär ich sehr dankbar! Gruß, Doc
Registriert seit: 21.06.2016
Version(en): 2021
Hallo Doc,
wenn du Hilfe bei einem Fehler in einem Makro haben möchtest das mit einer Fehlermeldung abbricht solltest du den Helfern den Text der Fehlermeldung und die Zeile, in der das Programm abbricht mitteilen.
Die Aussage "funktioniert leider nicht" funktioniert häufig nicht.
Einige Bemerkungen:
a) zu ".Range....." ".Range" benötigt ein Objekt vom Typ worksheet vor dem Punkt. Entweder direkt vor dem Punkt geschrieben oder durch eine With-Schleife um diese Zeile.
b) zu "Set Newbook ..." Die Variable Newbook muss vom Typ Workbook sein. Also als workbook anlegen.
c) zu "With Newbook" Da du nur im ersten Arbeitsblatt der Tabelle arbeitest kannst du dieses mit einbeziehen: "With Newbook.Worksheets(1)" Der erste Befehl beginnt dann mit ".Name..." Der zweite Befehl beginnt mit ".Range..." Der dritte Befehl kann entfallen.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Folgende(r) 1 Nutzer sagt Danke an Ego für diesen Beitrag:1 Nutzer sagt Danke an Ego für diesen Beitrag 28
• DrWahnsinn
Registriert seit: 13.01.2017
Version(en): 2013
(16.02.2017, 17:05)Ego schrieb: Hallo Doc,
wenn du Hilfe bei einem Fehler in einem Makro haben möchtest das mit einer Fehlermeldung abbricht solltest du den Helfern den Text der Fehlermeldung und die Zeile, in der das Programm abbricht mitteilen.
Die Aussage "funktioniert leider nicht" funktioniert häufig nicht.
Einige Bemerkungen:
a) zu ".Range....." ".Range" benötigt ein Objekt vom Typ worksheet vor dem Punkt. Entweder direkt vor dem Punkt geschrieben oder durch eine With-Schleife um diese Zeile.
b) zu "Set Newbook ..." Die Variable Newbook muss vom Typ Workbook sein. Also als workbook anlegen.
c) zu "With Newbook" Da du nur im ersten Arbeitsblatt der Tabelle arbeitest kannst du dieses mit einbeziehen: "With Newbook.Worksheets(1)" Der erste Befehl beginnt dann mit ".Name..." Der zweite Befehl beginnt mit ".Range..." Der dritte Befehl kann entfallen. Hallo Helmut, vielen Dank für deine Tipps und Anmerkungen. Du hast recht, die Aussage hätte ich konkretisieren können - im Eifer des Gefechts nicht dran gedacht, sorry! Mein Code sieht jetzt folgendermaßen aus: Code: Private Sub UserForm_Click() ThisWorkbook.Sheets("Anschreiben").Range(.Cells(12, 2), .Cells(200, 4)).Copy Dim Newbook As Workbook Set Newbook = Workbooks.Add With Newbook.Worksheets(1) .Name = "Anschreiben" .Range(Cells(1, 1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
End With
End Sub
Es kommt beim Ausführen jetzt die Fehlermeldung: "Fehler beim Kompilieren: Erwartet: Benannter Parameter", folgende Codezeile ist "rot": Code: .Range(Cells(1, 1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
Der Logik nach scheint hier ein benannter Parameter zu fehlen (Ich Schlauchen ;) ), leider kann ich mit der Aussage nichts anfangen. Was versteht man unter "benannter Parameter"? Besten Dank! Doc
Registriert seit: 21.06.2016
Version(en): 2021
16.02.2017, 19:28
(Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2017, 19:28 von Ego.)
Hallo Doc
Zum code:
Du hast im neuen code eine Zeile Vergessen.
Im ersten code waren innerhalb der With-Schleife drei Befehle und vier gefüllte Zeilen. Der zweite Befehl war in zwei Zeilen geschrieben. (Erkennbar an dem "_" am Ende der ersten Zeile des Befehls.)
Zur Fehlermeldung:
Man kann bei Funktionen die notwendigen Parameter in zwei Arten übergeben:
1) Als Parameterliste in Klammern und durch Kommata getrennt. Dann muss die vorgegebene Reihenfolge der Parameter eingehalten werden.
2) Als Zuweisung ":=" der Werte zu den benannten Parametern zb. "SkipBlanks"
Da du den zweiten Teil des Befehls nicht mitkopiert hast fehlt dem VBA-Interpreter diese Zuweisung.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Registriert seit: 29.09.2015
Version(en): 2030,5
Code: Private Sub UserForm_Click() sn=activesheet.Cells(12, 2).resize(188,2) with Workbooks.Add.sheets(1) .Name = "Anschreiben" .cells(1).resize(ubound(sn),ubound(sn,2))=sn End With End Sub
Registriert seit: 13.01.2017
Version(en): 2013
Hallo, euch beiden erstmal ein Danke für die Antworten! @Helmut: Wieder was gelernt, hast du recht, hab ich in dem Fall vergessen. Mein Code sieht jetzt so aus: Code: Private Sub UserForm_Click()
ThisWorkbook.Sheets("Anschreiben").Range(.Cells(12, 2), .Cells(200, 4)).Copy Dim Newbook As Workbook Set Newbook = Workbooks.Add With Newbook.Worksheets(1) .Name = "Anschreiben" .Range(Cells(1, 1)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End With
End Sub
@snb auch vielen Dank! Du hast mir schonmal geholfen :) Jetzt die schlechte Nachricht ... leider öffnet sich in beiden Fällen die UserForm, klick ich die Schaltfläche an passiert einfach nichts... Das erscheint mir mehr als komisch, dass dies bei beiden Codes so ist. Leider find ich keinen Fehler... :( Wünsche euch ein schönes Wochenende! - Doc
Registriert seit: 29.09.2015
Version(en): 2030,5
17.02.2017, 13:01
(Dieser Beitrag wurde zuletzt bearbeitet: 17.02.2017, 13:02 von snb.)
Es gibt kein 'Schaltfläche'. Userform_click reagiert auf klicken im Userform selbst.
Folgende(r) 1 Nutzer sagt Danke an snb für diesen Beitrag:1 Nutzer sagt Danke an snb für diesen Beitrag 28
• DrWahnsinn
Registriert seit: 21.06.2016
Version(en): 2021
Hallo doc,
wofür nutzt du die Userform?
Wenn du den Befehl durch drücken des Buttons ausführen willst, must du das Makro umbenennen. (Anstatt den Userform-Namen den Button-Namen)
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Folgende(r) 1 Nutzer sagt Danke an Ego für diesen Beitrag:1 Nutzer sagt Danke an Ego für diesen Beitrag 28
• DrWahnsinn
Registriert seit: 13.01.2017
Version(en): 2013
Vielen lieben Dank für eure Geduld, bin grad ziemlich im Stress. Habe es mir eben nochmal in Ruhe angeschaut.... Hatte es auf die UserForm verlinkt, NICHT auf den Button.... sah so aus: Code: Private Sub CommandButton1_Click()
End Sub
Private Sub UserForm_Click() sn = ActiveSheet.Cells(12, 2).Resize(188, 2) With Workbooks.Add.Sheets(1) .Name = "Anschreiben" .Cells(1).Resize(UBound(sn), UBound(sn, 2)) = sn End With End Sub
Mit folgendem Code funktioniert es jetzt GENAU SO wie ich wollte :) Code: Private Sub CommandButton1_Click() sn = ActiveSheet.Cells(12, 2).Resize(188, 3) With Workbooks.Add.Sheets(1) .Name = "Anschreiben" .Cells(1).Resize(UBound(sn), UBound(sn, 2)) = sn End With Unload UserForm16 End Sub
Nochmals Danke!
|