1

VBA novice here - I've combed the interwebs and can't seem to get this to work, it's got me stumped.

I would like to have a button on a form that will allow a user to generate a copy of a worksheet "Template", in the same workbook - to the right of "Template". I've figured it out enough that I can generate a copy that renames itself as Template(2) OR generate a blank worksheet named with the text entered in the prompt, but I can't do both.

As is below - it currently returns an "Object Required" error. Thanks in advance for your help, it's much appreciated!

Private Sub NewSheet()
 Dim NewSheet As Worksheet
 Dim newName As String
 Do
 newName = Application.InputBox("What do you want to name the new sheet?", Type:=2)
If newName = "False" Then Exit Sub: Rem cancel pressed 

Set NewSheet = ThisWorkbook.Worksheets("Template").Copy(After:=Worksheets("Template"))

On Error Resume Next
    NewSheet.Name = newName
    newName = Error
On Error GoTo 0

If newName <> vbNullString Then
    Application.DisplayAlerts = False
        NewSheet.Delete
    Application.DisplayAlerts = True
    MsgBox newName
End If
Loop Until newName = vbNullString

End Sub
pnuts
  • 58,317
  • 11
  • 87
  • 139
Ryan Flynn
  • 13
  • 1
  • 3

1 Answers1

0

Or you can try this:

Sub Test()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Sheets("Template")
    Dim newws As Worksheet, sh As Worksheet, newname
    Dim query As Long, xst As Boolean, info As String

retry:
    xst = False
    newname = Application.InputBox("Enter a new sheet name.", info, , , , , , 2)
    If newname = "False" Then Exit Sub
    For Each sh In wb.Sheets
        If sh.Name = newname Then
            xst = True: Exit For
        End If
    Next
    If Len(newname) = 0 Or xst = True Then
        info = "Sheet name is invalid. Please retry."
        GoTo retry
    End If
    ws.Copy after:=ws: Set newws = ActiveSheet: newws.Name = newname
End Sub

This will continuously ask for a valid sheet name unless the user cancels it.
To avoid deleting a newly added sheet, check first if the name is valid.
Also, I don't think you can copy and assign in one go since there's no documentation that the Copy Method returns the object that was copied. So you copy first and use Activesheet to assign it to a variable.

L42
  • 19,427
  • 11
  • 44
  • 68