Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Установка прав пользователей на редактирование ячеек - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Установка прав пользователей на редактирование ячеек (Макросы/Sub)
Установка прав пользователей на редактирование ячеек
semuss Дата: Суббота, 26.03.2016, 10:15 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
[vba]
Код
Public OldVal As String

Private Sub Worksheet_Activate()
    OldVal = ActiveCell.Value
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    OldVal = Target.Cells(1, 1).Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If (Environ("USERNAME") <> Cells(Target.Row, 1)) Then
        Target.Cells(1, 1).Value = OldVal
   End If
End Sub
[/vba]

Добрый день!

Написал простенький код для запрета редактирования пользователям отдельных строк.
Открываю файл, начинаю тестировать. Всё ок, пока не решу редактировать пустую ячейку. Тогда вылазит ошибка:

"Run-time error '-2147417848 (80010108)':
Method 'Value' of object 'Range' failed"

(Во-первых, конечно, интересует, как её побороть и чем ему так не нравится, что я ячейке присваиваю значение пустой строки (судя по дебагеру)).

Но и во-вторых, после этого код совершенно не хочет выполняться, никаких признаков "жизни" не подаёт, только после переоткрытия файла заново.
Совершенно не догоняю, в чём проблема!
К сообщению приложен файл: 7841955.xlsm (15.9 Kb)


Сообщение отредактировал semuss - Суббота, 26.03.2016, 12:36
 
Ответить
Сообщение[vba]
Код
Public OldVal As String

Private Sub Worksheet_Activate()
    OldVal = ActiveCell.Value
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    OldVal = Target.Cells(1, 1).Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If (Environ("USERNAME") <> Cells(Target.Row, 1)) Then
        Target.Cells(1, 1).Value = OldVal
   End If
End Sub
[/vba]

Добрый день!

Написал простенький код для запрета редактирования пользователям отдельных строк.
Открываю файл, начинаю тестировать. Всё ок, пока не решу редактировать пустую ячейку. Тогда вылазит ошибка:

"Run-time error '-2147417848 (80010108)':
Method 'Value' of object 'Range' failed"

(Во-первых, конечно, интересует, как её побороть и чем ему так не нравится, что я ячейке присваиваю значение пустой строки (судя по дебагеру)).

Но и во-вторых, после этого код совершенно не хочет выполняться, никаких признаков "жизни" не подаёт, только после переоткрытия файла заново.
Совершенно не догоняю, в чём проблема!

Автор - semuss
Дата добавления - 26.03.2016 в 10:15
МВТ Дата: Суббота, 26.03.2016, 10:34 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 476
Репутация: 137 ±
Замечаний: 0% ±

Excel 2007
Как-то так и без остальных событий[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  If (Environ("USERNAME") <> Cells(Target.Row, 1)) Then
        With Application
            .EnableEvents = False
            .Undo
            .EnableEvents = True
        End With
   End If
End Sub
[/vba]
 
Ответить
СообщениеКак-то так и без остальных событий[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  If (Environ("USERNAME") <> Cells(Target.Row, 1)) Then
        With Application
            .EnableEvents = False
            .Undo
            .EnableEvents = True
        End With
   End If
End Sub
[/vba]

Автор - МВТ
Дата добавления - 26.03.2016 в 10:34
semuss Дата: Суббота, 26.03.2016, 10:43 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
МВТ, большое спасибо!!!, так работает как надо! Всё оказалось проще и не нужно городить костыли.

%) Но почему мой код с костылями стал одноразовым? Понять бы причину! Вдруг эта проблема вылезет ещё где-нибудь...


Сообщение отредактировал semuss - Суббота, 26.03.2016, 10:47
 
Ответить
СообщениеМВТ, большое спасибо!!!, так работает как надо! Всё оказалось проще и не нужно городить костыли.

%) Но почему мой код с костылями стал одноразовым? Понять бы причину! Вдруг эта проблема вылезет ещё где-нибудь...

Автор - semuss
Дата добавления - 26.03.2016 в 10:43
RAN Дата: Суббота, 26.03.2016, 10:54 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Он не одноразовый, он зацикленный на бесконечность.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)    ' запускаем код
    If (Environ("USERNAME") <> Cells(Target.Row, 1)) Then
        Application.EnableEvents = False    ' отключаем обработку событий
        Target.Cells(1, 1).Value = OldVal    ' вызываем Worksheet_Change заново
    End If
    Application.EnableEvents = False    ' включаем обработку событий
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеОн не одноразовый, он зацикленный на бесконечность.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)    ' запускаем код
    If (Environ("USERNAME") <> Cells(Target.Row, 1)) Then
        Application.EnableEvents = False    ' отключаем обработку событий
        Target.Cells(1, 1).Value = OldVal    ' вызываем Worksheet_Change заново
    End If
    Application.EnableEvents = False    ' включаем обработку событий
End Sub
[/vba]

Автор - RAN
Дата добавления - 26.03.2016 в 10:54
semuss Дата: Суббота, 26.03.2016, 12:32 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
RAN, точно! Спасибо!!!! Что-то я стал совсем рассеянным :( ...
 
Ответить
СообщениеRAN, точно! Спасибо!!!! Что-то я стал совсем рассеянным :( ...

Автор - semuss
Дата добавления - 26.03.2016 в 12:32
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Установка прав пользователей на редактирование ячеек (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!