私は「Cover_Sheet」から最終シートまでのすべてのタブを含む「クライアントフレンドリー」バージョンのワークブックを作成しようとしています。ワークブックには「value」シートを複数回コピーするマクロがあり、そのたびに value2、value3 などのように連続的に名前が変更されます。
この機能を使用するには、何枚のシートをコピーする必要があるかわかりませんSheets.Count
。ワークブックには表紙と最終値のタブしかありません。
私は以下のものを使用しようとしています:
Sub Activate_Sheet()
Sheets("Cover_Sheet").Activate
End Sub
Sub ExportExcelWorkbookFinal()
' ----------------------------
' Macro to export the workbook and break the links
' which allows it to be sent on to clients.
Application.ScreenUpdating = False
Sheets(Array("Cover_Sheet", Sheets.Count)).Copy
ActiveSheet.Protect "password"
Application.ScreenUpdating = True
Application.GetSaveAsFilename
End Sub
答え1
Cover_Sheets
コピーしてを指示しているため、「表紙」タブと「最終値」タブのみが表示されますSheets.Count
。は
Sheets.Count
、ワークブック内のシート数を返します。
したがって、シートが 5 枚ある場合、コードは次のように指示します。 コピーしてCover_Sheets
は5
、5
5 番目のシートとして解釈され、最後のシートになります。
正確に何を意味しているのかよく分かりませんが、他の値タブを作成する別のマクロがあると思います。 からCover_Sheets
最後まですべてのシートをコピーする場合は、まずその配列を作成してから、既存の配列を使用することができます。
のインデックスをCover_Sheet
開始点として使用し、 まで進みますSheets.Count
。
Sub ExportExcelWorkbookFinal()
'
' Macro to export the workbook and break the links which allows it to be sent on to clients.
Dim sheetArr As Variant
sheetArr = Evaluate("TRANSPOSE(Row(" & Application.Sheets("Cover_Sheet").Index & ":" & Sheets.Count & "))")
Application.ScreenUpdating = False
Sheets(sheetArr).Copy
ActiveSheet.Protect "password"
Application.ScreenUpdating = True
Application.GetSaveAsFilename
End Sub
ただし、この方法では、新しいワークブックの最初のシートである Cover_Sheet にのみパスワードが設定されます。問題かどうかはわかりません。問題がある場合は、ActiveSheet.Protect "password"
次のコードに置き換えてください。
For Each wsheet In ActiveWorkbook.Worksheets
wsheet.Protect Password:="password"
Next wsheet
ループを使用して、より「通常の」方法で配列を埋めることもできますが、この 1 行のアプローチは興味深いと思います。
Dim i As Long, sheetArr() As Variant
ReDim sheetArr(Application.Sheets("Cover_Sheet").Index To Sheets.Count)
For i = LBound(sheetArr) To UBound(sheetArr)
sheetArr(i) = i
Next