Range 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]

 

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

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

Сообщений: 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

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

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

Содержание

  1. Range locked vba excel
  2. How to unlock and lock Excel cells for running a macro
  3. 4 Answers 4
  4. Error 1004 when setting Range.Locked
  5. 5 Answers 5
  6. Lock certain cells in a range
  7. 7 Answers 7
  8. How to lock a cell in Excel formula using VBA
  9. Protection
  10. Lock Cells
  11. Detect Cells with Formulas
  12. Lock cells and protect a worksheet

Range locked vba excel

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

200?’200px’:»+(this.scrollHeight+5)+’px’);»> ActiveWorkbook.Activate
Sheets(«Entrance»).Activate
Columns(«A:L»).Select

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

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

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

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

200?’200px’:»+(this.scrollHeight+5)+’px’);»> ActiveWorkbook.Activate
Sheets(«Entrance»).Activate
Columns(«A:L»).Select

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

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

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

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

200?’200px’:»+(this.scrollHeight+5)+’px’);»> ActiveWorkbook.Activate
Sheets(«Entrance»).Activate
Columns(«A:L»).Select

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

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

Как можно исправить это?
Заранее спасибо! Автор — Red_Sloth
Дата добавления — 14.02.2016 в 14:06

Источник

How to unlock and lock Excel cells for running a macro

I have a spreadsheet that has two buttons — To retrieve records from database and another one to upload changes from excel to database. The macro for retrieving records from Database is as follows. Now after retrieving the records, I want the users only to edit certain columns( here the columns from January to Scenario) so that the users, after updating those cells can click on the update button to save the changes to the database. However, I don’t want them to touch the other columns ( EmpID through Status).I want a macro that would lock those columns after data retrieval and unlock while retrieving the records on clicking the Retrieval button. This is because I am clearing the worksheet whenever I click on the retrieve records buttons. I tried several methods and it’s not working. I would appreciate your help.

4 Answers 4

One of the best ways to learn how to do something in VBA is simply to perform the task with the Macro Recorder on. That way you will know the basic code required to complete the task.

It also helps to understand that all cells start off with a property of «Locked» but that only becomes useful when the workbook is Protected using the Review > Protect Sheet option.

So to make sure no one can change all any of the cells in your book after the data has been changed, you’d need to protect the workbook using:

The various options could be changed or removed depending on what you want done.

As I understand it, you want only certain columns locked. In this case, you actually have to unlock the cells you will allow them to enter — so you have to think about it backwards.

This line of code would set the Locked property of the cells C1:C1000 to False so that when the Workbook is Protected, the user can still edit the cells:

If you have any other questions, just post.

Источник

Error 1004 when setting Range.Locked

I get the catch-all runtime error 1004, «unable to set the Locked property of the Range class» when, well, trying to set the Locked property of a Range object. The code looks like this:

When I set a breakpoint on the line and try to query the value of that_goddamn_range.Locked from the Immediate window, this works without problem, but setting it fails.

If, however, I run that_goddamn_range.Select , break the macro, unprotect the sheet (it gets reprotected automatically on selection change) then right click, pick Properties, switch to the Protection tab and tick Locked then confirm, things work okay however.

What could possibly be going wrong?

5 Answers 5

Here’s a complete explanation:

Typically, there are two causes of this error: trying to change a cell’s Locked property on a protected sheet and/or trying to change the Locked property of a single cell in a merged range.

In the first case, you can either unlock the sheet or set UserInterfaceOnly protection for it, which is highly recommended since you then don’t have to mess with repeatedly unlocking/locking it.

With regard to merged cells, you can’t lock a single cell that is part of a merged range but there are reasonable options:

If you are using cell-address notation to reference the cell/range,

then reference the whole merged range instead:

Range(«A1:A3»).Locked = True ‘where «A1:A3» is the entire merged range

If you are using a named range for a set of merged cells, by default it will be defined to reference the first of the merged cells only. You can either edit its definition to include the entire merged range or use its MergeArea property to reference its associated merged range:

But note that you can’t do both since the MergeArea property is, apparently, undefined for a range that is not a strict subset of a larger merged area!

Of course, you can always unmerge the merged range before setting the Locked property of an included cell and then re-merge it afterward, but I have never seen a situation in which one of the above two solutions wasn’t sufficient (and much cleaner).

Источник

Lock certain cells in a range

I’m trying to loop through a range of cells, locking any cell that has content while leaving empty cells unlocked.

When I run the below code the result is the entire sheet is locked. If I add an else statement the sheet is unlocked. Basically whatever the last .locked = (true, false) statement is is how the entire sheet winds up.

Change 1 Is it possible that I have some setting on/off that is interfering since I’m the only one who is unable to get any of this to work?

7 Answers 7

You can try this.

If you say Range(«A1»).Select, then it locks only A1. You can specify multiple cells to be locked by specifying as follows:
A3:A12,D3:E12,J1:R13,W18
This locks A3 to A12 and D3 to E12 etc.

I may be missing something but.

. will lock all cells on the active sheet. If you just change it to.

. then it works; I think?! As the range is very small, you may as well not unlock cells at the start, and instead unlock cells whilst locking them e.g.

If you are new to VBA, I would recommend cycling through code line-by-line as described in this Excel consultant’s video. If you step through code, you can check «has cell A7 behaved as expected?». instead of just seeing the end product

A quick way to unlock non-blank cells is to use SpecialCells see below.

On my testing this code handles merged cells ok, I think this is what is generating your error on Tim’s code when it looks to handle each cell individually (which to be clear is not an issue in Tim’s code, it is dealing with an unexpected outcome)

You may also find this article of mine A fast method for determining the unlocked cell range useful

I know this is an old thread, but I’ve been stuck on this for a while too, and after some testing on Excel 2013 here’s what I conclude if your range includes any merged cell

  • The merged cells must be entirely included within that range (e.g. the merging must be entirely within the range being lock/unlocked
  • The range being merged can be larger, or at least exactly the range corresponding to the merged cells. If it’s a named range that works as well.

Also, you cannot lock/unlock a cell that is already within a protected range. E.g if you run:

Twice it will work the first time, and fail the second time around. So you should unprotect the target range (or the sheet) before.

Источник

How to lock a cell in Excel formula using VBA

Users entering data into the wrong cells or changing existing formulas can make data collection a tedious process. However, you can prevent users from going outside the intended boundaries by disabling certain sections of your workbook. In this article, we’re going to show you how to lock a cell in Excel formula using VBA.

Protection

Worksheets are objects in a workbook’s worksheet collection and they have Protect and Unprotect methods. These methods determine the protected status of a worksheet as the name suggests. Both methods can get accept other optional arguments. The first is the password argument. By setting a string for the parameter argument, you can lock your worksheets with a password. Below is a breakdown.

Lock Cells

Important note: Protecting a sheet does not lock individual cells! The cells you want to lock should be marked as Locked too. A cell can be marked as Locked, and/or Hidden, in two ways:

The User Interface method requires using the Format Cells dialog. Select a cell or a range of cells, and press Ctrl + 1 to open this menu and go to the Protection tab. Use the corresponding checkboxes to activate properties.

The second method is doing this via VBA code. Every cell and range can be made Locked and FormulaHidden properties. Set these two as True or False to change their status.

You can use the Hidden status to hide your formulas as well.

Detect Cells with Formulas

If you just need to lock only cells with formulas, you need to first identify cells that have formulas. The cells and ranges have a HasFormula property, which makes them read only. It returns a Boolean value based on whether the cell or range has a formula. A simple loop can be used to detect cells in a given range that contain formula.

To run this code, you need to add a module into the workbook or the add-in file. Copy and paste the code into the module to run it. The main advantage of the module method is that it allows saving the code in the file, so that it can be used again later. Furthermore, the subroutines in modules can be used by icons in the menu ribbons or keyboard shortcuts. Remember to save your file in either XLSM or XLAM format to save your VBA code.

Lock cells and protect a worksheet

The code example below checks every cell in the range «B4:C9» from the active worksheet. If a cell has a formula, it locks the cell. Otherwise, the cell becomes or remains unlocked.

Источник

Дарика

12 / 7 / 3

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

Сообщений: 63

1

12.01.2012, 17:34. Показов 13159. Ответов 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

17991 / 7617 / 890

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

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

Записей в блоге: 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

17991 / 7617 / 890

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

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

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

13.01.2012, 19:35

15

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

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



0



0 / 0 / 0

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

Сообщений: 6

01.01.2014, 14:15

16

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



0



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

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,
А вот так отлично)
Спасибо!

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Range insert vba word
  • Range insert vba excel
  • Range in worksheet for excel vba
  • Range from cell excel миф
  • Range formula in vba excel