Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2012, 10:07   #1
OgE®_M@G
Форумчанин
 
Аватар для OgE®_M@G
 
Регистрация: 28.06.2008
Сообщений: 124
По умолчанию Блокировать строку

Здравствуйте УВАЖАЕМЫЕ. Никак не могу разобраться с такой проблемкой. Нужно блокировать строку например А1:АА1, если в AB1 есть значение "Заблокировано". Пробовал через функцию find но он находит только первое значение а дальше не ищет. Как решить данную проблемку. Большое спасибо.
OgE®_M@G вне форума Ответить с цитированием
Старый 26.05.2012, 11:40   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Что означает «блокировать строку»?
Какая связь между «блокировкой», и функцией find?
EducatedFool вне форума Ответить с цитированием
Старый 28.05.2012, 07:47   #3
OgE®_M@G
Форумчанин
 
Аватар для OgE®_M@G
 
Регистрация: 28.06.2008
Сообщений: 124
По умолчанию

Функцией find я нахожу значение ячейки "AB". Если AB = "Заблокировано", то в строку А1:АА1 изменения внести уже нельзя.
Использую следующий макрос:
Код:
Sub BlockedAllRow()
Application.ScreenUpdating = False
Workbooks("Applications.xlsm").Worksheets("Application").Unprotect ("123")
    Range("A:AB").Select
    Selection.Locked = False
    Selection.FormulaHidden = False
    Cells.Find(What:="Заблокировано", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Selection.Locked = True
    Selection.FormulaHidden = True
    Workbooks("Applications.xlsm").Worksheets("Application").Activate
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFormattingColumns:=True, AllowFormattingRows:=True, Password:=("123") ' AllowFiltering:=True,
Application.ScreenUpdating = True
End Sub
Данный код находит только первое значение заблокировано, а дальше не ищет. Пробовал заключить в цикл, но тоже ничего не выходит.
OgE®_M@G вне форума Ответить с цитированием
Старый 28.05.2012, 10:32   #4
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

а так Вас не устроит?:
Код:
Sub BlockedAllRow()
Application.ScreenUpdating = False
With ActiveSheet
    .Unprotect Password:=""
        For i = 1 To 30
            If Range("C" & i) = "Заблокировано" Then
                Range("A" & i & ":" & "B" & i).Locked = True
                Range("A" & i & ":" & "B" & i).FormulaHidden = True
            Else
                Range("A" & i & ":" & "B" & i).Locked = False
                Range("A" & i & ":" & "B" & i).FormulaHidden = False
            End If
        Next
    .EnableOutlining = True
    .Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFiltering:=True, UserInterfaceOnly:=True
End With
Application.ScreenUpdating = True
MsgBox "Ok ))"
End Sub
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 28.05.2012, 11:10   #5
OgE®_M@G
Форумчанин
 
Аватар для OgE®_M@G
 
Регистрация: 28.06.2008
Сообщений: 124
По умолчанию

Спасибо вроде работает. Потестим еще. Немного переделал под себя.
Код:
Sub BlockedAllRow()
Application.ScreenUpdating = False
With ActiveSheet
    .Unprotect Password:="123"
        For i = 1 To 30
            If Range("AB" & i) = "Заблокировано" Then
                Range("A" & i & ":" & "AA" & i).Locked = True
                Range("A" & i & ":" & "AA" & i).FormulaHidden = True
'            Else
'                Range("A" & i & ":" & "B" & i).Locked = False
'                Range("A" & i & ":" & "B" & i).FormulaHidden = False
            End If
        Next
    .EnableOutlining = True
    .Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFiltering:=True, UserInterfaceOnly:=True
End With
Application.ScreenUpdating = True
End Sub
OgE®_M@G вне форума Ответить с цитированием
Старый 28.05.2012, 11:24   #6
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Код:
Sub BlockedAllRow()
Dim iLastrow as Long, i as Long
Application.ScreenUpdating = False
With ActiveSheet
    .Unprotect Password:="123"
        iLastrow = .Cells(.Rows.Count, 28).End(xlUp).Row' для определения последней строки по столбцу AB
        For i = 1 To iLastrow
            If Range("AB" & i) = "Заблокировано" Then
                Range("A" & i & ":" & "AA" & i).Locked = True
                Range("A" & i & ":" & "AA" & i).FormulaHidden = True
'            Else
'                Range("A" & i & ":" & "B" & i).Locked = False
'                Range("A" & i & ":" & "B" & i).FormulaHidden = False
            End If
        Next
    .EnableOutlining = True
    .Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFiltering:=True, UserInterfaceOnly:=True
' и у Вас еще было включено редактирование строк и столбцов AllowFormattingColumns:=True, AllowFormattingRows:=True
End With
Application.ScreenUpdating = True
End Sub
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 29.05.2012, 06:44   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Данную задачу можно решить и без использования циклов. Например, так:
Код:
Sub BlockedAllRow()
    Dim i As Long, x As Range, y As Range
    Set x = [AB:AB].Find("Заблокировано")
    If x Is Nothing Then Exit Sub
    ActiveSheet.Unprotect Password:="123": i = Cells(Rows.Count, "AB").End(xlUp).Row
    Set y = Range("A1:AA" & i): y.Locked = True: y.FormulaHidden = True
    Set y = Intersect(y, Range("AB1:AB" & i).ColumnDifferences(x).EntireRow)
    y.Locked = False: y.FormulaHidden = False: ActiveSheet.EnableOutlining = True
    ActiveSheet.Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFiltering:=True, UserInterfaceOnly:=True
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 29.05.2012, 09:39   #8
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
Радость

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Данную задачу можно решить и без использования циклов. Например, так:
Код:
Sub BlockedAllRow()
    Dim i As Long, x As Range, y As Range
    Set x = [AB:AB].Find("Заблокировано")
    If x Is Nothing Then Exit Sub
    ActiveSheet.Unprotect Password:="123": i = Cells(Rows.Count, "AB").End(xlUp).Row
    Set y = Range("A1:AA" & i): y.Locked = True: y.FormulaHidden = True
    Set y = Intersect(y, Range("AB1:AB" & i).ColumnDifferences(x).EntireRow)
    y.Locked = False: y.FormulaHidden = False: ActiveSheet.EnableOutlining = True
    ActiveSheet.Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFiltering:=True, UserInterfaceOnly:=True
End Sub
SAS888 если не тяжело "разжуйте" для "чайника", если можно как это работает и почему именно так. Если не составит труда построчно код. Спасибо
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 29.05.2012, 15:07   #9
OgE®_M@G
Форумчанин
 
Аватар для OgE®_M@G
 
Регистрация: 28.06.2008
Сообщений: 124
По умолчанию

То что я понимаю здесь:
Код:
Sub BlockedAllRow()
    Dim i As Long, x As Range, y As Range
    Set x = [AB:AB].Find("Заблокировано") ' диапазон поиска
    If x Is Nothing Then Exit Sub ' если диапазона нет то выход
    ActiveSheet.Unprotect Password:="123": i = Cells(Rows.Count, "AB").End(xlUp).Row '?
    Set y = Range("A1:AA" & i): y.Locked = True: y.FormulaHidden = True '?
    Set y = Intersect(y, Range("AB1:AB" & i).ColumnDifferences(x).EntireRow) '?
    y.Locked = False: y.FormulaHidden = False: ActiveSheet.EnableOutlining = True '?
    ActiveSheet.Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFiltering:=True, UserInterfaceOnly:=True ' включаем защиту
End Sub
Работает четко. SAS888 объясните пожалуйста строки кода, если можно

Последний раз редактировалось OgE®_M@G; 29.05.2012 в 15:11.
OgE®_M@G вне форума Ответить с цитированием
Старый 29.05.2012, 16:27   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
...объясните пожалуйста строки кода, если можно
Тот же код с подробными комментариями:
Код:
Sub BlockedAllRow()
'Определяем переменные
    Dim i As Long, x As Range, y As Range
'Ищем в столбце "AB" ячейку, содержащую значение "Заблокировано".
    Set x = [AB:AB].Find("Заблокировано")
'Если нет ни одной ячейки, то выходим из процедуры
    If x Is Nothing Then Exit Sub
'Если нашли, то снимаем защиту листа и присваиваем переменной "i" номер последней заполненной строки в столбце "AB"
    ActiveSheet.Unprotect Password:="123": i = Cells(Rows.Count, "AB").End(xlUp).Row
'Присваиваем переменной "y" диапазон ячеек, начиная с "A1" и до ячейки в строке "i" и столбце "AA"
'Всем ячейкам этого диапазона устанавливаем свойства "Защищаемая" и "Скрыть формулы"
    Set y = Range("A1:AA" & i): y.Locked = True: y.FormulaHidden = True
'Присваиваем переменной "y" диапазон пересечения ячеек текущего диапазона "y" и всех строк,
'значение которых в столбце "AB" отличается от значения найденной ранее ячейки "x" ("Заблокировано")
    Set y = Intersect(y, Range("AB1:AB" & i).ColumnDifferences(x).EntireRow)
'Для всех ячеек этого диапазона снимаем свойства "Защищаемая" и "Скрыть формулы"
'В результате, защищенными останутся только требуемые ячейки.
'Разрешаем группировку для защищенного листа.
    y.Locked = False: y.FormulaHidden = False: ActiveSheet.EnableOutlining = True
'Защищаем лист с паролем и возможностью выполнения указанных действий при защищенном листе
    ActiveSheet.Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, _
    AllowFiltering:=True, UserInterfaceOnly:=True
End Sub
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 29.05.2012 в 16:34.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Как временно блокировать кнопку? Риндера Помощь студентам 3 24.03.2011 21:11
блокировать ячейку с формулой ok`sana Microsoft Office Excel 20 24.10.2009 00:51
блокировать гибкие диски Ёрик Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 08.06.2009 21:30
Блокировать доступ Pedro Безопасность, Шифрование 8 02.03.2008 18:59
блокировать ALT+F4 Михаил Юрьевич Общие вопросы Delphi 2 12.02.2008 23:44