2016-05-31 4 views
0

Я написал код для изменения цветового формата определенных ячеек на каждом листе (у меня есть 12 похожих листов [Листы (1) -листы (12)] , и сводный лист (Таблицы (13)).Почему макрос предназначен для листов (13), выполняемых на листах (12)

Когда я запустил его, код, который я намереваюсь выполнить на листах (13), выполняется в таблицах (12). Конечно, я могу отделить код и выполнить код для 13-го листа исключительно, но я хотел бы понять, почему это не работает.

Sub forEachWs() 
Dim x As Long 
Dim ws As Sheets 

For x = 1 To 12 
ThisWorkbook.Sheets(x).Activate 
    Call changecolormonths 
    Range("A2").Select 
Next x 

If x = 13 Then 
Call changesummarycolor 'this is the code that is wrongly executed at sheet 12 
End If 
End Sub 
+1

Теперь, когда вы изменили код, мой комментарий не имеет смысла. но с новым кодом вы не активируете лист 13, так что он использует последний активный лист, который равен 12. –

+3

Вы должны передать лист как переменную в подменю 'changesummarycolor' и избежать активации всего. –

+1

x = 13 из-за цикла 'for'. Следующий x после 12 равен 13, и петля завершается. Но даже если x равно 13, код внутри цикла не выполнялся для x = 13 (только для x от 1 до 12). Самое простое - добавить 'thisworkbook.Sheets (13) .activate' перед вызовом' changesummarycolor', даже если я не занимаюсь более чем использованием 'select' или' activate'. –

ответ

0

Вы должны кодировать явно. Избегайте использования 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 и, следовательно, не может проверить код выше. Я просто переписал его с головы. Следовательно, это может потребовать некоторой настройки. Тем не менее, изменения были минимальными, и я уверен, что он должен работать по назначению. Тем не менее, не стесняйтесь говорить мне, если что-то пойдет не так. :)

+0

Наконец-то способный попробовать ваш код .. Он дает erro «Ошибка компиляции: метод или элемент данных не найден», когда он ссылается на подпрограмму Sub changecolormonths (ws As Worksheet, wsSUM As Worksheet). Также не забывайте объяснять, когда мы должны напишите, как это [changecolormonths (ws, wsSUM)] - вызовите подпрограмму и что-то в скобках за ней? –

+0

Я просто сделал две небольшие корректировки кода. Теперь он работает безупречно. Тем не менее, я не уверен, что вы хотите написать 'headercolor = .Range (« B24 »). Значение' или 'headercolor = .Range (« B24 »). Interior.ColorIndex'. Я оставлю его вам, чтобы при необходимости настроить его. Квадратные скобки, которые вы предлагаете, не нужны (как вы можете видеть в приведенном выше коде). Ваш вопрос: «... что-то в скобках за этим?» Я не совсем понимаю. Пожалуйста, уточните, чего вы хотите добиться, сделав это. – Ralph

Смежные вопросы