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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2019, 20:42   #1
Сашун
Новичок
Джуниор
 
Регистрация: 22.03.2019
Сообщений: 1
По умолчанию Помогите разобраться, если это решаемо...

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

В Excel 2007 необходимо программно запретить доступ к панели быстрого доступа "Ячейки" (содержит три подгруппы: Вставить, Удалить и Формат с набором команд).

В более широком смысле задача звучит так: если номер строки соответствует заданному, то запрет на все действия, связанные со вставкой и удалением строки (то есть, все способы вставить строку заблокированы НЕ ЧЕРЕЗ защиту листа).

Как пытался сделать:

1. этим кодом получил наименования баров, а также ИД и наименование принадлежащих им контролей:
Код:
Sub GetControls()
    Dim ComBar As CommandBar, ComBarCtrl As CommandBarControl
    Dim R As Range
    Dim CR As Long
    
    On Error Resume Next
    
    Set R = Worksheets("Лист3").Range("A3")
    CR = 0
    For Each ComBar In Application.CommandBars
       R.Offset(rowoffset:=CR).Value = ComBar.Name
       CR = CR + 1
       For Each ComBarCtrl In ComBar.Controls
          R.Offset(rowoffset:=CR).Value = ComBarCtrl.Caption
          R.Offset(rowoffset:=CR, columnoffset:=1).Value = ComBarCtrl.ID
          CR = CR + 1
       Next
    Next
End Sub
2. Потом пытался написать обработчик события (для вставки строк, аналогично - для удаления, только ИД другие). ИД взял из полученного списка. Нижеприведенный код гарантировано работает в отношении контроля ИД 3183 (это пункт контекстного меню при нажатии ПКМ на заголовке строки, короче говоря, на ее номере)

Код:
Sub EnableInsertControl(blnState As Boolean)
    Dim ComBar As CommandBar, ComBarCtrl As CommandBarControl
    On Error Resume Next
    For Each ComBar In Application.CommandBars
       Set ComBarCtrl = ComBar.FindControl(ID:=22, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
       Set ComBarCtrl = ComBar.FindControl(ID:=295, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
       Set ComBarCtrl = ComBar.FindControl(ID:=945, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
       Set ComBarCtrl = ComBar.FindControl(ID:=3183, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
       Set ComBarCtrl = ComBar.FindControl(ID:=3185, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
       Set ComBarCtrl = ComBar.FindControl(ID:=6002, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
       Set ComBarCtrl = ComBar.FindControl(ID:=30005, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
       Set ComBarCtrl = ComBar.FindControl(ID:=30057, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
       Set ComBarCtrl = ComBar.FindControl(ID:=31274, recursive:=True)
       If Not ComBarCtrl Is Nothing Then
          ComBarCtrl.Enabled = blnState
       End If
    Next
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
...
If ... Then
      EnableInsertControl (True)
Else
      EnableInsertControl (False)
End If
...
End Sub
Но, вот, в отношении остальных контролей - разобраться не могу...
Прошу строго не судить, ибо не брался за программирование лет 15 уже. Вот, пришлось.

Если кто знает, помогите пожалуйста.
Сашун вне форума Ответить с цитированием
Старый 25.03.2019, 00:52   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

понимаете лист Excel предназначен для того, чтобы в него вносили, обрабатывали данные
запретить всносить данные - очень геморройная задача (поверте, хлебанете Вы на этом пути... особенно с учетом 15 лет не приходилось)
придумайте альтернативный способ, как показать пользователю данные, но не давать возможности их поломать (с помощью формы и котролов на ней, возможно, достаточно одного ЛистБокса)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести число. Если оно положительное, найти его квадратный корень. Если отрицательное - возвести в квадратВвести число. Если оно п FYNZIK Паскаль, Turbo Pascal, PascalABC.NET 1 18.02.2014 16:29
Помогите разобраться. Serror Общие вопросы C/C++ 1 07.10.2009 16:08
омг ну и требования... если не лень помогите разобраться Tirendus Свободное общение 1 14.04.2009 17:18
Не могу разобраться с формулой ЕСЛИ Serg-1980 Microsoft Office Excel 1 24.09.2007 23:42