Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Excel макрос прячущий листы файла (http://forum.oszone.net/showthread.php?t=229586)

McLotos 05-03-2012 15:46 1872863

Excel макрос прячущий листы файла
 
Доброго времени суток.
Ситуация такая:
Допустим пользователь зашел в документ 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 1872884

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

Цитата McLotos
wsSh.Name <> "today()" »

сравнивается напрямую с today().
В кавычках же указывается строковый тип. Функция today() соответсвенно не выполняется.
Попробуйте тут так:
Код:

CStr(Today())

McLotos 05-03-2012 16:19 1872886

sub or function not defined

Iska 05-03-2012 16:38 1872899

Цитата:

Цитата McLotos
sub or function not defined »

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

Debug.Print Format(Now(), "YYYY.MM.DD")
И, кстати: не забудьте предусмотреть случай, когда название ни одного листа не совпадёт с текущей датой.

McLotos 05-03-2012 16:48 1872907

Код:

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 1873004

Цитата:

Цитата McLotos
позже уже наткнулся на 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 1873285

Код:

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 1873417

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

Цитата:

Цитата McLotos
Вроде как срабатывает, но как-то странно. Unable to set the Visible property of the Worksheet class »

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

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

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

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

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()».


Время: 20:57.

Время: 20:57.
© OSzone.net 2001-