PDA

Показать полную графическую версию : [решено] Excel макрос прячущий листы файла


McLotos
05-03-2012, 15:46
Доброго времени суток.
Ситуация такая:
Допустим пользователь зашел в документ 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
05-03-2012, 16:15
McLotos, так у вас в этой части кода
wsSh.Name <> "today()" »
сравнивается напрямую с today().
В кавычках же указывается строковый тип. Функция today() соответсвенно не выполняется.
Попробуйте тут так:
CStr(Today())

McLotos
05-03-2012, 16:19
sub or function not defined

Iska
05-03-2012, 16:38
sub or function not defined »
Потому что функции today() в VBA не существует. Есть функция «Now()», и функция «Format()», позволяющая получить заданный вид даты. Например:
Debug.Print Format(Now(), "YYYY.MM.DD")

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

McLotos
05-03-2012, 16:48
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
05-03-2012, 18:56
позже уже наткнулся на today(). »
Где наткнулись?

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
06-03-2012, 07:50
Worksheet Формат даты по умолчанию: 05.03.2012 9:48:48

Worksheet 01.01.2012
Worksheet 02.01.2012
Worksheet 03.01.2012
и так далее до 31.12.2012

Iska
06-03-2012, 12:26
McLotos, спасибо, ясно.

Вроде как срабатывает, но как-то странно. Unable to set the Visible property of the Worksheet class »
В рабочей книге должен оставаться видимым хотя бы один рабочий лист или диаграмма. Это тот самый случай, про который я писал выше:
И, кстати: не забудьте предусмотреть случай, когда название ни одного листа не совпадёт с текущей датой. »
В данном случае просто ошибка несовпадения, но результат — всё равно налицо.

Добавьте следующий код в рабочую книгу:
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()».




© OSzone.net 2001-2012