シートを別のブックにコピーしているときに、同様の問題に直面しました。過去に問題が発生したため、「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
異なる(より説明的な?)変数名を使用する以外に、リファクタリングは以下を巧みに処理します。
返された(コピーされた)ワークシートを関数パラメーターに含めながら関数型を `ブール値に変換すると、これがリストされ、呼び出し元の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
For-Nextループは、最後のシートインデックスから逆方向にステップし、最初に表示されたシートの発生時に終了します。これは、「最後の」表示されたシートの後にあるためです。