はじめに
シートのコピーは、シートオブジェクトのCopyメソッドを使用します。
Copyメソッドでは、コピー先の位置を指定する必要があります。コピー元の前に作る場合は Before。コピー元の後ろに作る場合は After を引数に指定します。
シートの最後にコピーする
「Sheet1」シートをシートの最後にコピーするには、引数 After に最後のワークシートを示す Worksheets(Worksheets.Count) を指定してやります。
シート名は 「Sheet1 (2)」という風に括弧付の数値が付加されます。
Sub sheetCopyTest1()
Worksheets("Sheet1").Copy after:=Worksheets(Worksheets.Count)
End Sub

シートの先頭にコピーする
「Sheet1」シートをシートの先頭にコピーするには、引数 Before に先頭のワークシートを示す Worksheets(1) を指定してやります。
Sub sheetCopyTest2()
Worksheets("Sheet1").Copy before:=Worksheets(1)
End Sub

追加したシートの順番
上の2つのサンプルコードを実行すると、プロジェクトウインドウは以下のようになっていると思います。

プロジェクトウインドウのシートモジュールの並び順は、追加された順番になります。
ただ、Excel画面でのシートの並び順は以下のようになり、順番が異なります。

プログラムでシートの順番を指定したい場合は、Excel画面でのシートの並び順が使われます。
これは以下のサンプルコードを実行すればわかります。
Sub test3()
Dim i As Long
For i = 1 To Worksheets.Count
Debug.Print Worksheets(i).Name
Next i
End Sub
結果は以下のようになります。
Sheet1 (3)
Sheet1
Sheet1 (2)
プロジェクトウインドウのシートモジュールの並び順とは違いますので注意してください。
コピー先をシート名で指定
シートのコピー先は、数値だけでなくシート名で指定してもOKです。ただし、シートを示す数値やシート名が存在しない場合はエラーとなります。
Sub sheetCopyTest3()
'Sheet2の後ろにSheet1のコピーを配置
Worksheets("Sheet1").Copy after:=Worksheets("Sheet2")
End Sub
コピーしたシート名を変更する
コピー先のシート名は自動で付けられますが、シート名を指定したい場合、コピー直後はそのシートがアクティブシートになっていますので、それをもとにシート名を変更できます。ただし、既にその名前が存在する場合はエラーとなります。
Sub sheetCopyTest4()
Worksheets("Sheet1").Copy after:=Worksheets(Worksheets.Count)
'コピー直後は、そのシートがActiveSheetとなる。
ActiveSheet.Name = "日報" & Format(Date, "mmdd")
End Sub
このプログラムでは、「Sheet1」シートをコピーを最後のシートに追加して「日報1222」などと日付つきのシート名にしています。同じ日にこのプログラムを実行すると日付が被ってエラーとなるでしょう。
そのような時は、既に同じシート名があるか確認する必要があります。
シート名が存在するかチェックする
同じシート名が既にあるかチェックする方法については以下のページで解説していますので参照してください。
・シートの有無をチェックする2つの方法
ここでは、以下のようなプログラムでチェックしてみます。
’シート名の重複が無いかチェックする
Function CheckName(str As String) As Boolean
Dim b As Boolean
b = False
Dim sh
For Each sh In Worksheets
If sh.name = str Then
b = True
Exit For
End If
Next sh
CheckName = b
End Function
上記のチェックプログラムを使って重複しないシート名を生成するプログラムを書いてみました。
すでに同じシート名がある場合は、括弧付の数値を付けるようにしています。
Sub sheetCopyTest5()
Dim str As String, name As String, num As Long
Worksheets("Sheet1").Copy after:=Worksheets(Worksheets.Count)
name = "日報" & Format(Date, "mmdd")
str = name
num = 2
Do While CheckName(str)
str = name & "(" & num & ")"
num = num + 1
Stop
Loop
ActiveSheet.name = str
End Sub
まとめ
シートのコピーは、コピー先の指定位置をBefore, Afterの引数で指定しなければなりません。
シート名を変更したい場合は、コピー直後にそのシートがアクティブシートになっていますので、ActiveSheet.nameで変更すれば良いでしょう。
シート位置が存在しない場合や、既にあるシート名を指定するとエラーとなりますのでプログラミングの際には注意してください。