В общем пользовательская форма с комбобоксом и выпадающим списком, каждый второй раз почему-то при её запуске срабатывает автоматически выпадание списка что приводит к глюку и вылетанию из Excel. Можете посмотреть где в коде причина выпадания списка самостоятельно не дожидаясь нажатия клавиш? Вылетает по идее вот такая фигня: без самой формы и это приводит вылетанию: Посмотрите код формы может найдется причина почему она выпадывает постоянно?
Код
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim i, i1 As Long
If KeyCode = 13 Then
If ComboBox1.Text <> "" Then
ActiveCell = ComboBox1.Text
If ComboBox1.Text <> "" Then
factor = 1
For i = 1 To UBound(arr2)
If ComboBox1.Text = arr2(i, 1) Then
factor = 0
Exit For
End If
Next
If factor Then
If MsgBox("Вы хотите внести новый подшипник в Таблицу минимальных цен?", vbYesNo, "Выбор") = vbYes Then
newBearingCard.Show
Else
ComboBox1.Text = ""
bearingName.Hide
ActiveCell = ComboBox1.Text
Exit Sub
End If
End If
End If
For i = 1 To UBound(arr2)
If arr2(i, 1) = ComboBox1.Text Then
Cells(ActiveCell.Row, 10) = arr2(i, 3)
Cells(ActiveCell.Row, 11) = arr2(i, 4)
Cells(ActiveCell.Row, 12) = arr2(i, 5)
Cells(ActiveCell.Row, 13) = arr2(i, 7)
Cells(ActiveCell.Row, 14) = arr2(i, 9)
Cells(ActiveCell.Row, 15) = arr2(i, 2)
Cells(ActiveCell.Row, 16) = arr2(i, 6)
Exit For
End If
Next
End If
ComboBox1.Text = ""
bearingName.Hide
End If
If KeyCode = 27 Then
ComboBox1.Text = ""
bearingName.Hide
End If
End Sub
Private Sub UserForm_Initialize()
Dim s&
ComboBox1.MatchEntry = fmMatchEntryNone
ComboBox1.List = arr3
ComboBox1.Text = ""
End Sub
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim n&, b&
Dim Txt$
Dim Spisok(), NewSpisok()
If KeyCode <> 38 And KeyCode <> 40 And KeyCode <> 13 Then
ComboBox1.List = arr2
b = 0
Txt = UCase("*" & ComboBox1.Text & "*")
If Txt = "" Then ComboBox1.List = arr2: Exit Sub
ComboBox1.Clear
Erase NewSpisok
For i = 1 To UBound(arr2)
If IsNumeric(arr2(i, 2)) Then
If UCase(arr2(i, 1)) Like Txt Then
b = b + 1
ReDim Preserve NewSpisok(b)
NewSpisok(b) = arr2(i, 1)
End If
End If
Next
If b <> 0 Then ComboBox1.List = NewSpisok
End If
End Sub
Private Sub ComboBox1_Change()
ComboBox1.DropDown
End Sub
Private Sub ComboBox1_Change() ComboBox1.DropDown End Sub
Я так думаю что дело в этом, но ведь он вроде не изменяется и не должен автораскрываться. Можете запускать в режиме только для чтения в коем он и должен работать
Неопытный_Экселист написал: Как минимум проблема в этой строке - макрос не понимает каким должен быть factor.
Как раз таки этот участок определяет не вводим ли мы новую позицию и если да предлагает добавить её в справочник, и он работает без проблем. не только в этой форме.
ну, без вашего файла остаётся только гадать. Возможно ошибка вот тут
Код
Private Sub CommandButton1_Click()
If ComboBox1.Text <> "" Then ActiveCell = ComboBox1.Text
nameKontragent.Hide
End Sub
CommandButton1 - это кнопка за что отвечает? Почему именно Hide, а не Unload Me ? Hide - скрывает форму от глаз человека, но не закрывает её полностью. Если это кнопка у вас называется Выход/Закрыть форму, то она этого не делает
P.S. Вот так объявлять переменные в VBA неправильно
Код
Dim i, i1 As Long
Это тоже самое, что Dim i as Variant, i1 As Long, правильно объявлять так
Семен Фадеев написал: Как раз таки этот участок определяет не вводим ли мы новую позицию
А Вы уверены? В строке If Factor не указано, что должно произойти с Factor. То есть Factor = 0 подпадает под условие, когда оно не должно. Поэтому попробуйте переписать эту строчку так:
Код
If factor <> 0 Then
. После этого проверьте работу макроса на предмет указанных Вами вылетов.
Неопытный_Экселист, тут-то как раз ничего недопустимого нет. Это часто используемое опытными людьми сокращение. Основано на числовых представлениях логических значений: false =0 , true >0 А вот с логикой событий мыши на комбобоксе что-то хитрое накручено. Почему-то отдельно обрабатываются обычно неразрывно следующие друг за другом (если, конечно, не заснул, нажав ЛКМ) события клика ЛКМ мыши: ComboBox1_KeyDown (нажатие ЛКМ) и ComboBox1_KeyUp (отпускание ЛКМ) вместо того, чтобы сделать всё в одной процедуре обработки события ComboBox1_Click Но это, кажется, ничего не должно вешать кроме мозгов разбирающего код юзера. А вот зачем два раза подряд проверяется условие
Код
If ComboBox1.Text <> "" Then
ActiveCell = ComboBox1.Text
If ComboBox1.Text <> "" Then
я не понял.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Неопытный_Экселист написал: После этого проверьте работу макроса на предмет указанных Вами вылетов.
Данный участок кода продолжил функционировать по плану, но это не повлияло на вылет списка в произвольном месте экрана при запуске. Чтобы эксель не вылетал, я попробовал показать и скрыть форму при запуске файла! Форма открывается, этот список выпадает в левой верхней части экрана, и форма не скрывается:
А почему на скриншоте у вас форма без заголовка (если это форма), а в коде нет никакого WinApi для скрытия заголовка формы? Вы выложили не весь код? В коде куча ошибок (и ссылок на отсутствующие файлы), потому протестировать не получается.
Причин вылета Excel - две: 1) некорректно прописанный код для WinAPI (если вы манипулируете формой, скрывая заголовок или что-то типа того) 2) зацикливание кода (что более вероятно в вашем случае) вы на время заполнения комбобоксов не отключаете сработку событий, - оттого и запускается непрерывный цикл: изменение поля - событие Change или KeyDown сработало - поле поменялось кодом - опять событие Change или KeyDown сработало - и так далее
Ну да, немного попутал... Но вообще-то в коде нет выбора элемента управления после инициализации формы. А код с клавиатуры получит только активный элемент. А чем его можно инициализировать? В 99,9% случаев ЛКМ (можно ещё, конечно, и Tab-ом, но это очень редкое извращение)
В форме нет кнопки выбора, выбор осуществляет Enter нет элементов управления, активным элементом становится комбобокс (его не нужно инициализировать), Escape скрывает и чистит форму ,Enter делает то же самое но еще и заполняет таблицу.
Устранил проблему:
Код
Private Sub ComboBox1_Change()
If ComboBox1.Text = "" Then
Exit Sub
Else
ComboBox1.DropDown
End If
End Sub
Получалось что если ты закрыл его через Esc то он изменился с "" на "" и это вызывало, эту функцию что приводило к выпаданию списка при скрытой форме и глюку. Всех благодарю за участие и добрые советы.