У меня есть 13 листов с 12 из них на каждый месяц. В каждом из 12 листов есть ячейка с названием месяца.

Я получил скрипт VBA, чтобы проверить, соответствует ли текущий месяц ячейке, и соответственно изменить цвет вкладки, но для обновления требуется расчет в листе.

Private Sub Worksheet_Change(ByVal Target As Range)
If Format(Date, "MMMM") = Range("E3").Value Then
    Me.Tab.ColorIndex = 10
Else
    Me.Tab.ColorIndex = xlColorIndexNone
End If
End Sub

Если я перестану обновлять лист за последний месяц и перейду на следующий лист, обе вкладки будут выделены, поскольку предыдущий лист не был обновлен. Я просто хочу, чтобы рабочий лист текущего месяца был выделен.

Есть ли способ пересчитать все листы при открытии рабочей книги и смене вкладок?

2 ответа2

0

Да. В редакторе VB перейдите в объект ThisWorkbook. В верхней части окна кода вы увидите выпадающий список с надписью «(Общие)» или "Рабочая книга". Если написано «(Общие)», откройте выпадающий список и выберите "Рабочая книга". Он может сразу же вставить новый саб для вас; если это так, просто удалите это.

Теперь, в правом верхнем углу, у вас есть еще один выпадающий список, который, вероятно, говорит "Открыть". Используйте раскрывающийся список, чтобы выбрать "Открыть", затем снова выберите "Активировать лист". Это должно вставить две новые подпрограммы в окно вашего кода - Workbook_Open и Sheet_Activate . Обратите внимание, что вы действительно хотите создать их, используя выпадающие списки, а не просто вводя имена - они могут работать неправильно, если вы просто введете их.

Теперь вы можете поместить любой код, который вы хотите, в эти подпрограммы, и код будет выполняться, когда он обнаружит рассматриваемое событие (т. Е. Откроет рабочую книгу или выберет любой лист). Точная структура, которую вы запросили, будет выглядеть примерно так:

Private Sub Workbook_Open()
    Application.Calculate
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Application.Calculate
End Sub

Я не говорю, что это самый эффективный способ сделать это, но это должно ответить на ваш вопрос.

0

В модуле ThisWorkbook просто поставил

Option Explicit

Private Sub Workbook_Open()
    Dim mySheet As Worksheet
    For Each mySheet In ThisWorkbook.Sheets
        If mySheet.Cells(3, 5).Value = Format(Date, "MMMM") Then
            mySheet.Tab.ColorIndex = 10
        Else: mySheet.Tab.ColorIndex = xlColorIndexNone
        End If
    Next
End Sub

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .