Поскольку ваш основной код повторяется, вы можете создать для него отдельный метод, а затем, перебирая листы, установить объект листа на лист, а затем применить код.
Точнее,Вы могли бы создать массив имен листов, затем зациклить массив, назначив каждому объекту листа и затем вызывая код на нем.
Я не стал внимательно изучать ваш код, но выможет потребоваться обобщить и абстрагировать ваш код немного больше, но общее правило верно.
Sub foo()
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
'''call to common method goes here
If... (sheet name matches one of several
commonMethod(wks)
End Iif
Next wks
End Sub
Sub commonMethod(wks As Worksheet)
Dim sh As Worksheet
Dim cell As Range
wks.Activate
wks.ClearContents
wks.Range("A2").Value = "Project"
wks.Range("A3").Select
For Each sh In ActiveWorkbook.Worksheets
If sh.Name <> "Material Summary" And sh.Name <> "Company Labor" And sh.Name <> "Contractor Labor Summary" And sh.Name <> "Forecast" Then
ActiveCell.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
"'" & sh.Name & "'" & "!A1", TextToDisplay:=sh.Name
ActiveCell.Offset(1, 0).Select
End If
Next sh
End Sub
Как создать и выполнить итерацию массива:
''create string of sheets
Dim cStrSheets As String = "Contractor Labor Summary," _
& "Material Summary,Company Labor,Forecast" ' Worksheet List
''creates array from string
Dim arrSheets as variant = sp,it(cstrSheets,",")
Изменить подпись наметод th следующий:
Sub commonMethod(wks As Worksheet, arrSheets as variant)
Чтобы заменить эту строку:
If sh.Name <> "Material Summary" And sh.Name <> "Company Labor" And sh.Name <> "Contractor Labor Summary" And sh.Name <> "Forecast"
Вы можете использовать что-то вроде этого:
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Новая строка будет:
If IsInArray(sh.Name, arrSheets) = false then
Надеюсь, это поможет.