Свойство locked vba excel

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Range.Locked property (Excel)

vbaxl10.chm144157

vbaxl10.chm144157

excel

Excel.Range.Locked

93c5f21d-6429-3287-0992-c810b9a429a8

05/11/2019

medium

Range.Locked property (Excel)

Returns or sets a Variant value that indicates if the object is locked.

Syntax

expression.Locked

expression A variable that represents a Range object.

Remarks

This property returns True if the object is locked, False if the object can be modified when the sheet is protected, or Null if the specified range contains both locked and unlocked cells.

Example

This example unlocks cells A1:G37 on Sheet1 so that they can be modified when the sheet is protected.

Worksheets("Sheet1").Range("A1:G37").Locked = False 
Worksheets("Sheet1").Protect

[!includeSupport and feedback]

Использование свойств Enabled и Locked

Два свойства Enabled и Locked управляют тем, будут ли элементы управления или вся форма доступны пользователю. Очевидно, вы захотите получить полный доступ к элементам управления, находящимся в форме. В противном случае возникает вопрос, зачем же они тогда находятся в форме? Однако иногда элементы управления для вас недоступны. Очень часто элементы управления находятся в форме, однако в данный момент они окрашены в серый цвет. Это говорит о том, что использовать сейчас их нельзя. Например, если в текстовом процессоре не выделен какой-нибудь фрагмент текста, команда Cut (Вырезать) не доступна, так как вырезать нечего.

Свойство Enabled определяет, будет ли элемент управления или форма, находящиеся в фокусе, реагировать на движение мыши или нажатие клавиши на клавиатуре. В фокусе Windows может находиться только один объект. Для того чтобы показать, что данный объект находится в фокусе, Windows размещает вокруг данного элемента управления пунктирные границы.

Когда свойство Enabled равно True, элемент управления появляется обычным образом и может находиться в фокусе. Когда свойство Enabled равно False, Windows отображает на экране неактивную (серую) версию этого элемента управления, который не может находиться в фокусе (рис. 10.10).

Рис. 10.10. В этом диалоговом окне есть активные и неактивные переключатели и кнопки, а также неактивное текстовое поле

Свойство Locked определяет, что выполняет элемент управления. Если свойство Locked равно True, можно щелкать на элементе управления, использовать любые комбинации клавиш, бросать в него камнями, но элемент управления ничего не будет делать (обратитесь к разделу «Назначение быстрых клавиш» дальше в настоящей главе). Однако если свойство Enabled равно True, элемент управления будет находиться в фокусе и нормально выглядеть.

Читайте также

Редактирование свойств подключения

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

Просмотр свойств оборудования

Просмотр свойств оборудования
Чтобы просмотреть свойства оборудования, выделите его в списке щелчком мыши и выполните команду главного Действие ? Свойства или команду Свойства контекстного меню, вызываемого нажатием правой кнопки мыши. В результате на экране

Использование свойств слоев

Использование свойств слоев
Имеется возможность присваивать свойства как слоям, так и непосредственно объектам рисунка. При построении нового объекта ему автоматически назначаются цвет, тип и вес линии, а также стиль печати ByLayer. Если свойство объекта имеет специальное

Использование окна свойств.

Использование окна свойств.
Окно Properties (Окно свойств) позволяет просмотреть и. если нужно, изменить свойства любого объекта (проекта, модуля, формы или элемента управления), который в окне редактора Visual Basic в данный момент активен. Если взглянуть на рис. 5.17, то можно увидеть,

Изменение установок свойств

Изменение установок свойств
В зависимости от свойства, установки свойств можно менять одним из следующих трех способов:* просто печатая новое значение;* выбирая новое значение из раскрывающегося списка;* выбирая новое значение в диалоговом окне.Некоторые свойства

Использование стандартных свойств элемента управления

Использование стандартных свойств элемента управления
Многие элементы управления обладают стандартными свойствами, к которым относится свойство Value.В случае текстового поля вы не должны явно указывать, какое свойство используется — Value или Text — для настройки и

Использование свойств Cells для определения диапазона

Использование свойств Cells для определения диапазона
При использовании без координат свойство Cells объекта Worksheets указывает на диапазон, включающий все ячейки данного рабочего листа. По аналогии, свойства Cells объекта Application ( Application. Cells ) ссылаются на все ячейки листа,

Создание процедур свойств

Создание процедур свойств
Секрет наделения объекта свойством состоит в написании пары специальных процедур — процедур свойств Property Let и Property Get. Обе процедуры в паре должны иметь одинаковые имена.Именем свойства будет то, которое вы выберете для процедур Property Let и Property Get.

Палитра свойств

Палитра свойств
Как уже говорилось, объекты чертежа имеют три свойства: цвет, тип и толщину линий. По умолчанию данные свойства присваиваются объекту в зависимости от того, на каком слое он находится. Однако каждому объекту можно назначить и индивидуальные свойства.Чтобы

Использование свойств слоев

Использование свойств слоев
Имеется возможность присваивать свойства как слоям, так и непосредственно объектам рисунка. При построении нового объекта ему автоматически назначаются цвет, тип и вес линии, а также стиль печати ByLayer. Если свойство объекта имеет специальное

Использование свойств слоев

Использование свойств слоев
Имеется возможность присваивать свойства как слоям, так и непосредственно объектам рисунка. При построении нового объекта ему автоматически назначаются цвет, тип и вес линии, а также стиль печати ByLayer. Если свойство объекта имеет специальное

Копирование свойств объектов

Копирование свойств объектов

Команда MATCHPROP предназначена для копирования свойств заданного объекта другому объекту. Она вызывается из падающего меню Modify ? Match Properties или щелчком на пиктограмме Match Properties стандартной панели инструментов.Допускается копировать цвет, слой,

Палитра свойств объектов

Палитра свойств объектов

Палитра свойств объектов PROPERTIES, показанная на рис. 5.15, – это единый инструмент, управляющий практически всеми свойствами объектов рисунка. На палитре собрано около 40 диалоговых окон и команд, которые были разрознены в более ранних версиях AutoCAD.

Палитра свойств

Палитра свойств
Как уже говорилось, объекты чертежа имеют три свойства: цвет, тип и толщина линий. По умолчанию данные свойства присваиваются объекту в зависимости от того, на каком слое он находится. Однако каждому объекту можно назначить и индивидуальные свойства.Чтобы

Защита ячеек от манипуляций

Red_Sloth

Дата: Воскресенье, 14.02.2016, 14:06 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 37


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

Здравствуйте!

Помогите пожалуйста!
Есть код макроса, который находится на листе, а не в модуле.
Требуется определенные ячейки защитить от редактирования.
[vba]

Код

ActiveWorkbook.Activate
    Sheets(«Entrance»).Activate
    Columns(«A:L»).Select

    Selection.Locked = True
    Sheets(«Entrance»).Activate

[/vba]

Получаю ошибку «Run-time error ‘1004’ Метод Select из класса Range завершен неверно» и выделяется строка:
[vba]

[/vba]

Как можно исправить это?
Заранее спасибо!

 

Ответить

KuklP

Дата: Воскресенье, 14.02.2016, 14:13 |
Сообщение № 2

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

[vba]

Код

Sheets(«Entrance»).range(«A:L»).Locked = True

[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

Red_Sloth

Дата: Воскресенье, 14.02.2016, 14:16 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 37


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

KuklP,
Все равно не работает.
«Run-time error ‘1004’ Нельзя установить свойство Locked класса Range»

 

Ответить

KuklP

Дата: Воскресенье, 14.02.2016, 14:20 |
Сообщение № 4

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

У меня работает. Может для начала снять защиту листа, заблокировать ячейки, а потом уж защищать лист? Так обычно принято :) Попробуйте:
[vba]

Код

Public Sub www()
    With Sheets(«Entrance»)
        .Unprotect
        .Range(«A:L»).Locked = True
        .Protect UserInterfaceOnly:=True
    End With
End Sub

[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

Сообщение отредактировал KuklPВоскресенье, 14.02.2016, 14:27

 

Ответить

Red_Sloth

Дата: Воскресенье, 14.02.2016, 14:43 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 37


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

KuklP,
О, так заработало, спасибо большое!
А если мне при этом надо еще и первые четыре строки защитить?
Как будет корректнее написать Range?

 

Ответить

KuklP

Дата: Воскресенье, 14.02.2016, 14:45 |
Сообщение № 6

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

.Range(«1:4») или .[1:4]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

Сообщение отредактировал KuklPВоскресенье, 14.02.2016, 14:48

 

Ответить

Red_Sloth

Дата: Воскресенье, 14.02.2016, 14:47 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 37


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

KuklP,
Спасибо большое!
Все работает!

 

Ответить

RAN

Дата: Воскресенье, 14.02.2016, 14:48 |
Сообщение № 8

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

KuklP,
:)


Быть или не быть, вот в чем загвоздка!

 

Ответить

KuklP

Дата: Воскресенье, 14.02.2016, 14:56 |
Сообщение № 9

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

RAN, Привет Андрюш. Ты об этом?:
[vba]

Код

.[A:L,1:4].Locked = True

[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

RAN

Дата: Воскресенье, 14.02.2016, 15:17 |
Сообщение № 10

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Сереж, именно.
Или
[vba]

Код

Union(.Range(«A:L»),.Range(«1:4»))

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

Red_Sloth

Дата: Воскресенье, 14.02.2016, 15:36 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 37


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

KuklP,
Работать то работает, но у меня почему-то в итоге блокируется вообще все.
а не только выделенные столбцы и ячейки

 

Ответить

RAN

Дата: Воскресенье, 14.02.2016, 15:46 |
Сообщение № 12

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Но тут малец с поправкой влез… :)
[vba]

Код

Public Sub www()
    With Me
        .Unprotect
        .Cells.Locked = False
        Union(.Range(«A:L»), .Range(«1:4»)).Locked = True
        .Protect UserInterfaceOnly:=True
    End With
End Sub

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

Red_Sloth

Дата: Воскресенье, 14.02.2016, 15:55 |
Сообщение № 13

Группа: Пользователи

Ранг: Новичок

Сообщений: 37


Репутация:

1

±

Замечаний:
0% ±


Excel 2010

RAN,
А вот так отлично)
Спасибо!

 

Ответить

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Популярные разделы FAQ:    user posted image Общие вопросы    user posted image Особенности VBA-кода    user posted image Оптимизация VBA-кода    user posted image Полезные ссылки


    1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
    2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость — сестра таланта.
    3. Не забывайте использовать теги [сode=vba] …текст программы… [/code] для выделения текста программы подсветкой!
    4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.

    >
    Защита листа и свойство .Locked

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    25.05.07, 14:32

      Full Member

      ***

      Рейтинг (т): 18

      на листе есть CheckBox. когда он включен необходимо заблокировать определенную ячейку (предварительно стоит Protect c UserInterfaceOnly:=True)
      пишу код:

      ExpandedWrap disabled

            With Range(«ячейка»)

                If ActiveSheet.Shapes(«Flag 1»).ControlFormat.Value = xlOn Then

                            .Value = 3

                            .Locked = False

                End If

            End With

      выдает ошибку «нельзя установить свойство Locked класса Range»

      порылся в инете, ничего не понял, но добавил вместо

      ExpandedWrap disabled

        .Locked = False

      ExpandedWrap disabled

        .Select

        Selection.Locked = False

      все работает.

      внимание вопрос: какого черта тут оно работает если в первом случае не работало??? как по мне так один хрен Selection.Locked или Range(«ячейка»).Locked, а вот оказывается нифига!


      vkodor



      Сообщ.
      #2

      ,
      29.05.07, 05:29

        Selection.Locked — тут не причем
        ключевым сдесь является
        .Select
        ты переводишь фокус с контрола на лист и после этого можно делать
        Range(«ячейка»).Locked и др.
        у CommandButton даже свойство есть такое TakeFocusOnClick (т.е. оставлять фокус на кнопке или нет)
        у CheckBox такого нет и поэтому фокус всегда на нем после клика, отсюда и проблема


        Krasnaja Shapka



        Сообщ.
        #3

        ,
        29.05.07, 07:57

          Full Member

          ***

          Рейтинг (т): 18

          осознал… спс!


          Krasnaja Shapka



          Сообщ.
          #4

          ,
          29.05.07, 13:22

            Full Member

            ***

            Рейтинг (т): 18

            стоп…. а почему тогда

            ExpandedWrap disabled

                  With Range(«ячейка»)

                                  .Select

                                  .Locked = True

                  End With

            не работает?

            только

            ExpandedWrap disabled

                  With Range(«ячейка»)

                                  .Select

                                  Selection.Locked = True

                  End With

            Сообщение отредактировано: Krasnaja Shapka — 29.05.07, 15:24


            Pavel55



            Сообщ.
            #5

            ,
            29.05.07, 16:58

              Junior

              *

              Рейтинг (т): 12

              У меня код

              ExpandedWrap disabled

                Sub Макрос1()

                    With Range(«H6»)

                        .Select

                        .Locked = True

                    End With

                End Sub

              Прекрасно работает

              Сообщение отредактировано: Pavel55 — 29.05.07, 16:58


              Krasnaja Shapka



              Сообщ.
              #6

              ,
              30.05.07, 08:38

                Full Member

                ***

                Рейтинг (т): 18

                все… родил… даже select не нужен (vkodor отдавай назад плюсик ;) )… все дело в том что у меня ячейки были объедены… а когда присваиваешь имя объедененной ячейке… реально имя присваивается только левой верхней…

                например, объеденены «а1» и «а2″… выделяю их, присваиваю имя «ячейка» — имя присваивается только для «а1», а не для «а1:а2»!!!!… в результате я пытаюсь изменить свойство .locked не для всей объедененной ячейки, а только для одной из них!!!

                вот такая хрень.
                и на такую фигню я полдня убил!

                Сообщение отредактировано: Krasnaja Shapka — 30.05.07, 08:40

                Profi

                Old Bat



                Сообщ.
                #7

                ,
                30.05.07, 10:18

                  Moderator

                  *****

                  Рейтинг (т): 128

                  Цитата Krasnaja Shapka @ 30.05.07, 08:38

                  у меня ячейки были объедены

                  за что ж ты их.. :lol:

                  Цитата

                  В объединенную ячейку Excel помещает только данные верхнего левого угла из выделенного диапазона Данные из других ячеек уничтожаются.

                  в отношении имен работает то же правило


                  Krasnaja Shapka



                  Сообщ.
                  #8

                  ,
                  30.05.07, 14:52

                    Full Member

                    ***

                    Рейтинг (т): 18

                    тьфу…. ну я писака «объединены», во! :wub:

                    Добавлено 30.05.07, 14:53
                    п.с. какой-то значек не в тему попался…

                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                    0 пользователей:

                    • Предыдущая тема
                    • VB for Application
                    • Следующая тема

                    Рейтинг@Mail.ru

                    [ Script execution time: 0,0322 ]   [ 16 queries used ]   [ Generated: 16.04.23, 22:31 GMT ]  

                    Дарика

                    12 / 7 / 3

                    Регистрация: 13.09.2010

                    Сообщений: 63

                    1

                    12.01.2012, 17:34. Показов 13184. Ответов 15

                    Метки нет (Все метки)


                    Студворк — интернет-сервис помощи студентам

                    При попытке защиты ячейки выскакивает ошибка Error 1004 Нельзя установить свойство Locked класса Range. Перепроверила уже все и вся, никак не могу понять причину. Помогите!

                    Visual Basic
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    16
                    17
                    18
                    19
                    20
                    21
                    22
                    23
                    24
                    25
                    26
                    27
                    28
                    29
                    30
                    31
                    32
                    33
                    34
                    35
                    36
                    37
                    38
                    39
                    40
                    41
                    42
                    43
                    44
                    45
                    46
                    47
                    48
                    49
                    50
                    51
                    52
                    53
                    54
                    55
                    56
                    57
                    58
                    59
                    60
                    61
                    62
                    63
                    64
                    65
                    66
                    67
                    68
                    69
                    70
                    71
                    72
                    73
                    74
                    75
                    76
                    77
                    78
                    79
                    80
                    81
                    82
                    83
                    84
                    85
                    86
                    87
                    88
                    89
                    90
                    91
                    92
                    93
                    94
                    95
                    96
                    97
                    98
                    99
                    100
                    101
                    102
                    103
                    104
                    105
                    106
                    107
                    108
                    109
                    110
                    111
                    112
                    113
                    114
                    115
                    116
                    117
                    118
                    119
                    120
                    121
                    122
                    
                    Private Sub OK_Click()
                    'снятие защиты с листа - работает
                    Range("A1:U200").Select
                    Selection.Locked = False
                    Selection.FormulaHidden = False
                            ' определение последней заполненой ячейки
                            'iRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
                    'iClm = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
                            ' если выбрано исполнитель
                        If But1.Value = True Then
                            Dim cell As Range
                            For Each cell In [A1:A200]
                                If cell.Value Like "*Исполнитель*" Then
                                    cell.Activate
                                End If
                                Next
                                    x = ActiveCell.Row
                                    y = ActiveCell.Column
                                    While cells(x, y + 1) = ""
                                    cells(x, y + 1) = "Isp"
                                    ВставитьКартинку cells(x, y + 1), "D:Otheravatar1727_1.gif"
                                    cells(x, y + 1).Activate
                                    Range("II").Select
                                        Selection.Locked = True
                                        Selection.FormulaHidden = False
                                        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                                    Wend
                                        'цикл для вставки во все листы книги
                                        If Foreach.Value = True Then
                                        For ListI = 1 To 3
                                        Worksheets(ListI).Activate
                                            Dim cell6 As Range
                                            For Each cell6 In [A1:A200]
                                            If cell6.Value Like "*Исполнитель*" Then
                                            cell6.Activate
                                        End If
                                        Next
                                            xx = ActiveCell.Row
                                            yyy = ActiveCell.Column
                                            While cells(xx, yyy + 1) = ""
                                            cells(xx, yyy + 1) = "Isp"
                                            ВставитьКартинку cells(xx, yyy + 1), "D:Otheravatar1727_1.gif"
                                            cells(xx, yyy + 1).Activate
                                            Selection.Name = "II"
                                            Selection.Locked = True
                                            Selection.FormulaHidden = False
                                            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                                            Wend
                                Next
                                End If
                                'конец цикла
                            ' если выбрано руководитель
                        ElseIf But2.Value = True Then
                        
                        Dim cell2 As Range
                        For Each cell2 In [A1:A200]
                        If cell2.Value Like "*Исполнитель*" Then
                        cell2.Activate
                        End If
                        Next
                        x = ActiveCell.Row
                        y = ActiveCell.Column
                        If Not cells(x, y + 1) = "Isp" Then
                            MsgBox "Выберите подпись исполнителя!"
                        Else
                                Dim celll As Range
                                For Each celll In [A1:A200]
                                    If celll.Value Like "*Руководитель проверки*" Then
                                    celll.Activate
                                    End If
                                Next
                                    a = ActiveCell.Row
                                    z = ActiveCell.Column
                                    While cells(a, z + 1) = ""
                                    cells(a, z + 1) = "Ruc"
                                    ВставитьКартинку cells(a, z + 1), "D:Otherav-6193.jpg"
                                    Range("II").Select
                                    ActiveSheet.Unprotect
                                    cells.Select
                                    Selection.Locked = True
                                    Selection.FormulaHidden = False
                                    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                                    Wend
                            'начало цикла
                            If Foreach.Value = True Then
                            For ListII = 1 To 3
                                Worksheets(ListII).Activate
                                Dim cell8 As Range
                                For Each cell8 In [A1:A200]
                                        If cell8.Value Like "*Руководитель проверки*" Then
                                        cell8.Activate
                                    End If
                                    Next
                                        aaa = ActiveCell.Row
                                        zzz = ActiveCell.Column
                                        While cells(aaa, zzz + 1) = ""
                                            cells(aaa, zzz + 1) = "Ruc"
                                            ВставитьКартинку cells(aaa, zzz + 1), "D:Otherav-6193.jpg"
                                            Range("A1:U200").Select
                                            Selection.Locked = True
                                            Selection.FormulaHidden = False
                                            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                                       Wend
                                Next ListII
                                End If
                            'конец цикла
                        End If
                        End If
                    End Sub
                     
                    Function ВставитьКартинку(ByRef cell As Range, ByVal Pic As String) As Boolean
                        ' получает в качестве параметра ссылку на ячейку для вставки
                        ' и путь к файлу с картинкой.
                        ' если картинка вставлена успешно, возвращает TRUE
                        On Error Resume Next: Err.Clear
                        Dim ph As Picture: Set ph = cell.Parent.Pictures.Insert(Pic)
                        ВставитьКартинку = Err.Number = 0
                        ph.Top = cell.Top: ph.Left = cell.Left: k = ph.Width / ph.Height
                        ph.Width = cell.Width: ph.Height = ph.Width / k
                        cell.EntireRow.RowHeight = ph.Height
                        Selection.Name = "Isp"
                    End Function



                    0



                    3217 / 966 / 223

                    Регистрация: 29.05.2010

                    Сообщений: 2,085

                    12.01.2012, 18:08

                    2

                    Изначально все ячейки защищены, но без защиты листа можно вносить изменения в ячейки до установки пароля (может быть и пустой пароль) на лист. Поэтому снятие защиты с листа позволяет изменять ячейки любым образом. Есть ли смысл экспериментировать со свойством Locked.



                    0



                    12 / 7 / 3

                    Регистрация: 13.09.2010

                    Сообщений: 63

                    12.01.2012, 18:10

                     [ТС]

                    3

                    Цитата
                    Сообщение от toiai
                    Посмотреть сообщение

                    Изначально все ячейки защищены, но без защиты листа можно вносить изменения в ячейки до установки пароля (может быть и пустой пароль) на лист. Поэтому снятие защиты с листа позволяет изменять ячейки любым образом. Есть ли смысл экспериментировать со свойством Locked.

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



                    0



                    3217 / 966 / 223

                    Регистрация: 29.05.2010

                    Сообщений: 2,085

                    12.01.2012, 18:14

                    4

                    Для защиты ячеек необходимо защитить лист.



                    0



                    12 / 7 / 3

                    Регистрация: 13.09.2010

                    Сообщений: 63

                    12.01.2012, 18:17

                     [ТС]

                    5

                    Цитата
                    Сообщение от toiai
                    Посмотреть сообщение

                    Для защиты ячеек необходимо защитить лист.

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



                    0



                    3217 / 966 / 223

                    Регистрация: 29.05.2010

                    Сообщений: 2,085

                    12.01.2012, 18:24

                    6

                    Это невозможно.



                    0



                    12 / 7 / 3

                    Регистрация: 13.09.2010

                    Сообщений: 63

                    12.01.2012, 18:31

                     [ТС]

                    7

                    Цитата
                    Сообщение от toiai
                    Посмотреть сообщение

                    Это невозможно.

                    Это абсолютно точно возможно.



                    0



                    3217 / 966 / 223

                    Регистрация: 29.05.2010

                    Сообщений: 2,085

                    12.01.2012, 18:46

                    8

                    Одновременно защищенные и незащищенные ячейки могут быть только на защищенном листе!



                    0



                    1702 / 189 / 19

                    Регистрация: 20.11.2011

                    Сообщений: 281

                    12.01.2012, 20:04

                    9

                    Цитата
                    Сообщение от Дарика
                    Посмотреть сообщение

                    Это абсолютно точно возможно.

                    Так покажите нам, как защитить ячейку не защищая лист именно инструментом «Защита». Можно без макросов, руками. Так, чтоб ее нельзя было редактировать на незащищенном листе. Думаю, для всех это будет очень познавательно.



                    0



                    3217 / 966 / 223

                    Регистрация: 29.05.2010

                    Сообщений: 2,085

                    12.01.2012, 20:21

                    10

                    Если установить на файл флажок » Пометить как окончательный» тогда невозможно редактировать файл и в т.ч. и лист до снятия этого флажка.



                    0



                    Dragokas

                    Эксперт WindowsАвтор FAQ

                    17993 / 7619 / 890

                    Регистрация: 25.12.2011

                    Сообщений: 11,352

                    Записей в блоге: 17

                    12.01.2012, 20:39

                    11

                    В Вашем случае 1004 — это попытка изменения атрибута защиты ячейки или области при неснятой защите листа. Почему? Так, как у Вас в алгоритме неверно проставлены окончания циклов Next. Кроме того, под Next у Вас попадают и некоторые Dimensions.

                    toiai, прав. Но можно действительно сделать разные процедуры. Защита листа предусматривает опции исключений. Таким образом она будет влиять только на одну защищаемую ячейку.
                    Какого рода защиту Вы хотите поставить? Если только от изменеия данных (не форматирования), можно так:

                    Процедура 1. Защита ячейки [A1]
                    0) Если лист защищен — снимаем защиту.
                    1) Снятие защиты со всех ячеек.
                    2) Установка защиты на ячейку А1
                    3) Защита листа с опциями исключения всех видов защит, кроме изменения данных.

                    Эта процедура делает все вышесказанное при передаче ей параметров Y, X

                    Visual Basic
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    11
                    12
                    13
                    14
                    15
                    
                    Sub Макрос1()
                    LockCell 1, 1
                    End Sub
                     
                    Private Sub LockCell(ByVal y%, ByVal x%, Optional ByVal ShName$)
                    If ShName = "" Then ShName = ActiveSheet.Name
                    With ThisWorkbook.Sheets(ShName)
                        If .ProtectContents Then .Unprotect
                        .Cells.Locked = False
                        .Cells(y, x).Locked = True
                        .Protect DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                            AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, _
                            AllowDeletingColumns:=True, AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
                    End With
                    End Sub

                    Также не рекомендую Вам использовать метод Activate (который у Вас тоже попал под цикл), а по возможности и метод Select тоже. Это вызовет мельтешение и замедление работы. Можно обращаться к ячейкам напрямую.

                    Если нужна помощь передайте файл целиком со всеми объектами.



                    0



                    Дарика

                    12 / 7 / 3

                    Регистрация: 13.09.2010

                    Сообщений: 63

                    13.01.2012, 10:27

                     [ТС]

                    12

                    Цитата
                    Сообщение от kuklp
                    Посмотреть сообщение

                    Так покажите нам, как защитить ячейку не защищая лист именно инструментом «Защита». Можно без макросов, руками. Так, чтоб ее нельзя было редактировать на незащищенном листе. Думаю, для всех это будет очень познавательно.

                    Visual Basic
                    1
                    2
                    3
                    4
                    5
                    6
                    7
                    8
                    9
                    10
                    
                    Sub Макрос1()
                     
                        Cells.Select
                        Selection.Locked = False
                        Selection.FormulaHidden = False
                        Range("D15").Select
                        Selection.Locked = True
                        Selection.FormulaHidden = False
                        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                    End Sub



                    0



                    1702 / 189 / 19

                    Регистрация: 20.11.2011

                    Сообщений: 281

                    13.01.2012, 10:31

                    13

                    Цитата
                    Сообщение от Дарика
                    Посмотреть сообщение

                    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

                    Дарика, что по Вашему делает эта строка? Я просил:

                    Цитата
                    Сообщение от Дарика
                    Посмотреть сообщение

                    Так, чтоб ее нельзя было редактировать на незащищенном листе.



                    0



                    12 / 7 / 3

                    Регистрация: 13.09.2010

                    Сообщений: 63

                    13.01.2012, 10:48

                     [ТС]

                    14

                    Цитата
                    Сообщение от kuklp
                    Посмотреть сообщение

                    Дарика, что по Вашему делает эта строка? Я просил:

                    Блин, нормально тут у вас, спрашиваешь, тебе говорят что это невозможно. Вот я привела пример, код выше. Теперь, я надеюсь, стало окончательно понятно, что я хочу сделать. Вы можете сказать что-то конструктивное по вопросу?
                    Я понимаю, что возможно, вопросы нубские, но VBA не моя специальность, просто вот, пришлось кое-что на нем написать.



                    0



                    Эксперт WindowsАвтор FAQ

                    17993 / 7619 / 890

                    Регистрация: 25.12.2011

                    Сообщений: 11,352

                    Записей в блоге: 17

                    13.01.2012, 19:35

                    15

                    Дарика, перечитайте мой пост. Там готовый код. Сложность Вашей программы, связанная с неправильной организацией циклов не позволяет исправить в ней ошибки, пока Вы не выложите Ваш проект полностью файлом и дадите условия задачи в ней.

                    Код, выложенный Вами делает, то что я написал в посте выше, кроме п.0, что вызывает ошибку 1004.
                    Конструктивное по вопросу: ничего кардинально менять не нужно, кроме пересмотра логики работы программы и отлова ошибок и неправильного завершения циклов работы, а также, возможно, вывода некоторых процедур, связанных с защитой ячеек/листа, в отдельную подпрограмму, чтобы визуально для себя сделать проще код.



                    0



                    0 / 0 / 0

                    Регистрация: 20.07.2013

                    Сообщений: 6

                    01.01.2014, 14:15

                    16

                    В диапазоне есть объединенные ячейки? Если есть — дело, скорее всего в них.



                    0



                     

                    Александр Медведев

                    Пользователь

                    Сообщений: 245
                    Регистрация: 01.01.1970

                    #1

                    17.11.2015 23:07:56

                    Добрый вечер.

                    Посоветуйте как оптимизировать (ускорить) выполнение макроса, который ставит, а потом снимает защиту с объединенных ячеек.
                    Что есть в качестве исходных данных:
                    — есть много листов, на которых есть от 1 до 5 переменных Range с именованными диапазонами содержащими объединенные ячейки (модуле листа);
                    — есть макрос, который должен включать/выключать защиту с этих диапазонов (стандартный модуль).
                    Особенность в том, что на некоторых листах есть пустые диапазоны.
                    Если бы все диапазоны были определены, то эта задача решалась бы через Union(диапазон1, диапазон2,…) и свойство .Locked = True
                    Но так как некоторые из них Nothing + ячейки объединены, то этой вариант не подойдет.

                    Сейчас использую как компромис такой вариант (z1, z2, z3, z4, z5 — это имена диапазонов):

                    Код
                    On Error Resume Next
                    
                            For Each x In z1
                                If x.MergeCells = True Then
                                   x.MergeArea.Locked = True
                                Else
                                   x.Locked = True
                                End If
                            Next
                    
                            For Each x In z2
                                If x.MergeCells = True Then
                                   x.MergeArea.Locked = True
                                Else
                                   x.Locked = True
                                End If
                            Next
                    
                    ... + еще три цикла еще 3-х диапазонов.
                    

                    В результате получается долго и некрасиво.
                    Подскажите, как это сделать исправить, как обойтись без циклов по количеству диапазонов?
                    Спасибо.

                    Прикрепленные файлы

                    • Пример защита.xls (91.5 КБ)

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    Sanja

                    Пользователь

                    Сообщений: 14838
                    Регистрация: 10.01.2013

                    #2

                    17.11.2015 23:11:47

                    Не уверен что будет быстрее, но попробуйте

                    Код
                    For Each x In Union(z1, z2, z3)
                     далее по тексту
                    Next
                    

                    Согласие есть продукт при полном непротивлении сторон.

                     

                    В том то и дело, что диапазон z3 на отдельных листах может быть пустым.
                    В модуле листа диапазон задан как z3 = Nothing.
                    А так как вы предлагаете пробовал с самого начала, не получилось.

                    Изменено: Александр Медведев17.11.2015 23:14:51

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    Sanja

                    Пользователь

                    Сообщений: 14838
                    Регистрация: 10.01.2013

                    Зачем такие сложности? Определяйте необходимые диапазоны в зависимости для какого листа выполняется макрос (активного листа)

                    Согласие есть продукт при полном непротивлении сторон.

                     

                    Вообще, этот вариант с включением/выключением защиты ячеек тоже не совсем меня устраивает.
                    В этом и других опробованных вариантах решения моего основного вопроса приходится мирится с некоторыми неудобствами.
                    В идеале нужно, чтобы при включении переключателя в именованных диапазонах те ячейки, которые незащищены — стали защищенными, а при включении обратно становились обратно незащищенными. Сложность добавляет тот факт, что в именованном диапазоне есть уже защищенные ячейки, защиту которых менять нежелательно. Но это скорее всего уже вопрос другой темы.
                    Пока пробую доработать хотя бы то, что работает. Медленно, но работает.

                    Изменено: Александр Медведев17.11.2015 23:23:49

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    Хочу сделать универсальный вариант, где по минимуму необходимо делать руками.
                    По умолчанию 5 диапазонов на каждом листе. Переменные для них задаются как паблик.
                    Листы с шаблоном задачи и соответственно макросами к листу копируются.
                    Задач много и они разные, количество заданий варьируется от 1 до 5.
                    Переключатель вынесен в стандартный модуль.
                    Как в таком случае определять, какие диапазоны рабочие (непустые)?

                    Изменено: Александр Медведев17.11.2015 23:31:02

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    JayBhagavan

                    Пользователь

                    Сообщений: 11833
                    Регистрация: 17.01.2014

                    ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

                    #7

                    18.11.2015 07:04:59

                    Цитата
                    Александр Медведев написал: на некоторых листах есть пустые диапазоны

                    Что значит пустые? Выходят за пределы UsedRange? Тогда делайте проверку:

                    Код
                    If Not Intersect(UsedRange, ваш_диапазон) Is Nothing Then ' выполняем цикл или что Вам надо

                    <#0>
                    Формула массива (ФМ) вводится Ctrl+Shift+Enter
                    Memento mori

                     

                    Как-то всё непонятно…
                    1. Зачем объявлять nothing, чтобы потом не знать, как их обойти? Видимо код — усеченный…
                    2. Зачем проверять на объединение и запускать цикл for each?
                    3. Самое главное — непонятно, почему код нужно ускорять? Он что,  медленно у Вас  работает?
                    4. Чем мешают пустые диапазоны?

                    Всё сложное — не нужно. Всё нужное — просто /М. Т. Калашников/

                     

                    Александр Медведев

                    Пользователь

                    Сообщений: 245
                    Регистрация: 01.01.1970

                    #9

                    26.11.2015 21:59:39

                    Долго не мог ответить и поддержать разговор :(

                    Спасибо

                    JayBhagavan

                    и

                    Михаил Лебедев

                    за ваши варианты.

                    Михаил Лебедев

                    ,  в вашем коде для себя интересный момент на заметку взял.
                    В ответ на вопросы:
                    1. Объявил nothing, так как другого ничего не придумал. Все 5 диапазонов должны быть как минимум заданы, для универсальности, чтобы не лезть на каждом листе в код, если какого-нибудь в данный момент нет.
                    2. По другому не получилось
                    3. Если диапазоны относительно большие, то становится заметно
                    4. Мешают тем, что не позволяют сделать Union(z1, z2, z3), если хотя бы один пустой.

                    По одному месту кода есть вопрос. Разве в имени диапазона разрешается использовать переменные. Я так уже пробовал, но ничего не получилось. Может что не так делал. Ругается на это место:

                    Код
                     For i = 1 To 2
                         Range("z" & i).Locked = myBool
                     Next
                    

                    Пишет, что нельзя установить свойство Locked класса Range.

                    Изменено: Александр Медведев26.11.2015 22:00:54

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    RAN

                    Пользователь

                    Сообщений: 7091
                    Регистрация: 21.12.2012

                    Защиту листа снять слабо?

                    Изменено: RAN26.11.2015 22:16:25

                     

                    Александр Медведев

                    Пользователь

                    Сообщений: 245
                    Регистрация: 01.01.1970

                    #11

                    26.11.2015 22:18:45

                    Так нет ее, защиты…
                    z1, z2, z3 имена диапазонов. Можно перебирать циклом их имена через переменную?

                    Пока упростил до такого варианта. Работает.

                    Код
                            If z1 Is Nothing Then
                            Else
                               z1.Locked = 0
                            End If
                    

                    Изменено: Александр Медведев26.11.2015 22:30:30

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    The_Prist

                    Пользователь

                    Сообщений: 14182
                    Регистрация: 15.09.2012

                    Профессиональная разработка приложений для MS Office

                    #12

                    26.11.2015 22:31:50

                    Код
                    For Each x In Union(z1, z2, z3)

                    Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                     

                    Но если один диапазон = Nothing, то Union выдает ошибку.

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    The_Prist

                    Пользователь

                    Сообщений: 14182
                    Регистрация: 15.09.2012

                    Профессиональная разработка приложений для MS Office

                    #14

                    26.11.2015 22:59:36

                    Цитата
                    Александр Медведев написал:
                    Но если один диапазон

                    А почему он вдруг Nothing? Если это так — значит логика кода плохо построена.

                    Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                     

                    Он не вдруг. Он специально. Немного ранее про это написал.

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    The_Prist

                    Пользователь

                    Сообщений: 14182
                    Регистрация: 15.09.2012

                    Профессиональная разработка приложений для MS Office

                    #16

                    26.11.2015 23:12:30

                    Так сделайте массив и идите по нему. Мало чем от Union будет отличаться.

                    Код
                        aRng = Array(z1, z2, z3)
                        For Each rr In aRng
                            If Not rr Is Nothing Then
                                'действия с диапазоном
                            End If
                        Next

                    Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

                     

                    Александр Медведев

                    Пользователь

                    Сообщений: 245
                    Регистрация: 01.01.1970

                    #17

                    26.11.2015 23:13:21

                    Он не вдруг. Он специально. Немного ранее про это написал.
                    Вариант        

                    Код
                     If z1 Is Nothing Then
                            Else
                               z1.Locked = 0
                            End If

                    меня вполне устроил. Стало быстро практически незаметно.
                    Может корявенько, зато работает.

                    А вот над постом №5 буду думать. Это основной вопрос.
                    Для этого тему видимо новую потом надо создать, если ничего нормально не придумаю.

                    Если не можешь победить беспорядок, то надо возглавить его.

                     

                    Александр Медведев

                    Пользователь

                    Сообщений: 245
                    Регистрация: 01.01.1970

                    #18

                    26.11.2015 23:14:45

                    Точно, массивом можно!
                    Спасибо за подсказку.

                    Если не можешь победить беспорядок, то надо возглавить его.

                    Понравилась статья? Поделить с друзьями:
                  • Свойство listbox vba excel
                  • Свойства элементов управления word
                  • Свойства элементов управления excel
                  • Свойства элемента управления содержимым word
                  • Свойства элемента управления excel