Как заблокировать ячейки?

Программирование на Visual Basic for Applications
Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Как заблокировать ячейки?

Сообщение Терминатор » 15.03.2005 (Вт) 12:14

Может показаться, что я уже совсем из ума выжил, и не могу воспользоваться help для такого простого вопроса? Тогда подскажите.

Хочу заблокировать ячейки, таким образом, чтоб не было "перескакиваний" через них. Например в столбцах А и D ячейки заблокированы через одну или наподобие шахматного порядка. В таком случае можно выделить любую не заблокированную и просто нажимая клавишами со стрелками вверх, вниз, впреаво, влево можно "перепрыгивая" через заблокированные добраться до любой незаблокированной и даже на другие столбцы. Понятное дело что стандартным способом этого не достигнуть. А как тогда быть?

Если я туманно объяснил, то говоря ещё проще, перемещение которого я хочу добиться будет напоминать "прохождению по лабиринту", необходимо передвигаться по каждой ячейке, выделяя её, а если встретилась заблокировынная, то её необходимо обойти только по незаблокированным ячейкам, без "перескоков" на любою незаблокированную.
:P
Hasta la vista, baby!

Andrev
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 19.01.2005 (Ср) 9:22
Откуда: Kursk

Ха!

Сообщение Andrev » 15.03.2005 (Вт) 12:59

Ерунда вопрос!
Вот пример (блокирую ячейку [1B]):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row = 1 And Target.Column = 2 Then
Cells(Target.Row, Target.Column + 1).Select 'это собственно обработчик - переводим фокус на ячейку в следующей колонке.
End If
End Sub

Это для одной ячейки. Если нужно заблокировать несколько - думай сам. Не придумаешь - пиши. Тут много добрых людев - помогут. ;-)

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 15.03.2005 (Вт) 18:21

Ну да почти ерунда,
Только не работает.
Может Вы на скорую руку писали, но "перескачить" такие ячейки легко. Не с одной так с другой стороны.
На всякий случай ещё раз обьяснение упрощаю. Может так понятней.
Представьте что у Вас игра в Excel типа "лабиринта". Вы идёте по ячейкам с помощью клавиш, натыкаясь на заблокированную, Вы не лишаетесь возможности уйти назад или в любую сторону, где нет заблокированных ячеек. Но НЕ МОЖЕТЕ ПЕРЕПРЫГНУТЬ ЕЁ С ЛЮБОЙ СТОРОНЫ
Hasta la vista, baby!

Andrev
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 19.01.2005 (Ср) 9:22
Откуда: Kursk

Сообщение Andrev » 15.03.2005 (Вт) 19:02

Ох ты, ёлки-палки!!!! Всё действительно не так просто, как казалось... Решим.
А если вот так:
Код: Выделить всё
Dim old_Row As Integer, old_Col As Integer

Private Sub Worksheet_Activate()
Cells(1, 1).Select
old_Row = 1
old_Col = 1
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If old_Row = 0 Or old_Col = 0 Then Worksheet_Activate
If Target.Row = 1 And Target.Column = 2 Then
  Cells(old_Row, old_Col).Select
Else
  old_Row = Target.Row
  old_Col = Target.Column
End If
End Sub

Это опять же - для одной ячейки (1,2). Для большего числа сейчас у меня нет времени. Попытайся сам разобраться. Не выйдет - пости снова. Спасу.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 15.03.2005 (Вт) 19:10

Код работает, не надо! Он должен быть:

1) В модуле соответствующего листа
2) Работа с макросами должна быть включена


а что бы нельзя было зайти на ячейку B1, еще и координаты надо запоминать, чтобы вернуть оратно

Код: Выделить всё
Public X As Long, Y As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If X = 0 Then
X = Target.Column
Y = Target.Row
End If
If Target.Row = 1 And Target.Column = 2 And Y = 2 Then
Cells(Y, X).Select
ElseIf Target.Row = 1 And Target.Column = 2 And X = 1 Then
Cells(Y, X).Select
ElseIf Target.Row = 1 And Target.Column = 2 And X = 3 Then
Cells(Y, X).Select
Else
X = Target.Column
Y = Target.Row
End If
End Sub

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 15.03.2005 (Вт) 19:18

Andrev, пока я отлаживал код, ты успел послать, а я не отсылал заготовленное сообщение, но моя программа лучше. :roll: :D

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 15.03.2005 (Вт) 20:13

Эх, шутники Вы, ребята...
Чем мне этот форум нравиться, так это оригинальностью. Хотя я тоже сначала не догнал, о чём енто Vitaly1 пишет. Но теперь вьехал. Кстати Vitaly1 по поводу

" 1) В модуле соответствующего листа
" 2) Работа с макросами должна быть включена

Ты уж это слишком.. (недооцениваешь что ли :shock: )
А то что твой вариант лучше, сейчас пробую. Ведь у меня не просто игра " лабиринт ", чуточку по сложнее. Обязательно прокомментирую. :arrow:
Hasta la vista, baby!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.03.2005 (Ср) 8:51

Первый код (Andrev) вполне рабочий. Только надо запоминать последнюю позицию и восстанавливать ее, если ход был неправильным.
Lasciate ogni speranza, voi ch'entrate.

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 16.03.2005 (Ср) 12:10

Vitaly1, не спешите осуждать меня, что я жучков-паучков по имени "макросы" не включил, но мне удалось ВЫДЕЛИТЬ ЗАБЛОКИРОВАННУЮ ячейку, мало того, вписать туда данные. Да, серьёзно, я не гоню.
А ведь у меня там инфа которая не должна искажаться пользователем. Естественно кроме кода, я поставил ещё и защиту стандартным способом. Поэтому проблем нет. Но я был удивлён что все-таки методом неоднократного тыка ( а также просто задержкой клавишей мыши на ячейке) можно её выделить. Правда, скажу правду, получилось у меня это только два раза, на третий просто терпения уже не хватили, ведь понятное дело, просто так код не позволяет это делать.

Andrev, с Вашим кодом такого не происходило, и хоть Vitaly1 сказал что его вариант лучше, (честно я так тоже сначала подумал)
практика и тест говорит о другом. Но как бы там нибыло, надеюсь вы не будите вступать в спор кто "круче кодит", ведь я Вам обоим благодарен, главное что я пропустил, это необходимость возврата в исходное положение.
Спасибо! :lol:
Hasta la vista, baby!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.03.2005 (Ср) 12:21

Ячейку надо не просто заблокировать, но и включить защиту листа.
Если офис XP, то можно запретить выделение заблокированных ячеек.
Lasciate ogni speranza, voi ch'entrate.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 16.03.2005 (Ср) 16:08

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

Код: Выделить всё
Public X As Long, Y As Long
Const Xc = 1, Yc = 1, sim = "x"

Private Sub Worksheet_Activate()
If X = 0 Then
X = ActiveCell.Column
Y = ActiveCell.Row
If Cells(Y, X).Value = sim Then
X = Xc
Y = Yc
Cells(Y, X).Select
Exit Sub
End If
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If X = 0 Then
Worksheet_Activate
End If

If Target.Value = sim Then
Cells(Y, X).Select
Else
X = Target.Column
Y = Target.Row
End If

End Sub


П.С.
И не надо тут обвинять меня, что я как то хотел унизить Andrev, или Терминатора. И в мыслях такого небыло!

Vitaly1, не спешите осуждать меня, что я жучков-паучков по имени "макросы" не включил, но мне удалось ВЫДЕЛИТЬ ЗАБЛОКИРОВАННУЮ ячейку, мало того, вписать туда данные. Да, серьёзно, я не гоню.

Терминатор, я тоже не гоню, не мышкой, и не клавишами у меня не получется выделить ячейку при первом предложенном мной коде, ее конечно можно выделить при отключеннгых макросах, но если макросы включить и сойти с запретной ячейки, я на нее не попадаю. Как впрочем и при первом коде предложенном Andrev!

Терминатор
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 164
Зарегистрирован: 06.01.2005 (Чт) 12:57
Откуда: Москва

Сообщение Терминатор » 16.03.2005 (Ср) 17:39

Vitaly1, я так и знал.
Да так иногда бывает, лучше промолчать и не сказать правду, иначе всё будет выглядеть не правдоподобно. Я когда увидел что всё-таки можно выделить ячейку, глазам своим не поверил. Но на третий раз мне это не удалось сделать. Слишком часто надо кликать или делать задержку с определённой паузой. Пока я немогу точно описать, каков метод выделения, ведь это получается импровезированно.
В любом случае теперь это не так важно, ведь я защищаю лист и всё книгу. И в прцессе работы такое не возникнет.

Наоборот я рад что Вы мне подсказали как это должно делаться. Ещё раз спасибо! :!:
Hasta la vista, baby!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 4

    TopList