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.

Tabellenbereich kopieren, neues Dokument erstellen, einfügen und speichern
#1
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:

  1. Der Bereich "B12" bis "D200" soll ausgewählt und kopiert werden.
  2. Es soll eine neue, leere Excel-Datei erstellt werden (Name des Tabellenblatts eigentlich egal; darf "Tabelle1" heißen)
  3. 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
Antworten Top
#2
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:
  • DrWahnsinn
Antworten Top
#3
(16.02.2017, 16: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
Antworten Top
#4
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.





Antworten Top
#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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#6
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
Antworten Top
#7
Es gibt kein 'Schaltfläche'.
Userform_click reagiert auf klicken im Userform selbst.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 1 Nutzer sagt Danke an snb für diesen Beitrag:
  • DrWahnsinn
Antworten Top
#8
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:
  • DrWahnsinn
Antworten Top
#9
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!
Antworten Top


Gehe zu:


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