Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню FAQ | Макросы | Sheets & Worksheets


Rambler's Top100


Counter CO.KZ

  1. Как быстро перейти в модуль соответствующего листа ? 25.01.2005
  2. Как создать новый рабочий лист и присвоить ему имя ? 15.02.2005
  3. Как создать сразу несколько рабочих листов ? 15.03.2006
  4. Как добавить лист только нужного типа ? 24.09.2006
  5. Как сделать так, чтобы новый лист был автоматически перемещён в конец ? 09.07.2006
  6. Как после открытия определённой книги, сделать так, чтобы имя нужного рабочего листа = текущей дате ? 29.03.2011
  7. Как в нужной рабочей книге запретить создание новых листов ? 03.07.2007
  8. Как в нужной рабочей книге запретить скрытие листов ? NEW 04.11.2017
  9. Как при создании нового рабочего листа синхронизировать имена этого листа ? 10.03.2007
  10. Как скрыть активный лист средствами VBA ? 2004
  11. Как определить номер (индекс) листа ? 2004
  12. Как узнать сколько страниц в активном листе средствами VBA ? 2004
  13. Как выделить [сгруппировать] сразу все рабочие листы ? 24.03.2006
  14. Как выделить [сгруппировать] сразу несколько рабочих листов? 20.07.2006
  15. Как одновременно (синхронно) изменять данные и параметры форматирования сразу в нескольких рабочих листах ? 22.07.2007
  16. Как выделить и "перебрать" несмежные рабочие листы ? 04.04.2006
  17. Как перебрать в цикле несмежные рабочие листы ? 04.04.2006
  18. Как проверить наличие изменений имени и индекса изначально созданных листов ? 01.01.2007
  19. Как расположить листы в порядке личного предпочтения ? 11.06.2016
  20. Как перемещаться по листам с помощью горячих клавиш ? 08.10.2016
  21. Как сохранить рабочие листы в виде отдельных рабочих книг ? 11.06.2007
  22. Как защитить рабочий лист от ввода с клавиатуры, но не от действий макроса ? Лидер голосования 07.04.2005
  23. Как защитить рабочий лист, но сохранить возможность работы с автофильтром ? 28.03.2006
  24. Как защитить рабочий лист, но сохранить возможность работы со сводной таблицей ? 28.03.2006
  25. Как защитить рабочий лист, но сохранить возможность работы с группой и структурой ? 28.03.2006
  26. Как определить защищён или нет рабочий лист ? 15.03.2006
  27. Как определить, что в защищённом рабочем листе, возможны некоторые программные изменения ? 29.05.2007
  28. Как определить, что разрешено пользователям защищённого рабочего листа ? 31.08.2016
  29. Как защитить/снять защиту у всех сгруппированных листов ? 21.05.2016
  30. Как определить пустой или нет рабочий лист ? 18.03.2007
  31. Как определить существует или нет рабочий лист с определённым именем ? 17.05.2006
  32. Как определить содержит ли рабочая книга скрытые листы ? 06.09.2010
  33. Как удалить лист, в т.ч. и рабочий ? 2004
  34. Как удалить сразу несколько рабочих листов ? 11.02.2007
  35. Как убрать предупреждение о удалении листа ? 2004
  36. Как узнать тип определённого листа ? 24.09.2006
  37. Как изменить цвет ярлычка средствами VBA ? 21.03.2007
  38. Как создать одно событие для всех рабочих листов, в т.ч. и новых ? 27.01.2007
  39. Как запретить любой пересчёт в ячейках рабочего листа ? 11.03.2006
  40. Как ограничить перемещение в рабочем листе нужным диапазоном ячеек ? 11.03.2006
  41. Как перемещаться только по незаблокированным ячейкам ? 29.04.2007
  42. Как определить наличие примечаний в рабочем листе и их количество ? 03.04.2005
  43. Как программно удалить все гиперссылки в нужном рабочем листе ? 31.03.2007
  44. Как определить имя рабочего листа, используемое в среде VBA ? 05.05.2005
  45. Как получить доступ к рабочему листу не используя его индекс или имя ? 18.04.2010
  46. Как получить доступ к рабочему листу, ячейкам, с помощью кодового имени в виде переменной ? 18.04.2010
  47. Как вручную отобразить листы в надстройке .xla ? 05.07.2005

  • Ответ :
    Выделите нужный рабочий лист. Затем нажмите на правую кнопку мышки и в появившемся контекстном меню выберите команду Исходный текст.
  • Ответ :
  • Worksheets.Add.Name = "Temp" & Fix(1000 * Rnd)
    Комментарий :
  • - Имя нового рабочего листа не должно совпадать с именами листов (Sheets)
  • - Имя листа не должно содержать более 31 символа.
  • - Имя листа не должно содержать следующих символов / \ ? : *
    кроме того, существует ограничение на порядок ввода [ ]
  • - Нельзя добавить новый лист, если структура рабочей книги защищена [FAQ]
  • Ответ :
  • Worksheets.Add Count:=3
    При желании можно явно указать тип создаваемого листа и/или использовать семейство .Sheets вместо .Worksheets
    Worksheets.Add Count:=3, Type:=xlWorksheet
    Sheets.Add Count:=3
    Sheets.Add Count:=3, Type:=xlWorksheet
    Комментарий : Нельзя добавить новые листы, если структура рабочей книги защищена [FAQ]
  • Ответ :
  • With ThisWorkbook.Sheets
         .Add Type:=xlWorksheet            'Рабочий лист
         .Add Type:=xlExcel4MacroSheet     'Лист макросов
         .Add Type:=xlExcel4IntlMacroSheet 'Международн. лист макросов
         .Add Type:=xlChart                'Лист диаграммы
         .Add Type:=xlDialogSheet          'Лист диалога (диалоговый лист)
         .Add Type:=xlModule               'Лист модуля (модульный лист)
         'Начиная с MS Excel 97 будет отображаться как стандартный модуль
    End With
    Комментарий : см. выше
  • Ответ : Актуально для MS Excel 97, 2000, XP Скачать пример

    Разместите в модуле ThisWorkbook(ЭтаКнига) :
  • Private Sub Workbook_NewSheet(ByVal Sh As Object)
        Sh.Move After:=Me.Sheets(Me.Sheets.Count)
    End Sub

  • Ответ :

    Вариант I.

    Разместите в модуле ThisWorkbook(ЭтаКнига) :
  • Private Sub Workbook_Open()
        Лист1.Name = Date 'Date$
    End Sub
    Примечание : Если структура рабочей книги защищена [FAQ], и стало быть, переименование листов невозможно, то возникнет ошибка, которую можно избежать, если добавить небольшую проверку.
    Private Sub Workbook_Open()
        If Not Me.ProtectStructure _
        Then Лист1.Name = Date 'Date$
    End Sub
    Вариант II.

    Разместите в в любом стандартном модуле нужной рабочей книги :
    Private Sub Auto_Open()
        ThisWorkbook.Worksheets(1).Name = Date 'Date$
    End Sub
    Тоже самое, но с предварительной проверки (см. примечание в первом варианте)
    Private Sub Auto_Open()
        If Not ThisWorkbook.ProtectStructure Then _
        ThisWorkbook.Worksheets(1).Name = Date 'Date$
    End Sub
    Комментарий : Если отображение даты в виде ДД.ММ.ГГГГ (или ММ-ДД-ГГГГ) Вас не устраивает, то воспользуйтесь, например, VB функцией Format
    ThisWorkbook.Worksheets(1).Name = Format(Now, "Long Date")

  • Ответ :

    Если запретить создание новых листов, путём защиты структуры рабочей книги [FAQ], нельзя, то можно воспользоваться событием рабочей книги Workbook_NewSheet() и удалять лист(ы) сразу после их создания. Для этого, просто разместите в модуле ThisWorkbook(ЭтаКнига) следующий код :
  • Private Sub Workbook_NewSheet(ByVal Sh As Object)
        Application.DisplayAlerts = False
        Sh.Delete
        Application.DisplayAlerts = True
    End Sub

  • Ответ :

    Если для Вас принципиально, чтобы при работе с рабочей книгой, нельзя было скрыть лист (причём не только рабочий), то Вы можете просто защитить структуру книги.

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

  • Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
        Sh.Visible = True
    End Sub
    Если же пользователь может скрывать сразу несколько листов, например, предварительно сгруппировав их, то вышеопубликованный код позволит сделать видимым только один лист из группы. Чтобы отобразить все листы, используйте такой финт :
    Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
        If Sh.Visible = True Then Exit Sub
        
        Dim iList As Worksheet
        For Each iList In Me.Worksheets
            iList.Visible = True
        Next
    End Sub
    Примечание : Если существует вероятность, что листы могут быть скрыты, например, во время предыдущей работы с книгой, когда макросы были отключены, или же листы были скрыты программно, то просто уберите проверку.
  • Ответ :
  • ActiveSheet.Visible = False
    ActiveSheet.Visible = xlSheetHidden

    ActiveSheet.Visible = xlVeryHidden
    Примечание : При применении xlVeryHidden - увидеть и отобразить лист можно только программно или вручную, но только в редакторе VBA.

    Для того чтобы скрыть определённый лист используйте этот код :
    Worksheets(1).Visible = False
    Worksheets("Лист1").Visible = False

  • Ответ :
  • iIndex = ActiveSheet.Index ' Вариант I.

    iName = ActiveSheet.Name ' Вариант II.
    iIndex = Worksheets(iName).Index

  • Ответ :

    Вариант I.
  • iKolPage = ExecuteExcel4Macro("GET.DOCUMENT(50)")
    MsgBox iKolPage
    Вариант II. Актуально для MS Excel 97, 2000, XP
    iHPageBr = ActiveSheet.HPageBreaks.Count + 1
    iVPageBr = ActiveSheet.VPageBreaks.Count + 1
    iKolPage = iHPageBr * iVPageBr
    MsgBox iKolPage
    Примечание : Не забудьте предварительно выполнить Preview
  • Ответ :
  • Worksheets.Select
    Примечание : Если рабочая книга содержит хотя бы один скрытый рабочий лист, то Вы получите ошибку, которую можно избежать, если выделить все листы рабочей книги (не только рабочие)
    With Application.CommandBars.FindControl(Id:=946)
         .Enabled = True
         .Execute
    End With
    Если необходимо выделить именно рабочие листы, то :
    For Each iList In Worksheets
        If iList.Visible = True Then
           iList.Select Replace:=False
        End If
    Next

  • Ответ :
    Вот так можно выделить активный лист и необходимый.
  • Worksheets(3).Select Replace:=False
    Worksheets("Лист3").Select Replace:=False
    Для группировки большего количества листов используйте первую часть следующего совета [FAQ89]

    Примечание : Рабочий лист с индексом(номером) 3 и именем "Лист3" должен существовать и не быть скрытым, иначе Вы получите ошибку.
  • Ответ :
  • Worksheets(Array(1, 3, 5)).Select
    Worksheets(Array("Лист1", "Лист3", "Лист5")).Select
    For Each iList In ActiveWindow.SelectedSheets
        MsgBox "Имя рабочего листа : " & iList.Name & vbCrLf & _
        "Индекс рабочего листа : " & iList.Index, vbSystemModal, ""
    Next
    Примечание : Если хотя бы один из рабочих листов окажется скрытым, то Вы получите ошибку.
  • Ответ :

    Вариант I.
  • iListIndex = Array(1, 3, 5)

    For Each iList In Worksheets(iListIndex)
        MsgBox "Имя рабочего листа : " & iList.Name
    Next
    iListNames = Array("Лист1", "Лист3", "Лист5")

    For Each iList In Worksheets(iListNames)
        MsgBox "Индекс рабочего листа : " & iList.Index
    Next
    Вариант II.
    Set iListMassiv = Worksheets(Array(1, 3, 5))

    For Each iList In iListMassiv
        MsgBox "Имя рабочего листа : " & iList.Name
    Next
    Set iListMassiv = Worksheets(Array("Лист1", "Лист3", "Лист5"))

    For Each iList In iListMassiv
        MsgBox "Индекс рабочего листа : " & iList.Index
    Next
    Вариант III.
    For Each iList In Worksheets(Array(1, 3, 5))
        MsgBox "Имя рабочего листа : " & iList.Name
    Next
    For Each iList In Worksheets(Array("Лист1", "Лист3", "Лист5"))
        MsgBox "Индекс рабочего листа : " & iList.Index
    Next

  • Ответ : Скачать пример
    Для того, чтобы определить порядок всех изначально заданных листов, т.е. проверить не было ли изменений в названии листов и их расположении, можно использовать любой из представленных вариантов.

    Вариант I.
  • Option Compare Text
    
    Private Sub Auto_Open()
        For Each iSheet In Sheets
            iSheetName = Choose(iSheet.Index, "Приход", "Расход", "График")
            If Not IsNull(iSheetName) Then
               If iSheet.Name <> iSheetName Then
                  MsgBox "Лист : " & iSheet.Name & _
                  " не соответствует заданным параметрам", , ""
               End If
            Else
               MsgBox "Лист : " & iSheet.Name & _
               " не соответствует заданным параметрам", , ""
            End If
        Next
    End Sub
    Вариант II.
    Option Compare Text: Option Base 1
    
    Private Sub Auto_Open()
        iSheets = Array("Приход", "Расход", "График")
        For Each iSheet In Sheets
            If iSheet.Index <= UBound(iSheets) Then
               If iSheet.Name <> iSheets(iSheet.Index) Then
                  MsgBox "Лист : " & iSheet.Name & _
                  " не соответствует заданным параметрам", , ""
               End If
            Else
               MsgBox "Лист : " & iSheet.Name & _
               " не соответствует заданным параметрам", , ""
            End If
        Next
    End Sub
    Примечание :
  • - Обратите внимание на то, что в данном примере используется семейство Sheets, которое включает в себя не только рабочие листы, поэтому, будьте внимательны при перечислении имён листов и их индексов.
  • - Если листов очень много, то используя ячейки рабочего листа, можно создать список содержащий имена этих листов, и использовать этот список в дальнейшем. Правда, это потребует незначительного изменения первоначального варианта.
  • Ответ :

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

    Если же этот способ неприемлем, то можно перемещать листы, например, сразу после открытия книги, т.е.

    Вариант I. (сокращённый)
  • Private Sub Auto_Open()
        For Each iSheet In Array("Приход", "Расход", "График")
            iCount& = iCount& + 1
            Sheets(iSheet).Move Before:=Sheets(iCount&)
        Next
    End Sub
    Вариант II. (сокращённый)
    Private Sub Auto_Open()
        iArr = Array("Приход", "Расход", "График")
    
        For iCount& = 0 To UBound(iArr)
            Sheets(iArr(iCount&)).Move Before:=Sheets(iCount& + 1)
        Next
    End Sub
    Если же существует вероятность, что лист может быть переименован/удалён, то для того, чтобы избежать ошибки, можно, либо предварительно проверять его наличие [FAQ94], либо использовать :

    Вариант I. (полный)
    Private Sub Auto_Open()
        On Error Resume Next
    
        For Each iSheet In Array("Приход", "Расход", "График")
            Set iSheet = Sheets(iSheet)
            If Not iSheet Is Nothing Then
               iCount& = iCount& + 1
               iSheet.Move Before:=Sheets(iCount&)
               Set iSheet = Nothing
            End If
        Next
    End Sub
    Вариант II. (полный)
    Private Sub Auto_Open()
        On Error Resume Next
    
        For Each iSheet In Array("Приход", "Расход", "График")
            Set iSheet = Sheets(iSheet)
            If Err.Number = 0 Then
               iCount& = iCount& + 1
               iSheet.Move Before:=Sheets(iCount&)
            End If
            Err.Clear
        Next
    End Sub
    Вариант III.
    Private Sub Auto_Open()
        iArr1 = Array("Приход", "Расход", "График")
        ReDim iArr2(1 To Sheets.Count)
        
        For iCount& = 1 To UBound(iArr2)
            iArr2(iCount&) = Sheets(iCount&).Name
            'Sheets(iCount&).Visible = True 'xlSheetVisible
        Next
       
        For iCount& = 0 To UBound(iArr1)
            If Not IsError(Application.Match(iArr2, iArr1(iCount&), 0)) _
            Then Sheets(iArr1(iCount&)).Move Before:=Sheets(iCount& + 1)
        Next
    End Sub
    Примечание :
  • - Не забывайте, что имя листа это всегда текст, даже если оно содержит только цифры, например, "2" или "101"
  • - Если значение свойства Visible установлено как xlVeryHidden/xlSheetVeryHidden, то при попытке перемещения такого листа возникнет ошибка.
  • - Если листов очень много, то используя ячейки рабочего листа, можно создать список содержащий имена этих листов, и использовать этот список в дальнейшем. Правда, это потребует незначительного изменения вышеопубликованных вариантов.
  • Ответ : Скачать пример

    Если при работе с определённой рабочей книгой Вам приходится постоянно перемещаться между листами, но использование стандартных сочетаний клавиш CTRL+PAGEDOWN и CTRL+PAGEUP Вам не подходит. И хочется, чтобы перемещение происходило после нажатия одной единственной клавиши, то ниже опубликован пример, где для перемещения используются клавиши RIGHT(стрелка вправо) и LEFT(стрелка влево) Обратите внимание на то, что использование этих клавиш, для перемещения между листами, делает невозможным их применение для перемещений между ячейками. Поэтому, если активация ячеек с помощью этих стрелок для Вас важнее, то поищите альтернативу этим клавишам.

    Модуль книги ThisWorkbook (ЭтаКнига)
  • Private Sub Workbook_Activate()
        Application.OnKey "{RIGHT}", "NextSheet"
        Application.OnKey "{LEFT}", "PrevSheet"
    End Sub
    
    Private Sub Workbook_Deactivate()
        Application.OnKey "{RIGHT}"
        Application.OnKey "{LEFT}"
    End Sub
    Любой стандартный модуль (выберите один вариант)

    Вариант I.
    Private Sub NextSheet()
        If Not ActiveSheet.Next Is Nothing Then
           ActiveSheet.Next.Activate
        End If
    End Sub
    
    Private Sub PrevSheet()
        If Not ActiveSheet.Previous Is Nothing Then
           ActiveSheet.Previous.Activate
        End If
    End Sub
    Вариант II.
    Private Sub NextSheet()
        If ActiveSheet.Index < Sheets.Count Then
           Sheets(ActiveSheet.Index + 1).Activate
        End If
    End Sub
    
    Private Sub PrevSheet()
        If ActiveSheet.Index > 1 Then
           Sheets(ActiveSheet.Index - 1).Activate
        End If
    End Sub
    Комментарий : Если в выбранной рабочей книге будут наличествовать скрытые листы, то при попытке активации скрытого листа, произойдёт активация самого первого видимого листа, находящегося после скрытого. Поэтому, первоначальная версия макроса PrevSheet не сможет выполнить поставленную нами задачу и нам придётся этот макрос переписать. Обратите внимание на то, что использование новой версии NextSheet не носит обязательного характера, ибо старая вполне справится со своей задачей.

    Вариант I.
    Private Sub NextSheet() 'Можно использовать старый вариант
        Dim iList As Object: Set iList = ActiveSheet.Next
        Do Until iList Is Nothing
           If iList.Visible = True Then iList.Select: Exit Do
           Set iList = iList.Next
        Loop
    End Sub
    
    Private Sub PrevSheet()
        Dim iList As Object: Set iList = ActiveSheet.Previous
        Do Until iList Is Nothing
           If iList.Visible = True Then iList.Select: Exit Do
           Set iList = iList.Previous
        Loop
    End Sub
    Вариант II.
    Private Sub NextSheet() 'Можно использовать старый вариант
        For iCount& = ActiveSheet.Index + 1 To Sheets.Count
            If Sheets(iCount&).Visible = True Then
               Sheets(iCount&).Select: Exit For
            End If
        Next
    End Sub
    
    Private Sub PrevSheet()
        For iCount& = ActiveSheet.Index - 1 To 1 Step -1
            If Sheets(iCount&).Visible = True Then
               Sheets(iCount&).Select: Exit For
            End If
        Next
    End Sub
    Примечание : Если Вы уверены, что стандартным сочетаниям клавиш CTRL+PAGEDOWN и CTRL+PAGEUP не были назначены макросы и они не были заблокированы, то Вы можете использовать более лаконичные варианты, а именно.
    SendKeys "^{PGDN}"
    SendKeys "^{PGUP}"

  • Ответ : Скачать пример
    Для того, чтобы сохранить все рабочие листы (в т.ч. и скрытые) в виде отдельных .xls файлов, имена которых будут совпадать с именами рабочих листов - источников, можно использовать нижеприведённый макрос, предварительно указав свою папку для сохранения.
  • Private Sub WorksheetSaveAsFile()
    
    iPath$ = "C:\Мои документы\Архив" 
    
    If Dir(iPath$, vbDirectory) = "" Then
       MsgBox "Указанная папка " & iPath$ & vbNewLine & _ 
       "была удалена, перемещена или переименована ", vbExclamation, ""
       Exit Sub
    End If
    
    On Error GoTo ErrHandler
    
    With Application
         .EnableCancelKey = xlDisabled
         .ScreenUpdating = False
         .DisplayAlerts = False
         .EnableEvents = False
         .Calculation = xlManual
         Dim iWorksheet As Worksheet, iHidden As Boolean
         For Each iWorksheet In .ThisWorkbook.Worksheets
             If iWorksheet.Visible <> True Then
                iHidden = True
                iOldVisible& = iWorksheet.Visible
                iWorksheet.Visible = True
             End If
             iWorksheet.Copy
             With .ActiveSheet
                  .SaveAs FileName:=iPath$ & "\" & .Name
                  .Parent.Close saveChanges:=True
             End With 'Or
             'With .ActiveWorkbook
                   '.Close FileName:=iPath$ & "\" & _
                   '.ActiveSheet.Name, saveChanges:=True
             'End With
             If iHidden = True Then
                iWorksheet.Visible = iOldVisible&
                iHidden = False 'Not iHidden
             End If
         Next
    ErrHandler:
         If Err.Number <> 0 Then
            MsgBox Err.Description, vbCritical, Err.Number
         End If
         .Calculation = xlAutomatic
         .EnableEvents = True
         .DisplayAlerts = True
         .ScreenUpdating = True
         .EnableCancelKey = xlInterrupt
    End With
    
    End Sub
    Комментарий :
  • - Если в выбранной папке будет находиться файл с аналогичным именем, то он будет заменён на новый.
  • - Если в рабочем листе есть ячейки, содержащие более 255 символов, то копирование листа приведёт к усечению таких данных до 255 символов (включительно)
  • - Если структура текущей рабочей книги защищена [FAQ], то копирование скрытых рабочих листов приведёт к возникновению ошибки, которую можно избежать, если добавить соответствующую проверку.
  • Ответ : Вопрос выбран посетителями, Актуально для MS Excel 97, 2000, XP
  • Worksheets(1).Protect UserInterfaceOnly:=True
    При необходимости можно указать нужные аргументы, в том числе и пароль :
    Worksheets(1).Protect Password:="Excel", DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
    Примечание :
  • - Не забывайте, что ввод данных с клавиатуры невозможен, только при условии, что ячейки заблокированы.
  • - При использовании аргумента UserInterfaceOnly возможность изменения в заблокированных ячейках сохраняется только до закрытия рабочей книги.
    Совет : Защитить рабочий лист и установить пароль лучше заранее, в таком случае макрос не будет содержать пароль в открытом виде, но это касается только версий MS Excel 97, 2000. В MS Excel XP, при защите листа с применением пароля, использование аргумента Password обязательно.

  • Ответ : Актуально для MS Excel 97, 2000, XP
  • Worksheets(1).EnableAutoFilter = True
    Worksheets(1).Protect UserInterfaceOnly:=True
    Совет и особенности MS Excel XP [см. выше]
  • Ответ : Актуально для MS Excel 97, 2000, XP
  • Worksheets(1).EnablePivotTable = True
    Worksheets(1).Protect UserInterfaceOnly:=True
    Совет и особенности MS Excel XP [см. выше]
  • Ответ : Актуально для MS Excel 97, 2000, XP
  • Worksheets(1).EnableOutlining = True
    Worksheets(1).Protect UserInterfaceOnly:=True
    Совет и особенности MS Excel XP [см. выше]
  • Ответ :
  • If Worksheets(1).ProtectContents = True Then
       MsgBox "Рабочий лист защищён, а точнее: защищены заблокированные ячейки"
    Else
       MsgBox "Ячейки рабочего листа не защищены"
    End If
    Совет : Для того чтобы проверить защищены или нет об'екты используйте свойство .ProtectDrawingObjects, а для проверки защиты сценариев есть свойство .ProtectScenarios

  • Ответ :
  • If Worksheets(1).ProtectionMode = True Then
       MsgBox "Рабочий лист защищён, но значение аргумента UserInterfaceOnly = True"
    Else
       MsgBox "Рабочий лист :" & vbNewLine & _
       "- незащищён" & vbNewLine & _
       "- или защищён, но значение аргумента UserInterfaceOnly = False"
    End If

  • Ответ : Скачать пример Актуально для MS Excel XP(и старше)

    Для того, чтобы программно определить, разрешено ли пользователям указанного рабочего листа осуществлять перечисленные операции (см. таблицу ниже), достаточно использовать следующий шаблон. Разумеется, указав одно из 11-ти свойств об'екта Protection
  • If Worksheets(1).Protection.AllowInsertingHyperlinks = True Then
       MsgBox "Вставка гиперссылок возможна в защищённом листе, но только в незащищённых ячейках"
    Else
       MsgBox "Вставка гиперссылок возможна только в незащищённом листе"
    End If
    Разрешить всем пользователям этого листа :	
    Удаление столбцов                    	AllowDeletingColumns
    Удаление строк                       	AllowDeletingRows
    Использование автофильтра            	AllowFiltering
    Форматирование ячеек	                AllowFormattingCells
    Форматирование столбцов             	AllowFormattingColumns
    Форматирование строк                 	AllowFormattingRows
    Вставку столбцов                     	AllowInsertingColumns
    Вставку гиперссылок                     AllowInsertingHyperlinks
    Вставку строк                       	AllowInsertingRows
    Сортировку                           	AllowSorting
    Использование отчётов сводной таблицы	AllowUsingPivotTables

  • Ответ :

    Если Вы сгруппировали листы (вручную или программно), то команда Защитить лист окажется заблокированной, а попытка защитить любой из сгруппированных листов программно, неизменно приведёт к ошибке. Однако, защитить группу листов, всё таки можно, если сначала листы разгруппировать, затем защитить, а потом, вернуть всё на круги своя, т.е.
  • Private Sub ProtectGroupSheets()
        Dim iGroup As Sheets, iList As Object
        Set iGroup = ActiveWindow.SelectedSheets
        ActiveSheet.Select 'iGroup(1).Select

        For Each iList In iGroup
            iList.Protect Password:="Ваш_пароль"
        Next

        iGroup.Select Replace:=False 'iGroup.Select
    End Sub
    Комментарий : Если в группе окажется уже защищённый ранее лист(ы), то пароль останется старым, но ошибка не возникнет.

    Если же Вы захотите программно снять защиту у группы листов, то используйте тот же финт, только учтите, что пароль у всех листов должен быть одинаковый.
    Private Sub UnProtectGroupSheets()
        Dim iGroup As Sheets, iList As Object
        Set iGroup = ActiveWindow.SelectedSheets
        ActiveSheet.Select 'iGroup(1).Select

        On Error Resume Next
        For Each iList In iGroup
            iList.UnProtect Password:="Ваш_пароль"
        Next

        iGroup.Select Replace:=False 'iGroup.Select
    End Sub

  • Ответ : Скачать пример
  • With Worksheets(1)
         If Application.CountA(.UsedRange) = 0 Then
            MsgBox "Рабочий лист «" & .Name & "» пустой" & vbCrLf & _
            "т.к. в этом листе все ячейки - пустые", vbInformation, ""
         Else
            MsgBox "Рабочий лист «" & .Name & "» непустой" & vbCrLf & _
            "т.к. в этом листе есть непустые ячейки ", vbInformation, ""
         End If
    End With
    MsgBox "Рабочий лист " & Worksheets(1).Name & _
    IIf(Application.CountA(Worksheets(1).UsedRange) > 0, _
    " непустой", " пустой"), vbSystemModal + vbInformation, ""

  • Ответ :

    Вариант I. (без 'генерации' ошибки)
  • Option Compare Text  'Если Вы не
    понимаете, зачем используется эта инструкция, то оставьте её в покое
    
    Private Function WorksheetIsExist(iName$) As Boolean
    '***********************************************'
    '   Дата создания 01/01/2005                    '
    '   Автор Климов Павел Юрьевич                  '
    '   http://www.msoffice.nm.ru                   '
    '***********************************************' 
        Dim iList As Worksheet 
        For Each iList In Worksheets 
            If iList.Name = iName$ Then 
               WorksheetIsExist = True 
               Exit Function 
            End If 
        Next 
        WorksheetIsExist = False 
    End Function
    Private Function WorksheetIsExist(iName$) As Boolean
    '***********************************************'
    '   Дата создания 01/01/2005                    '
    '   Автор Климов Павел Юрьевич                  '
    '   http://www.msoffice.nm.ru                   '
    '***********************************************' 
        Dim iList As Worksheet 
        For Each iList In Worksheets 
            If StrComp(iList.Name, iName$, vbTextCompare) = 0 Then
               WorksheetIsExist = True
               Exit Function
            End If
        Next
        WorksheetIsExist = False
    End Function

    Вариант II.
    Private Function WorksheetIsExist(iName$) As Boolean
    '***********************************************'
    '   Дата создания 01/01/2005                    '
    '   Автор Климов Павел Юрьевич                  '
    '   http://www.msoffice.nm.ru                   '
    '***********************************************' 
        On Error Resume Next
        WorksheetIsExist = IsObject(Worksheets(iName$))
    End Function
    Private Function WorksheetIsExist(iName$) As Boolean
        On Error Resume Next
        WorksheetIsExist = (TypeOf Worksheets(iName$) Is Worksheet)
    End Function
    Private Function WorksheetIsExist(iName$) As Boolean
        On Error Resume Next
        WorksheetIsExist = (TypeName(Worksheets(iName$)) = "Worksheet")
    End Function
    Private Function WorksheetIsExist(iName$) As Boolean
        On Error Resume Next
        WorksheetIsExist = (VarType(Worksheets(iName$)) = vbObject)
    End Function
    Private Function WorksheetIsExist(iName$) As Boolean
        On Error Resume Next
        WorksheetIsExist = Len(Worksheets(iName$).Name) > 0
    End Function
    Private Function WorksheetIsExist(iName$) As Boolean
        On Error Resume Next
        WorksheetIsExist = Worksheets(iName$).Index > 0
    End Function
    Пример вызова любой из вышеопубликованных авторских функций :
    Private Sub Test()
        MsgBox WorksheetIsExist("Имя_Рабочего_Листа")
    End Sub
    Примечание : Если необходимо активировать рабочий лист, то можно использовать такой вариант :
    Private Sub Worksheet_Active()
    On Error GoTo ErrHandler
        Worksheets("Отчёт").Activate
        Exit Sub
    
    ErrHandler:
        MsgBox "Рабочий лист отсутствует", , "Ошибка пользователя !!!"
    End Sub
    Совет : Для того, чтобы проверить наличие рабочего листа не в активной рабочей книге, необходимо добавить ссылку на нужную книгу. При необходимости можно проверить открыта ли эта книга [FAQ93]

    Комментарий : Если Вы используете проверку наличия рабочего листа, перед его созданием, то в этом случае необходимо использовать семейство Sheets, потому, что имя рабочего листа не может совпадать с именами других листов, в т.ч. не входящих в семейство Worksheets.
  • Ответ :

    Если Вам необходимо определить содержит ли открытая книга скрытые листы (причём не обязательно рабочие), то в таком случае можно воспользоваться нижеопубликованной функцией (пример вызова прилагается)
  • Private Function IsHiddenSheet(iName$) As Boolean
        Dim iSheet As Object
        For Each iSheet In Workbooks(iName$).Sheets
            If Not iSheet.Visible Then
               IsHiddenSheet = True
               Exit Function
            End If
        Next
        IsHiddenSheet = False
    End Function
    
    Private Sub Test()
        MsgBox IsHiddenSheet("Имя_рабочей_книги.xls")
    End Sub

  • Ответ : Скачать пример
  • Application.DisplayAlerts = False
    'Здесь должно быть удаление Вашего листа.
    Application.DisplayAlerts = True
    Комментарий :
  • - Если у листа, который Вы планируете удалить, значение свойства Visible установлено как xlVeryHidden/xlSheetVeryHidden, то попытка его удаления приведёт к ошибке, которую можно избежать, если перед удалением сделать лист видимым, т.е. установить значение свойства Visible = True/xlSheetVisible
  • - После удаления листа, в рабочей книге должен остаться, как минимум, один видимый лист
  • - Нельзя удалить лист, если рабочая книга является общей
  • - Нельзя удалить лист, если структура рабочей книги защищена [FAQ]
  • Ответ :
  • Application.DisplayAlerts = False
    Worksheets(Array(1, 3, 5)).Delete
    Application.DisplayAlerts = True
    Application.DisplayAlerts = False
    Worksheets(Array("Лист1", "Лист3", "Лист5")).Delete
    Application.DisplayAlerts = True
    Примечание :
  • - В первом примере активная рабочая книга должна содержать не менее пяти рабочих листов, причём, хотя бы один из рабочих листов с индексом(номером) 2, 4 должен быть видимым.
  • - Во втором примере активная рабочая книга должна содержать рабочие листы с указаными именами, а после их удаления должен остаться хотя один видимый лист.
  • - Для удаления листов различного типа, необходимо, вместо семейства Worksheets использовать Sheets.

    Комментарий :
  • - Если у всех листов, которые Вы планируете удалить, значение свойства Visible установлено как xlVeryHidden/xlSheetVeryHidden, то попытка их удаления приведёт к ошибке. Если xlVeryHidden установлено только у некоторых листов, то ошибка не возникнет, но и листы удалены не будут.
  • Ответ : Скачать пример
  • Select Case TypeName(ThisWorkbook.Sheets(1))
        Case "Worksheet"
             Select Case ThisWorkbook.Sheets(1).Type
                 Case xlWorksheet:            iType = "Рабочий лист"
                 Case xlExcel4MacroSheet:     iType = "Лист макросов"
                 Case xlExcel4IntlMacroSheet: iType = "Междун. лист макросов"
             End Select
        Case "Chart":       iType = "Лист диаграммы"
        Case "Module":      iType = "Лист модуля (модульный лист)"
        Case "DialogSheet": iType = "Лист диалога (диалоговый лист)"
    End Select
    
    MsgBox iType, vbInformation, ""
    Примечание : Вместо индекса листа Вы можете использовать его имя.
  • Ответ : Актуально только для MS Excel XP
  • ThisWorkbook.Worksheets(1).Tab.ColorIndex = 3
    ThisWorkbook.Worksheets(1).Tab.Color = vbRed
    ThisWorkbook.Worksheets(1).Tab.Color = RGB(255, 0, 0)

  • Ответ : Актуально для MS Excel 97, 2000, XP Скачать пример
    Если для всех рабочих листов, в том числе и новых, необходимо использовать одно и тоже событие, то нет необходимости прописывать его в модуле каждого рабочего листа, достаточно использовать аналогичное событие рабочей книги. Например, если Вы используете событие рабочего листа
    Worksheet_Change(ByVal Target As Excel.Range)
    то его можно заменить на событие рабочей книги
    Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)

    Для того, чтобы создать событие рабочей книги необходимо перейти в модуль книги ThisWorkbook(ЭтаКнига) Это можно сделать непосредственно в редакторе VBA или же навести курсор мышки на изображение рабочего листа, которое отображается перед меню Файл. Затем кликнуть правой кнопкой мышки и в появившемся контекстном меню выбрать пункт Исходный текст. После чего, в окне программы [F7] в первом поле со списком выбрать Workbook, а во втором поле выбрать нужное событие.
  • Ответ : Актуально для MS Excel 97, 2000, XP

    Вариант I. (вручную)

    Перейдите в модуль нужного рабочего листа [FAQ31] Затем в меню Вид (View) выберите Окно свойств (Properties Window) и установите значение свойства EnableCalculation как False

    Вариант II. (программно)
  • Лист1.EnableCalculation = False
    Worksheets(1).EnableCalculation = False
    Worksheets("Лист3").EnableCalculation = False
    Предполагается, что :
  • Лист1 - это кодовое/программное имя рабочего листа
  • 1 - это индекс рабочего листа
  • Лист3 - это имя рабочего листа

    Примечание :
  • - Не забывайте, что полностью запретить пересчёт в ячейках листа, можно только если у Вас установлен автоматический режим пересчёта.
    Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP

  • © 2004-2016 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff