Вы должны кодировать явно. Избегайте использования Select
и ActiveWorksheet
. не ссылайтесь диапазон без указания листа вверх (на котором вы хотите использовать определенный диапазон). Не позволяйте VBA делать предположения для вас, но сообщать VBA, что вы хотите. Быть конкретной.
Вот ваш код, переписанный с явными ссылками. Это должно решить вашу проблему.
Option Explicit
Sub forEachWs()
Dim ws As Worksheet
Dim wsSUM As Worksheet
Dim bolfound As Boolean
bolfound = False
For Each wsSUM In ThisWorkbook.Worksheets
If wsSUM.Name = "Summary" Then
bolfound = True
Exit For
End If
Next wsSUM
If bolfound = False Then
MsgBox "Couldn't find the summary sheet." & Chr(10) & "Aborting..."
Exit Sub
End If
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> wsSUM.Name Then
Call changecolormonths(ws, wsSUM)
ws.Activate
ws.Range("A2").Select
Else
Call changesummarycolor(wsSUM)
End If
Next ws
End Sub
'below code are meant for Sheets(1) to Sheets(12)
Sub changecolormonths(ws As Worksheet, wsSUM As Worksheet)
Dim headercolor As Long
Dim proccolor As Long
headercolor = wsSUM.Range("B24").Value
proccolor = wsSUM.Range("B25").Value
With ws
.Range("A1:H1,L8:M8,K16:M16,L32:N32,L40:N40").Interior.Pattern = xlSolid 'header,total color
.Range("A1:H1,L8:M8,K16:M16,L32:N32,L40:N40").Interior.ColorIndex = headercolor
.Range("A1:H1,L8:M8,K16:M16,L32:N32,L40:N40").Font.ColorIndex = 2
.Range("K9:K15,K33:K39").Interior.Pattern = xlSolid 'procedure
.Range("K9:K15,K33:K39").Interior.ColorIndex = proccolor
End With
End Sub
'below code are meant for Sheets(13)
Sub changesummarycolor(wsSUM As Worksheet)
Dim headercolor As Long
Dim proccolor As Long
With wsSUM
headercolor = .Range("B24").Value
proccolor = .Range("B25").Value
.Range("B4:N4 , A12: N12 , N5: N11").Interior.Pattern = xlSolid 'summary header,total color
.Range("B4:N4 , A12: N12 , N5: N11").Interior.ColorIndex = headercolor
.Range("B4: N4 , A12: N12 , N5: N11").Font.ColorIndex = 2 'summary procedure
.Range("A5:A11").Interior.Pattern = xlSolid
.Range("A5:A11").Interior.ColorIndex = proccolor
End With
End Sub
Обратите внимание, что у меня нет файла Excel и, следовательно, не может проверить код выше. Я просто переписал его с головы. Следовательно, это может потребовать некоторой настройки. Тем не менее, изменения были минимальными, и я уверен, что он должен работать по назначению. Тем не менее, не стесняйтесь говорить мне, если что-то пойдет не так. :)
Теперь, когда вы изменили код, мой комментарий не имеет смысла. но с новым кодом вы не активируете лист 13, так что он использует последний активный лист, который равен 12. –
Вы должны передать лист как переменную в подменю 'changesummarycolor' и избежать активации всего. –
x = 13 из-за цикла 'for'. Следующий x после 12 равен 13, и петля завершается. Но даже если x равно 13, код внутри цикла не выполнялся для x = 13 (только для x от 1 до 12). Самое простое - добавить 'thisworkbook.Sheets (13) .activate' перед вызовом' changesummarycolor', даже если я не занимаюсь более чем использованием 'select' или' activate'. –