Excel: Per Makro neues Tabellenblatt mit Zelleninhalt erstellen?

1 Antwort

Sub optimierer()
  Dim ws As Worksheet
  Set ws = ActiveWorkbook.Worksheets.Add(After:=ActiveSheet)
  ws.Name = Range("C8").Value
End Sub

Super, danke dir :) Wenn ich dieses Makro ausführe, kommt jedoch die Meldung "Run-time error '1004': Method 'Name' of object '_Worksheet' failed" Weisst du, was ich falsch mache?

0
@jemako

Versuche es mal so:

Sub optimierer()
Dim ws As Worksheet
Set ws = ActiveWorkbook.Worksheets.Add(After:=ActiveSheet)
ws.Name = Me.Range("C8").Value
End Sub


Sonst bezieht sich das Range schon auf das neue Blatt und da ist C8 natürlich leer.
Den Code hast Du ja im Modul des Tabellenblattes?

1
@Oubyi

P.S.:
Zweite Fehlerquelle könnte sein, dass es schon ein Tabellenblatt mit dem gleichen Namen gibt.
DAS darf nicht sein.
DEN Fehler könnte man notfalls noch abfangen.

2
@Oubyi

So könnte es mit Fehlerabfangung aussehen:

Sub optimierer()
Dim wsAlle As Worksheet
Dim wsNeu As Worksheet
Dim strName As String

strName = Me.Range("C8").Value

For Each wsAlle In Worksheets
If wsAlle.Name = strName Then
MsgBox "Name existiert bereits. Exit"
Exit Sub
End If
Next wsAlle

Set wsNeu = ActiveWorkbook.Worksheets.Add(After:=ActiveSheet)
wsNeu.Name = strName
End Sub
2
@Oubyi

Wenn das Worksheet nicht angegeben wird, bezieht sich Range immer auf ActiveSheet.

Das Problem könnte sein, dass das Makro unter den Modulen gespeichert wurde. Dort gibt es kein ActiveSheet und muss vollqualifiziert werden.

0
@Suboptimierer

Wenn das Worksheet nicht angegeben wird, bezieht sich Range immer auf ActiveSheet.

EBEN. Und nach dem anlegen des neuen Sheets ist DAS das Active Sheet.

1
@Oubyi

Das stimmt. Das ActiveSheet ändert sich. Scheinbar ist nicht das ActiveSheet dasjenige, auf das automatisch zugegriffen wird, sondern, wie du vorgeschlagen hast, das Me.

Folgender Code erzeugt folgende Ausgaben:

Sub optimierer()
  Dim ws As Worksheet
  Set ws = ActiveWorkbook.Worksheets.Add(After:=ActiveSheet)
  Debug.Print "C8: " & Range("C8").Value
  Debug.Print "C8: " & ActiveSheet.Range("C8").Value
  Debug.Print "C8: " & Me.Range("C8").Value
  ws.Name = Range("C8").Value
End Sub

C8: Suboptimierer C8: C8: Suboptimierer

Das von dir Aufgezeigte Problem hängt erklärt bestimmt, dass das Sheet im folgenden Code nicht umbenannt wird. Das With überschreibt das Me. Range bezieht sich auf das With-Sheet. Aber auch ActiveSheet würde durch With bei unqualifizierten Angaben übersteuert werden.

Sub optimierer2()
  With ActiveWorkbook.Worksheets.Add(After:=ActiveSheet)
    Name = Range("C8").Value
  End With
End Sub
1
@jemako

Freut mich, dass wir helfen konnten 🙂

1

Was möchtest Du wissen?