MS-Excel: как показать значение поля со списком внутри заблокированной ячейки - PullRequest
0 голосов
/ 17 июня 2009

Справочная информация У меня есть таблица Excel с раскрывающимися списками Activex (выпадающий список), которые помогают пользователю узнать, какие варианты доступны. Я сделал это, потому что выпадающие списки валидации данных слишком малы по размеру шрифта и собирали много жалоб.

Таким образом, мое решение состояло в том, чтобы добавить комбинированные объекты, которые позволяют пользователю выбирать из ряда вариантов. Однако я должен связать комбинированные списки с ячейкой со свойством связанного элемента, чтобы и пользователь, и различные формулы могли видеть то, что было выбрано. Я также настроил исчезновение выпадающего списка, когда он не используется (во многом так же, как выпадающая кнопка проверки данных появляется только при выборе соответствующей ячейки).

Вот проблема: Я не хочу, чтобы пользователи редактировали значение в связанной ячейке, поэтому я удостоверяюсь, что связанная ячейка заблокирована, когда выпадающий список не выбран:

Private Sub comboBox1_GotFocus()
    Call unlockComboBoxTargetCell(comboBox1)
End Sub

процедура выше делает это:

 If (targetComboBox.LinkedCell <> "") Then
        Dim targetCell As Variant
        Set targetCell = Range(targetComboBox.LinkedCell)
        If Not targetCell Is Nothing And targetCell.Locked <> False Then
            unlockSheet (activesheet.Name)
            targetCell.MergeArea.Locked = False
            lockSheet (activesheet.Name)
        End If
    End If

Для блокировки целевой ячейки существуют эквивалентные процедуры. Однако всякий раз, когда вы выполняете действие «Сохранить как» в книге, кажется, что связанные и заблокированные ячейки создают проблему: Excel выдает эту ошибку на ровном месте: «Ячейка или диаграмма, которую вы пытаетесь изменить, защищены и поэтому доступны только для чтения ...» Эта ошибка появляется примерно два или три раза для каждой заблокированной ячейки и является связанной ячейкой для комбинированного списка.

Есть ли хороший способ преодолеть эту проблему? Прямо сейчас мое лучшее решение - оставить ячейки незапертыми и поместить проверку данных в ячейку, так что, если пользователь редактирует ячейку, ему будет, по крайней мере, отказано при вводе чего-либо недопустимого. Я мог бы убедиться, что поле со списком прикрывает связанную ячейку всякий раз, когда она выбрана, но иногда это означает наличие очень большого, раздражающего поля со списком с очень маленькой выпадающей кнопкой справа.

Возможно, я слишком разборчив в пользовательском интерфейсе?

Заранее спасибо за чтение этого длинного и сложного поста.

1 Ответ

2 голосов
/ 17 июня 2009

В созданной вами процедуре «lockSheet» для кода «защиты» рабочего листа требуется дополнительный параметр UserInterfaceOnly, установленный в значение true.

Я полагаю, саб LockSheet - это что-то вроде этого;

sub lockSheet(strSheetName as string)

    thisworkbook.sheets(strSheetName).Protect

end sub

Попробуйте это:

sub lockSheet(strSheetName as string)

    thisworkbook.sheets(strSheetName).Protect, UserInterfaceOnly=True

end sub

UserInterfaceOnly позволяет программно изменять защищенный лист.

Bill

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...