VBA - [решено] Excel макрос прячущий листы файла

Ответить
Аватара пользователя
McLotos

VBA - [решено] Excel макрос прячущий листы файла

Сообщение McLotos »

Доброго времени суток.

Ситуация такая:

Допустим пользователь зашел в документ 10 мая 2012 года, как сделать чтобы он смог видеть только лист, который называется 10.05.2012, а все остальные листы были скрыты.

Сделал вот так

Т.е. логически должно быть так

макрос срабатывает при запуске документа (название Auto_open)

today() - стандартная функция, опрпделяющая сегодняшнюю дату

Макрос должен скрывать все листы, в которых название не соответствует сегодняшней дате



Код:

Код: Выделить всё

Sub Auto_open()
        Dim wsSh As Object
    For Each wsSh In ActiveWorkbook.Sheets
        If wsSh.Name  "today()" Then wsSh.Visible = xlSheetVeryHidden
    Next wsSh
End Sub
Аватара пользователя
LilLoco

Re: VBA - [решено] Excel макрос прячущий листы файла

Сообщение LilLoco »

McLotos, так у вас в этой части кода


Цитата McLotos:



wsSh.Name "today()"
VBA - [решено] Excel макрос прячущий листы файла




сравнивается напрямую с today().

В кавычках же указывается строковый тип. Функция today() соответсвенно не выполняется.

Попробуйте тут так:



Код:

Код: Выделить всё

CStr(Today())
Аватара пользователя
McLotos

Re: VBA - [решено] Excel макрос прячущий листы файла

Сообщение McLotos »

Цитата McLotos:



sub or function not defined
VBA - [решено] Excel макрос прячущий листы файла




Потому что функции today() в VBA не существует. Есть функция «Now()», и функция «Format()», позволяющая получить заданный вид даты. Например:



Код:

Код: Выделить всё

Debug.Print Format(Now(), "YYYY.MM.DD")

И, кстати: не забудьте предусмотреть случай, когда название ни одного листа не совпадёт с текущей датой.
Аватара пользователя
McLotos

Re: VBA - [решено] Excel макрос прячущий листы файла

Сообщение McLotos »

Код:

Код: Выделить всё

Sub Auto_open()
        Dim wsSh As Object
    For Each wsSh In ActiveWorkbook.Sheets
        If wsSh.Name  Now() Then wsSh.Visible = xlSheetVeryHidden
    Next wsSh
End Sub

Срабатывает, хотя странно, я как раз с такого варианта и начал, это позже уже наткнулся на today().

Вроде как срабатывает, но как-то странно. Unable to set the Visible property of the Worksheet class
Аватара пользователя
Iska

Re: VBA - [решено] Excel макрос прячущий листы файла

Сообщение Iska »

Цитата McLotos:



позже уже наткнулся на today().
VBA - [решено] Excel макрос прячущий листы файла




Где наткнулись?



McLotos, временно вставьте следующий код:



Код:

Код: Выделить всё

Sub SomeSub()
    Dim objSheet As Object
    Debug.Print "Формат даты по умолчанию:", Now()
    Debug.Print
    For Each objSheet In ThisWorkbook.Sheets
        Debug.Print TypeName(objSheet), vbTab, objSheet.Name
    Next objSheet
End Sub

в искомую рабочую книгу, исполните его и выложите полученный результат из окна «Immediate» («Ctrl-G») сюда, обрамив его тэгом «code».
Аватара пользователя
McLotos

Re: VBA - [решено] Excel макрос прячущий листы файла

Сообщение McLotos »

Код:

Код: Выделить всё

Worksheet                  Формат даты по умолчанию:    05.03.2012 9:48:48 
Worksheet                   01.01.2012
Worksheet                   02.01.2012
Worksheet                   03.01.2012

и так далее до 31.12.2012
Аватара пользователя
Iska

Re: VBA - [решено] Excel макрос прячущий листы файла

Сообщение Iska »

McLotos, спасибо, ясно.




Цитата McLotos:



Вроде как срабатывает, но как-то странно. Unable to set the Visible property of the Worksheet class
VBA - [решено] Excel макрос прячущий листы файла




В рабочей книге должен оставаться видимым хотя бы один рабочий лист или диаграмма. Это тот самый случай, про который я писал выше:


Цитата Iska:



И, кстати: не забудьте предусмотреть случай, когда название ни одного листа не совпадёт с текущей датой.
VBA - [решено] Excel макрос прячущий листы файла




В данном случае просто ошибка несовпадения, но результат — всё равно налицо.



Добавьте следующий код в рабочую книгу:



Код:

Код: Выделить всё

Sub ShowSheetsByCurrentDateOnly()
    Dim objSheet As Object
    Dim strCurrentDate As String
    strCurrentDate = CStr(Date)
    If SheetExists(ThisWorkbook, strCurrentDate) Then
        ThisWorkbook.Sheets.Item(strCurrentDate).Visible = xlSheetVisible
        For Each objSheet In ThisWorkbook.Sheets
            If objSheet.Name  strCurrentDate Then
                objSheet.Visible = xlSheetVeryHidden
            End If
        Next objSheet
    End If
End Sub
Function SheetExists(objWorkbook As Workbook, strSheetName As String) As Boolean
   On Error Resume Next
   SheetExists = Len(objWorkbook.Sheets.Item(strSheetName).Name)  0
End Function

и вставьте вызов процедуры «ShowSheetsByCurrentDateOnly()» в функцию «Auto_open()».
Ответить

Вернуться в «Программирование и базы данных»