2014-11-25 2 views
3

Я делаю форму Excel с некоторыми элементами управления ActiveX и возникает проблемы включения следующей функциональности,:Экземпляр: поле со списком и флажок?

enter image description here

Я хочу для пользователей, чтобы выбрать номер в ComboBox11. Если число равно 0, форма изменяется так, что комбобокс 9 и 10 становятся отключенными (с использованием кода VBA), а таблица ниже «исчезает» (с использованием условного форматирования), информируя пользователя о том, чтобы не заполнить его.

С другой стороны, если пользователь выбирает число, большее 0, форма остается такой, какая есть. Под таблицей находится флажок (checkbox1), используемый для расширения таблицы (скрытие ранее скрытых строк), если данные, требуемые для ввода в форму, больше, чем размер таблицы.

код VBA за выпадающий список 11 является:

Private Sub ComboBox11_change() 
Dim ws As Worksheet 
Set ws = Sheets("Form") 
If Not Me.ComboBox11.Text = "" Then ws.Range("J24") = CInt(Me.ComboBox11.Text) 'to write integer instead of text into linked cell 
    If Me.ComboBox11.Value = 0 Then 
     Me.ComboBox9.Enabled = False 
     Me.ComboBox10.Enabled = False 
     If Me.CheckBox1.Value = True Then Me.CheckBox1.Value = False 'if combobox11 is 0 than the table doesn't need to be expanded 
     Me.CheckBox1.Enabled = False 
    Else 
     Me.ComboBox9.Enabled = True 
     Me.ComboBox10.Enabled = True 
     Me.CheckBox1.Enabled = True 
    End If 
End Sub 

И код позади CheckBox1 является:

Private Sub CheckBox1_Change() 
Dim ws As Worksheet 
Set ws = Sheets("Form") 
    If CheckBox1.Value = False Then ws.Rows("46:71").Hidden = True 
    If CheckBox1.Value = True Then ws.Rows("46:71").Hidden = False 
End Sub 

Итак, если я выбираю 0 в combobox11 результат является:

enter image description here

Пока все хорошо. Но если я выбираю что-то большее, чем 0, скажем, 1 в combobox11, а затем попытаться расширить таблицу, нажав на CheckBox1, таблица расширяется, но я получаю сообщение об ошибке:

Ошибка выполнения «1004» : не возможно установить свойства: включен класс: OLEObject

(не уверен, что точный текст ошибки, так как я не использую английский MSOffice)

при нажатии на кнопку Debug, следующая строка в Sub ComboBox11_Change() загорается:

Me.ComboBox9.Enabled = True 

Странно, что эта ошибка не появляется, когда combobox11 остается пустым (значение не выбрано).

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

+0

Вы пытались использовать Application.EnableEvents = False в самом начале «CheckBox1_Change» и Application.EnableEvents = True в нем и в нем? – dee

+0

Что такое ListFillRange из ComboBox11 или как определяется List of ComboBox11? Возможно ли, что скрытие строк в CheckBox1_Change влияет на список ComboBox11? Если да, то почему? –

+0

@dee: спасибо за ваше предложение. Просто попробовал это и появилась такая же ошибка –

ответ

1

Поскольку комментарии слишком короткие, чтобы объяснить, что я сделал для решения проблемы, я отправляю этот ответ.

Прежде всего спасибо Аксель Рихтер, который не спешил подробно рассказать о моей проблеме.

Combobox11 был заполнен сгенерированным ListFillRange в менеджере имени:

enter image description here

Описанных ошибки перестали появляться, как только я изменил ListFillRange. Сначала я попробовал простую альтернативу: "=list!AU1:AU40" Хотя я не понимаю проблему, она теперь решена!

Впоследствии я использовал следующий код для создания динамического списка для combobox11.

 Dim zadnji As Integer 
     zadnji = Sheets("Form").Range("T9").Value + 1 
     Me.OLEObjects("combobox11").ListFillRange = "=lists!AU1:AU" & zadnji 
+0

Да, это работает, даже если он устанавливает ListFillRange ComboBox на том же листе, на котором работает код. Поэтому мое подозрение, что установка ListFillRange когда-либо будет повторно инициализировать ComboBox, неверна. Кажется, что это происходит только в том случае, если ListFillRange динамически имеет смысл, зависящий от вычислений Excel. В этом примере это исправление для вычислений приложения, но динамически с помощью VBA. –

2

Чтобы воспроизвести это:

У листа, как это: enter image description here

A1: A6 является ListFillRange в ComboBox.

Затем, скрывая любую строку между 1: 6, используя код VBA в CheckBox1_Change(), выдает ошибку.

Private Sub CheckBox1_Change() 
    If CheckBox1.Value = False Then Me.Rows("7:13").Hidden = True 
    If CheckBox1.Value = True Then Me.Rows("7:13").Hidden = False 
    'If CheckBox1.Value = False Then Me.Rows("6:13").Hidden = True 'ERROR 
    'If CheckBox1.Value = True Then Me.Rows("6:13").Hidden = False 'ERROR 
End Sub 

Private Sub ComboBox1_Change() 
    If Me.ComboBox1.Value = 0 Then 
     If Me.CheckBox1.Value = True Then Me.CheckBox1.Value = False 
     Me.CheckBox1.Enabled = False 
    Else 
     Me.CheckBox1.Enabled = True 
    End If 
End Sub 

Если мы создаем имя с именем «список», который связан с целой колонки, как это: enter image description here и использовать этот «список» в качестве ListFillRange из ComboBox, то ошибка возникает когда-либо, если строки в этот лист был скрыт от кода. Это не зависит от того, находятся ли скрытые строки в реальных активных «списках» строк 1-6 или нет.

Если мы не ссылаться на весь столбец в имени, но, например, только строки 1-10 нравится:

=INDEX(Sheet1!$A$1:$A$10;1):INDEX(Sheet1!$A$1:$A$10;6) 

то ошибка происходит только если код скрывает строки от 1 до 10, но не тогда, когда она скрывает ряды от 11 вверх.

Edit:

Чтобы продолжить мой пример: Переехал цифры от Лист1 A: А в Лист2! A: А и создал диапазон "список" с именем, связанные с

=Sheet2!$A$1:INDEX(Sheet2!$A$1:$A$40;COUNTIF(Sheet2!$A$1:$A$40;"<>")) 

Тогда следующий код для установки Sheet1.ComboBox1.ListFillRange в «список» будет работать, если он находится в пределах класса Sheet2 модуля:

Private Sub Worksheet_Change(ByVal Target As Range) 
ThisWorkbook.Worksheets(1).ComboBox1.ListFillRange = "list" 
End Sub 

это приведет к ошибке, если установка ListFill Диапазон проверяется в модуле класса Sheet1.

+0

Спасибо, Алекс. Не знал об этом. Кажется, каждый день - это школьный день. Но он все еще не решает мою проблему, потому что флажок скрывает/отображает строки 46:71, а список combobox подается из ячеек uptil row 40 (с использованием ссылки вроде этого: = lists! $ AS $ 1: INDEX (списки ! $ AS $ 1: $ AS $ 40; COUNTIF (списки! $ AS $ 1: $ AS $ 40; "? *")) , чтобы заполнить его только пустым ячеек). Я даже переместил все списки списков со списком на новый лист, и проблема все еще появляется. –

+0

Если проблема все еще появляется, когда списки ComboBox поступают с другого листа, то что-то другое повторно инициализирует компоненты ActiveX на этом листе с кодом на событиях этого листа. По моему опыту это приведет к полной потере доступа к элементам управления ActiveX. С повторной инициализацией я подразумеваю изменение вещей, которые обычно являются частью процесса инициализации. Изменение ListFillRage из ComboBoxes, например, но не изменение размера или перепозиционирование. –

+0

Опять же: как вы помещаете ListFillRange или список ComboBox11 в терминах именованного диапазона? С кодом? Тогда когда и с каким кодом? –

Смежные вопросы