31

シートをコピーして、現在のすべてのシートの最後に追加したい(シートが非表示になっているかどうかに関係なく)。

Sheets(1).Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).name = "copied sheet!"

これは正常に機能しますが、非表示のシートがある場合、新しいシートは最後に表示されたワークシートの後にのみ挿入されるため、nameコマンドは間違ったシートの名前を変更します。

新しくコピーされたコードへの参照を取得するために次のバリエーションを試しましたWorkSheetが、成功したコードや有効なコードはありませんでした。

Dim test As Worksheet
Set test = Sheets(1).Copy(After:=Sheets(Sheets.Count))
test.Name = "copied sheet!"
4

7 に答える 7

43

これを試して

Sub Sample()
    Dim test As Worksheet
    Sheets(1).Copy After:=Sheets(Sheets.Count)
    Set test = ActiveSheet
    test.Name = "copied sheet!"
End Sub

これを振り返ると、より良いアプローチは

Set test = Sheets(Sheets.Count)

以下のコメントで正しく述べられているように、シートをコピーして名前を変更するときに考慮する必要があることがたくさんあります。他の回答も確認することをお勧めします。

于 2012-08-16T15:23:15.700 に答える
9

コピーする前に、ソースシートを表示してください。次に、シートをコピーして、コピーも表示されたままにします。その場合、コピーがアクティブなシートになります。必要に応じて、ソースシートを再度非表示にします。

于 2014-08-14T09:17:04.353 に答える
2

シートを別のブックにコピーしているときに、同様の問題に直面しました。過去に問題が発生したため、「activesheet」の使用は避けたいと思います。したがって、私は自分のニーズに合わせてこれを実行する関数を作成しました。私がしたようにグーグル経由で到着する人のためにここにそれを追加します:

ここでの主な問題は、表示されているシートを最後のインデックス位置にコピーすると、Excelがシートを表示されているシートの最後に再配置することです。したがって、シートを最後に表示されたシートの後の位置にコピーすると、この問題がソートされます。隠しシートをコピーしている場合でも。

Function Copy_WS_to_NewWB(WB As Workbook, WS As Worksheet) As Worksheet
    'Creates a copy of the specified worksheet in the specified workbook
    '   Accomodates the fact that there may be hidden sheets in the workbook
    
    Dim WSInd As Integer: WSInd = 1
    Dim CWS As Worksheet
    
    'Determine the index of the last visible worksheet
    For Each CWS In WB.Worksheets
        If CWS.Visible Then If CWS.Index > WSInd Then WSInd = CWS.Index
    Next CWS
    
    WS.Copy after:=WB.Worksheets(WSInd)
    Set Copy_WS_to_NewWB = WB.Worksheets(WSInd + 1)

End Function

この関数を元の質問(つまり、同じワークブック内)に使用するには、次のような方法で実行できます...

Set test = Copy_WS_to_NewWB(Workbooks(1), Workbooks(1).Worksheets(1))
test.name = "test sheet name"

2020年4月11日から–user3598756を編集上記のコードのわずかなリファクタリングを追加

Function CopySheetToWorkBook(targetWb As Workbook, shToBeCopied As Worksheet, copiedSh As Worksheet) As Boolean
    'Creates a copy of the specified worksheet in the specified workbook
    '   Accomodates the fact that there may be hidden sheets in the workbook

    Dim lastVisibleShIndex As Long
    Dim iSh As Long

    On Error GoTo SafeExit
    
    With targetWb
        'Determine the index of the last visible worksheet
        For iSh = .Sheets.Count To 1 Step -1
            If .Sheets(iSh).Visible Then
                lastVisibleShIndex = iSh
                Exit For
            End If
        Next
    
        shToBeCopied.Copy after:=.Sheets(lastVisibleShIndex)
        Set copiedSh = .Sheets(lastVisibleShIndex + 1)
    End With
    
    CopySheetToWorkBook = True
    Exit Function
    
SafeExit:
    
End Function

異なる(より説明的な?)変数名を使用する以外に、リファクタリングは以下を巧みに処理します。

  1. 返された(コピーされた)ワークシートを関数パラメーターに含めながら関数型を `ブール値に変換すると、これがリストされ、呼び出し元のSubが次のようなエラーを処理できるようになります。

     Dim WB as Workbook: Set WB = ThisWorkbook ' as an example
     Dim sh as Worksheet: Set sh = ActiveSheet ' as an example
     Dim copiedSh as Worksheet
     If CopySheetToWorkBook(WB, sh, copiedSh) Then
         ' go on with your copiedSh sheet
     Else
         Msgbox "Error while trying to copy '" & sh.Name & "'" & vbcrlf & err.Description
     End If
    
  2. For-Nextループは、最後のシートインデックスから逆方向にステップし、最初に表示されたシートの発生時に終了します。これは、「最後の」表示されたシートの後にあるためです。

于 2016-12-07T20:01:03.737 に答える
0

@Siddharth Routのコードに基づいて次のコードを使用する場合は、アクティブ化されているかどうかに関係なく、コピーしたばかりのシートの名前を変更します。

Sub Sample()

    ThisWorkbook.Sheets(1).Copy After:=Sheets(Sheets.Count)
    ThisWorkbook.Sheets(Sheets.Count).Name = "copied sheet!"

End Sub
于 2015-04-24T10:47:42.223 に答える
0

このコードを先頭に追加します。

    Application.ScreenUpdating = False
     With ThisWorkbook
      Dim ws As Worksheet
       For Each ws In Worksheets: ws.Visible = True: Next ws
     End With

このコードを最後に追加します。

    With ThisWorkbook
     Dim ws As Worksheet
      For Each ws In Worksheets: ws.Visible = False: Next ws
    End With
     Application.ScreenUpdating = True

最初のシートよりも多くをアクティブにして表示したい場合は、最後にコードを調整します。次のような:

     Dim ws As Worksheet
      For Each ws In Worksheets
       If ws.Name = "_DataRecords" Then

         Else: ws.Visible = False
       End If
      Next ws

新しいシートの名前が変更されたことを確認するには、次のようにコードを調整します。

     Sheets(Me.cmbxSheetCopy.value).Copy After:=Sheets(Sheets.Count)
     Sheets(Me.cmbxSheetCopy.value & " (2)").Select
     Sheets(Me.cmbxSheetCopy.value & " (2)").Name = txtbxNewSheetName.value

このコードは、(ドロップダウンボックスから選択した)特定のシートを新しいシートにコピーし、ユーザー入力を使用して新しいシートの名前を変更できるようにするユーザーフォームからのものです。シートがコピーされるたびに、「(2)」という指定の古いシート名が自動的に付けられることに注意してください。例「OldSheet」は、コピー後、名前変更前に「OldSheet(2)」になります。したがって、名前を変更する前に、プログラムの名前が付いたコピー済みシートを選択する必要があります。

于 2017-06-22T20:34:29.033 に答える
0

「mySheet」という名前のシートをコピーして.CopyAfter:=を使用する場合、Excelは最初にコピーされたシートにまったく同じ名前を付け、「(2)」を追加するだけで、最終的な名前は「mySheet(2)」になります。

隠されているかどうかは関係ありません。それは2行のコードで揺れ動き、ワークブックの最後にコピーされたシートを追加します!!!

例:

Sheets("mySheet").Copy After:=Sheets(ThisWorkbook.Sheets.count)
Sheets("mySheet (2)").name = "TheNameYouWant"

簡単じゃない!

于 2019-05-22T14:37:17.207 に答える
-3

回答:これを見つけました。あなたと共有したいと思います。

Sub Copier4()
   Dim x As Integer

   For x = 1 To ActiveWorkbook.Sheets.Count
      'Loop through each of the sheets in the workbook
      'by using x as the sheet index number.
      ActiveWorkbook.Sheets(x).Copy _
         After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
         'Puts all copies after the last existing sheet.
   Next
End Sub

しかし、質問は、次のコードでシートの名前を変更するために使用できますか?はいの場合、どのように変更できますか?

Sub CreateSheetsFromAList()
Dim MyCell As Range, MyRange As Range
Set MyRange = Sheets("Summary").Range("A10")
Set MyRange = Range(MyRange, MyRange.End(xlDown))
For Each MyCell In MyRange
Sheets.Add After:=Sheets(Sheets.Count) 'creates a new worksheet
Sheets(Sheets.Count).Name = MyCell.Value ' renames the new worksheet
Next MyCell
End Sub
于 2015-01-16T06:17:02.860 に答える