|
Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2003/XP/2000 - [Решено] Защита "от дурака" в Excel |
|
2003/XP/2000 - [Решено] Защита "от дурака" в Excel
|
Новый участник Сообщения: 43 |
Профиль | Отправить PM | Цитировать
Здравствуйте!
Прошу помощи у специалистов! Приложен файл с ошибками в 327-й строке. Стоит защита листа (изначально - с паролем). Файл сделан в расчете на пользователей, НЕ УМЕЮЩИХ пользоваться компьютером в принципе. КАК могла возникнуть подобная ошибка?? Как модифицировать файл, чтобы избежать подобных ошибок в дальнейшем? Заранее большое спасибо! |
|
Отправлено: 13:33, 08-07-2014 |
Динохромный Сообщения: 690
|
Профиль | Отправить PM | Цитировать Ну, происходит следующее: когда вы выбираете ячейку с номером 46 или более, она попадает под условие Is>=46. По алгоритму эксель выделяет ячейку правее - номер 47. Она тоже попадает под ваше условие Is>=46. Выбирает 48, 49, 50... и так пока они не кончатся. После этого выпадает в ошибку. Думаю проще модифицировать код так (тут кстати и первые 5 строк учтены, как вы хотели):
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim j As Integer, i As Integer Static Jold As Integer If Application.ActiveCell.Row <= 5 Then Application.ActiveSheet.Cells(6, Application.ActiveCell.Column).Select j = Application.ActiveCell.Column Select Case j Case 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 42 i = 1 Case Else i = 0 End Select If Jold >= j And j <> 1 Then i = -i If j >= 44 Then i = -1 ActiveCell.Offset(0, i).Select Jold = Application.ActiveCell.Column End Sub |
Отправлено: 17:24, 09-07-2014 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 43
|
Профиль | Отправить PM | Цитировать Спасибо большое за очень полезную для меня информацию по VBA!
Но, видимо, это тупиковый в моем случае путь Ведь получается, что нужно еще прописать в конце таблицы переход на другую строку, да еще в ее начало. А если еще и отдельно прописывать активным диапазон из 2-х белых клеток напротив слова ЗАКАЗ!? Не слишком ли нецелесообразный код получится всего лишь для замены стандартного функционирования при разграничении выделяемых ячеек на защищенном листе? Вот если бы можно было написать, например, код, просто запрещающий ВСЕ операции с незащищенными ячейками, кроме ввода данных... Но, скорее всего, это либо невозможно, либо слишком сложно |
Отправлено: 18:01, 09-07-2014 | #12 |
Динохромный Сообщения: 690
|
Профиль | Отправить PM | Цитировать Цитата OSWin777:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim j As Integer, i As Integer Static Jold As Integer j = Application.ActiveCell.Column If j >= 44 Then Application.ActiveSheet.Cells(Application.ActiveCell.Row + 1, 1).Select ElseIf Application.ActiveCell.Row <= 5 And Application.ActiveCell.Address <> "$B$3" And Application.ActiveCell.Address <> "$A$3" Then Jold = Application.ActiveCell.Column Application.ActiveSheet.Cells(6, 1).Select Else Select Case j Case 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 42 i = 1 Case Else i = 0 End Select If Jold >= j And j <> 1 Then i = -i ActiveCell.Offset(0, i).Select End If Jold = Application.ActiveCell.Column End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim j As Integer, i As Integer Static Jold As Integer j = Application.ActiveCell.Column Select Case j Case 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 42 i = 1 Case Else i = 0 End Select If Jold >= j And j <> 1 Then i = -i If j >= 44 Then Application.ActiveSheet.Cells(Application.ActiveCell.Row + 1, 1).Select Else ActiveCell.Offset(0, i).Select End If If Application.ActiveCell.Row <= 5 And Application.ActiveCell.Address <> "$B$3" And Application.ActiveCell.Address <> "$A$3" Then Application.ActiveSheet.Cells(6, Application.ActiveCell.Column).Select Jold = Application.ActiveCell.Column End Sub |
|
Последний раз редактировалось a_axe, 10-07-2014 в 08:54. Отправлено: 18:29, 09-07-2014 | #13 |
Новый участник Сообщения: 43
|
Профиль | Отправить PM | Цитировать Ух-ты, спасибо большое!
Не так все сложно, оказывается . Главное, что такое постепенное усложнение мне наглядно продемонстрировало принципы создания и вложения конструкций в языке - это доходчивей и гораздо быстрее, чем по книге с нуля разбираться! Остался интересный вопрос, почему в столбце AQ нужно сделать 2 нажатия курсора вправо, чтобы перескочить в строку ниже? П.с. Разобрался сам: достаточно вместо If j >= 44 прописать If j > 42 ! Кроме того, добавил условие на конец таблицы: |
Последний раз редактировалось OSWin777, 09-07-2014 в 19:14. Отправлено: 18:41, 09-07-2014 | #14 |
Динохромный Сообщения: 690
|
Профиль | Отправить PM | Цитировать OSWin777, у меня достаточно одного нажатия.
Код я изменил, смотрите пост 13. Заметил еще вот что: если выделена ячейка В3 и нажать стрелку вправо, выделяется ячейка в 6-ой строке. Если нажать вправо еще раз - выделяется не соседняя ячейка, а через 2 ячейки правее. В новом пустом файле выделяется как положено - соседняя. Никуда не перескакивает. В вашем файле - перескакивает через 2 и вроде нормально дальше работает. В старом варианте кода еще при нажатии влево ячейка возвращалась с А6 на В3, если до этого стояла на В3 (код такого вообще не предусматривает и происходит это до того, как код что-то выбирает на листе). В пустом файле старый код также работает как положено. То ли у меня неучтенная ошибка, то ли в вашем файле. PS Мда. В файле экселя нужно разъединить ячейка с надписью "Заказ" и "Сумма", тогда код работает корректно. Их было не выделить из-за кода, и соответственно я не заметил, что они объединены. |
Последний раз редактировалось a_axe, 09-07-2014 в 20:23. Отправлено: 20:15, 09-07-2014 | #15 |
Новый участник Сообщения: 43
|
Профиль | Отправить PM | Цитировать У меня, наоборот, с эти кодом работает некорректно: если была выделена ячейка В3, то после перехода стрелкой вправо на А6 дальше движения нет вообще (до этого просто переходила на С6 и двигалась дальше), изменение условия с If j >= 44 на If j > 42 не убирает двойного нажатия на столбце AQ.
Я сдуру удалил у себя предыдущий вариант . Можно его снова выложить? П.с. Я вот переделал в такой вариант: Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim j As Integer, i As Integer Static Jold As Integer j = Application.ActiveCell.Column Select Case j Case 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38 To 42 i = 1 Case Else i = 0 End Select If Jold >= j And j <> 1 Then i = -i If j >= 44 Then Application.ActiveSheet.Cells(Application.ActiveCell.Row + 1, 1).Select Else ActiveCell.Offset(0, i).Select End If If Application.ActiveCell.Row <= 5 And Application.ActiveCell.Address <> "$B$3" And Application.ActiveCell.Address <> "$A$3" Then Application.ActiveSheet.Cells(3, 1).Select Jold = Application.ActiveCell.Column If Application.ActiveCell.Row > 645 Then Application.ActiveSheet.Cells(645, Jold).Select End Sub П.п.с. Что касается объединения ячеек, то, кстати, как без объединения добиться такого вида представленной в них информации? |
Последний раз редактировалось OSWin777, 10-07-2014 в 14:23. Отправлено: 20:46, 09-07-2014 | #16 |
Новый участник Сообщения: 43
|
Профиль | Отправить PM | Цитировать Подкорректировал код вверху.
Двойное нажатие на AQ было связано со скрытыми столбцами, совсем забыл про них. Или так на базе нового кода: Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim j As Integer, i As Integer Static Jold As Integer j = Application.ActiveCell.Column If j >= 44 Then Application.ActiveSheet.Cells(Application.ActiveCell.Row + 1, 1).Select ElseIf Application.ActiveCell.Row <= 5 And Application.ActiveCell.Address <> "$B$3" And Application.ActiveCell.Address <> "$A$3" Then Jold = Application.ActiveCell.Column Application.ActiveSheet.Cells(3, 1).Select Else Select Case j Case 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38 To 42 i = 1 Case Else i = 0 End Select If Jold >= j And j <> 1 Then i = -i ActiveCell.Offset(0, i).Select End If Jold = Application.ActiveCell.Column If Application.ActiveCell.Row > 645 Then Application.ActiveSheet.Cells(645, Jold).Select End Sub |
Последний раз редактировалось OSWin777, 10-07-2014 в 14:35. Отправлено: 14:22, 10-07-2014 | #17 |
Новый участник Сообщения: 43
|
Профиль | Отправить PM | Цитировать Переделал код с учетом запоминания предыдущих ячеек. Теперь работает почти аналогично стандартной защите ячеек (переучиваться не надо ) и даже удобнее в ряде моментов.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim j As Integer, i As Integer Static Jold As Integer Static Rold As Integer j = Application.ActiveCell.Column If j = 44 Then Application.ActiveSheet.Cells(Application.ActiveCell.Row + 1, 1).Select Jold = Application.ActiveCell.Column Rold = Application.ActiveCell.Row Else Select Case j Case 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38 To 42 i = 1 Case Else i = 0 End Select If Jold >= j And j <> 1 Then i = -i ActiveCell.Offset(0, i).Select If Application.ActiveCell.Column > 44 Or Application.ActiveCell.Row > 645 Or (Application.ActiveCell.Row <= 5 And Application.ActiveCell.Address <> "$B$3" And Application.ActiveCell.Address <> "$A$3") Then If Jold > 0 Then Application.ActiveSheet.Cells(Rold, Jold).Select Else Application.ActiveSheet.Cells(3, 1).Select End If End If End If Jold = Application.ActiveCell.Column Rold = Application.ActiveCell.Row End Sub |
Последний раз редактировалось OSWin777, 11-07-2014 в 23:52. Причина: Исправил код для устранения ошибки Отправлено: 21:17, 11-07-2014 | #18 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Защита DVD-видео от копирования (защита от "дурака") | Богданыч | Видео и аудио: обработка и кодирование | 3 | 09-11-2012 01:09 | |
истёк срок в системе "защита от вирусов" | Xadi | Хочу все знать | 17 | 17-05-2010 08:07 | |
2007 - Excel | Как снять защиту к некоторым функциям в книге при включенной "Защита листа"? | MaxRAF | Microsoft Office (Word, Excel, Outlook и т.д.) | 2 | 10-03-2010 03:59 | |
Прочее - Настройка ЛВС "Защита от пользователей" <Windows, Active Directory> | andrei.ru | Сетевые технологии | 5 | 16-11-2009 11:16 | |
Защита от "дурака" и просто обработка кода | Medic84 | AutoIt | 5 | 06-06-2009 23:25 |
|