Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2003/XP/2000 - [Решено] Защита "от дурака" в Excel

Ответить
Настройки темы
2003/XP/2000 - [Решено] Защита "от дурака" в Excel

Новый участник


Сообщения: 43
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: OSWin777
Дата: 09-07-2014
Вложения
Тип файла: rar Bug.rar
(112.3 Kb, 6 просмотров)
Здравствуйте!

Прошу помощи у специалистов!
Приложен файл с ошибками в 327-й строке. Стоит защита листа (изначально - с паролем). Файл сделан в расчете на пользователей, НЕ УМЕЮЩИХ пользоваться компьютером в принципе.
КАК могла возникнуть подобная ошибка??
Как модифицировать файл, чтобы избежать подобных ошибок в дальнейшем?

Заранее большое спасибо!

Отправлено: 13:33, 08-07-2014

 

Динохромный


Contributor


Сообщения: 690
Благодарности: 317

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо большое за очень полезную для меня информацию по VBA!

Но, видимо, это тупиковый в моем случае путь
Ведь получается, что нужно еще прописать в конце таблицы переход на другую строку, да еще в ее начало. А если еще и отдельно прописывать активным диапазон из 2-х белых клеток напротив слова ЗАКАЗ!?
Не слишком ли нецелесообразный код получится всего лишь для замены стандартного функционирования при разграничении выделяемых ячеек на защищенном листе?

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

Отправлено: 18:01, 09-07-2014 | #12


Динохромный


Contributor


Сообщения: 690
Благодарности: 317

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ух-ты, спасибо большое!

Не так все сложно, оказывается . Главное, что такое постепенное усложнение мне наглядно продемонстрировало принципы создания и вложения конструкций в языке - это доходчивей и гораздо быстрее, чем по книге с нуля разбираться!

Остался интересный вопрос, почему в столбце AQ нужно сделать 2 нажатия курсора вправо, чтобы перескочить в строку ниже?

П.с. Разобрался сам: достаточно вместо If j >= 44 прописать If j > 42 !
Кроме того, добавил условие на конец таблицы:
Код: Выделить весь код
If Application.ActiveCell.Row > 645 Then Application.ActiveSheet.Cells(645, 1).Select

Последний раз редактировалось OSWin777, 09-07-2014 в 19:14.


Отправлено: 18:41, 09-07-2014 | #14


Динохромный


Contributor


Сообщения: 690
Благодарности: 317

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить 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
Работает без двойных нажатий, наиболее логично, по-моему. Есть только маленькая проблема с невозможностью выхода с ячеек А3-В3 с помощью курсора. Но и она, вроде, тоже вписывается как раз в логику работы (это спец. ячейки, применяемые не так часто).

П.п.с. Что касается объединения ячеек, то, кстати, как без объединения добиться такого вида представленной в них информации?

Последний раз редактировалось OSWin777, 10-07-2014 в 14:23.


Отправлено: 20:46, 09-07-2014 | #16


Новый участник


Сообщения: 43
Благодарности: 0

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить 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



Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2003/XP/2000 - [Решено] Защита "от дурака" в Excel

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Защита 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




 
Переход