PDA

Vollständige Version anzeigen : VBA Befehl klappt nicht: Tabelle in neues Sheet einfügen


isarc
04.07.2014, 07:43
Hallo,

möchte ein Tabellenblatt kopieren und in neues vorhandenes Excelsheet einfügen. Der Fehler tritt in der rot markierten Zeile auf.

Sub Calccopy_()
'
' Calccopy_ Makro
'
'

Sheets("Calcu Angebot").Select
Workbooks.Open ("Y:\isarcolor_Prog\generieren.xlsm")
Sheets("Calcu Angebot").Copy Before:=Workbooks("generieren.xlsm").Sheets(1)
End Sub

EarlFred
04.07.2014, 08:06
Hallo End Sub,

ein Tabellenblatt kopieren und in neues vorhandenes Excelsheet einfügen
Ein Blatt (=Sheet) kann nicht in ein Sheet eingefügt werden.

Der Fehler tritt in der rot markierten Zeile auf.
welcher Fehler? Hat der eine Bezeichnung und eine Nummer?

Meinst Du so?
Option Explicit

Sub Calccopy_()

Dim wb As Workbook
Set wb = Workbooks.Open("Y:\isarcolor_Prog\generieren.xlsm")
wb.Worksheets("Calcu Angebot").Copy Before:=ThisWorkbook.Sheets(1)

wb.Close Savechanges:=False 'oder true?
Set wb = Nothing
End Sub

Grüße
EarlFred

isarc
04.07.2014, 09:47
Hallo,

erstmal danke für die Hilfe.

Hier kommt auch eine Fehlermeldung "Laufzeitfehler 9" - Index außerhalb des gültigen Bereichs.

Also eigentlich sollte folgendes passieren: Beim Klick auf den Button soll das Blatt (bzw. Register) kopiert werden,

dann die Datei generien.xslm geöffnet werden und hier eingefügt werden.

Vielleicht hast du noch einen Tipp ?

Danke Dir
Andi

MWOnline
04.07.2014, 09:55
Hallöchen,

teste mal diese Variante:

Sub Calccopy_()
Dim oActive as Object
Dim oTarget as Object
Set oActive = ActiveWorkbook
Set oTarget = Workbooks.Open ("Y:\isarcolor_Prog\generieren.xlsm")
oActive.Sheets("Calcu Angebot").Copy Before:=oTarget.Sheets(1)
'Ggf. Schliessen?
oTarget.Close False
Set oTarget = Nothing
Set oActive = Nothing
End Sub


Beste Grüße und Viel Erfolg
Marc

EarlFred
04.07.2014, 10:03
Hallo Andi,

was Quell- und was Zielmappe ist, war nicht klar. Mit "verkehrten" Mappen dann so:

Option Explicit

Sub Calccopy_()

Dim wb As Workbook
Set wb = Workbooks.Open("Y:\isarcolor_Prog\generieren.xlsm")

ThisWorkbook.Worksheets("Calcu Angebot").Copy Before:=wb.Sheets(1)

'Datei wieder schließen?
'wb.Close Savechanges:=True 'Änderungen speichern? Bestimmt "Ja", also True
Set wb = Nothing
End Sub

Grüße
EarlFred

RPP63neu
04.07.2014, 10:04
Hallo!
*JustMyMustard*
Es ist immer ungünstig, ein Blatt über den Index anzusprechen (auch, wenn der Rekorder dies so aufzeichnet, aber das ist ein ganz anderes Thema).
Wenn dass Sheet gelöscht wird, schmeißt es Dir den Index durcheinander!

Nimm statt .Sheets(1)
besser den Tabellennamen .WorkSheets("DeinTabellenblatt")
oder noch viel besser den CodeName .Tabelle1
(nachzuschauen im ProjectExplorer)

Gruß, Ralf

EarlFred
04.07.2014, 10:07
Hallo Ralf,

den Index zu verwenden ist schon OK, wenn ausdrücklich das erste ("x-te") Blatt in der Mappe gemeint ist. Andernfalls gebe ich Dir uneingeschränkt recht.
Blätter einer fremden Mappe über den Codenamen anzusprechen ist allerdings nicht ganz trivial.

*JustMyMustard*
und bitte keinen Senf ohne Worscht (frisch vom Grill, bitteschön)! *hammjammjamm* ;)

Grüße
EarlFred

isarc
04.07.2014, 10:50
Hallo,

hab es gerade probiert. Es kommt keine Fehlermeldung bei der Ausfürung. Die Datei generieren.xlsm wird auch geöffnet. Allerdings wird das Sheet nicht eingefügt..

Bin am überlegen warum...:rolleyes:

Vielleicht stimmt im Code etwas nicht?

Danke!

EarlFred
04.07.2014, 12:24
Hallo Name?,

hab es gerade probiert
Welchen Code von den zweien?

In dieser Zeile
oTarget.Close False
wird die Datei ohne zu Speichern wieder geschlossen. Vielleicht mal versuchsweise auf True setzen?

Grüße
EarlFred

isarc
04.07.2014, 13:23
Also der code klappt Option Explicit

Sub Calccopy_()

Dim wb As Workbook
Set wb = Workbooks.Open("Y:\isarcolor_Prog\generieren.xlsm")

ThisWorkbook.Worksheets("Calcu Angebot").Copy Before:=wb.Sheets(1)

'Datei wieder schließen?
'wb.Close Savechanges:=True 'Änderungen speichern? Bestimmt "Ja", also True
Set wb = Nothing
End Sub

Nur hab ich nun das Problem, mh wie soll ich es beschreiben...
Ich habe auf den anderen Sheets (Tabelle, Tabelle2)
folgende Formel hinterlegt, der auf die Zellen von Calcu Angebot verweist.
=WENN('Calcu Angebot'!J13="";"";'Calcu Angebot'!J13)

Das Problem ist allerdings das ja dieses Calcu Angebot noch gar nicht existiert. Deshalb fehlt ja der Bezug zum Sheet, was sich nun in der Formel wiederspiegelt. Aber auch wenn ich nun das Sheet Calcu Angebot eingefügt habe, fehlt noch der Bezug...
=WENN('Bezug!'!J13="";"";'Bezug!'!J13)

Mc Santa
04.07.2014, 13:30
Dann füge die Formeln erst später ein.
Sobald in der Formel einmal Bezug! steht, bekommst du es nicht mehr weg.

Ich vermute es ist bei dir anders: Du willst das Tabellenblatt "Calcu Angebot" aktualisieren. Dazu löscht du das alte und kopierst das neue.
Wenn du so vorgehst, dann werden jedoch die Bezüge gelöscht. Behalte also das Tabellenblatt, lösche nur die Inhalte und füge die neuen wieder ein.

Hilft dir das weiter?
VG

isarc
04.07.2014, 14:27
Hy,

ja du hast Recht, soweit war ich schon, was natürlich auch funktioniert.

Allerdings habe ich ein Problem, dass auf zwei Sheets (Calcu Angebot + Calcu Proforma) die Daten in das jeweilige Sheet übertragen werden muss.

Dachte zuerste es wäre einfacher die Sheets einfach zu kopieren und einzfügen.

So habe ich es mit den Daten gemacht, allerdings funktioniert das nur mit Calcu Angebot. Wie das auch bei Calcu Proforma funktioniert, ist die große Frage...)

Public Sub kopieren(rng As String)
Dim a As Variant
Dim i As Long

a = Split(rng, ",")
With ThisWorkbook.Sheets("Calcu Angebot")
For i = LBound(a) To UBound(a)
ActiveSheet.Range(a(i)).Value = .Range(a(i)).Value
Next
End With
End Sub

Private Sub CommandButton2_Click()
Call kopieren("E13:E15,E2:E8,E49:E57,E22,E24:E25,E29,J22:J41,J44:J45,J47,J50:J55,P13:P16,O19:Q1 9,P22:P41,P44:P45,P50:P53,J13:J16,E109:E111,E118,E120,E121,E125,E145:E153")SUB

isarc
07.07.2014, 10:19
Hallo nochmal,

ich habe jetzt nur das Problem, dass er mir die Daten nur im akutellen Sheet wo man sich befindet erneuert.

Habe habe zwei Sheets (Calcu Angebot + Calcu Proforma)

Er sollte in beiden die Daten jeweils erneuern.

Meine Idee wäre hier statt ActiveSheet.Range
den Sheet Namen zu vewenden und nach next die das gleiche für die das zweite Sheet?

Public Sub kopieren(rng As String)
Dim a As Variant
Dim i As Long


Workbooks.Open ("Y:\isarcolor_Prog\generieren.xlsm")


a = Split(rng, ",")
With ThisWorkbook.Sheets("Calcu Angebot")
For i = LBound(a) To UBound(a)
ActiveSheet.Range(a(i)).Value = .Range(a(i)).Value
Next
End With
End Sub