Страницы: 1
RSS
Пользовательская форма прекращает работу Excel
 
В общем пользовательская форма с комбобоксом и выпадающим списком, каждый второй раз почему-то при её запуске срабатывает автоматически выпадание списка что приводит к глюку и вылетанию из 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

Я так думаю что дело в этом, но ведь он вроде не изменяется и не должен автораскрываться.
Можете запускать в режиме только для чтения в коем он и должен работать
Изменено: Семен Фадеев - 27.10.2021 14:23:17
 
Цитата
Семен Фадеев написал:
Код
If factor Then
Как минимум проблема в этой строке - макрос не понимает каким должен быть factor. Наверное так надо:
Код
If factor = 0 Then
? Или наоборот:
Код
If factor <> 0 Then
Изменено: Неопытный_Экселист - 27.10.2021 13:41:00
 
Цитата
Неопытный_Экселист написал:
Как минимум проблема в этой строке - макрос не понимает каким должен быть 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, правильно объявлять так
Код
Dim i As Long, i1 As Long
Изменено: New - 27.10.2021 13:56:40
 
Цитата
Семен Фадеев написал:
Как раз таки этот участок определяет не вводим ли мы новую позицию
А Вы уверены? В строке If Factor не указано, что должно произойти с Factor. То есть Factor = 0 подпадает под условие, когда оно не должно. Поэтому попробуйте переписать эту строчку так:
Код
If factor <> 0 Then
. После этого проверьте работу макроса на предмет указанных Вами вылетов.
 
Цитата
New написал: Возможно ошибка вот тут...
Спасибо что обратили внимание это вообще от другой формы лишний код. там нет кнопки. Я могу приложить файл но он не станет работать без справочников
 
Неопытный_Экселист, тут-то как раз ничего недопустимого нет. Это часто используемое опытными людьми сокращение. Основано на числовых представлениях логических значений: 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!!!)
 
Цитата
Неопытный_Экселист написал:
После этого проверьте работу макроса на предмет указанных Вами вылетов.
Данный участок кода продолжил функционировать по плану, но это не повлияло на вылет списка в произвольном месте экрана при запуске. Чтобы эксель не вылетал, я попробовал показать и скрыть форму при запуске файла! Форма открывается, этот список выпадает в левой верхней части экрана, и форма не скрывается:
Изменено: Семен Фадеев - 27.10.2021 14:20:19
 
Цитата
Alex_ST написал:
события клика ЛКМ мыши:
Алексей, а при чём тут мышь? KeyDown - нажатие любой клавиши клавиатуры, KeyUP - отпускание/поднятие клавиши клавиатуры. Это не мышь
Изменено: New - 27.10.2021 14:21:40
 
Цитата
New написал:
Вот так объявлять переменные в VBA неправильно
Это точно. А, если уж в Private Sub UserForm_Initialize() объявил как  
Код
Dim s&
, то и эти переменные нужно объявлять как
Код
Dim i&, i1&
для соблюдения единого стиля написания.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Спасибо, учту.
 
А почему на скриншоте у вас форма без заголовка (если это форма), а в коде нет никакого WinApi для скрытия заголовка формы?
Вы выложили не весь код?
В коде куча ошибок (и ссылок на отсутствующие файлы), потому протестировать не получается.

Причин вылета Excel - две:
1) некорректно прописанный код для WinAPI (если вы манипулируете формой, скрывая заголовок или что-то типа того)
2) зацикливание кода (что более вероятно в вашем случае)
вы на время заполнения комбобоксов не отключаете сработку событий, - оттого и запускается непрерывный цикл: изменение поля - событие Change или KeyDown сработало - поле поменялось кодом - опять  событие Change или KeyDown сработало - и так далее
 
Цитата
Игорь написал: А почему на скриншоте у вас форма без заголовка (если это форма), а в коде нет никакого WinApi для скрытия заголовка формы?
Потому что форма посередине скриншота а список выпал в отрыве от формы

Цитата
Игорь написал: вы на время заполнения комбобоксов не отключаете сработку событий
В целом вероятно, но остальные формы с комбобоксами работают и настроены по той же логике, но проблема только с этой.
 
Цитата
New написал:
Алексей, а при чём тут мышь?
Ну да, немного попутал...
Но вообще-то в коде нет выбора элемента управления после инициализации формы. А код с клавиатуры получит только активный элемент. А чем его можно инициализировать? В 99,9% случаев ЛКМ (можно ещё, конечно, и Tab-ом, но это очень редкое извращение)
Изменено: Alex_ST - 27.10.2021 14:38:24
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
В форме нет кнопки выбора, выбор осуществляет Enter нет элементов управления, активным элементом становится комбобокс (его не нужно инициализировать), Escape скрывает и чистит форму ,Enter делает то же самое но еще и заполняет таблицу.

Устранил проблему:
Код
Private Sub ComboBox1_Change()
If ComboBox1.Text = "" Then
Exit Sub
Else
ComboBox1.DropDown
End If
End Sub

Получалось что если ты закрыл его через Esc то он изменился с  "" на "" и это вызывало, эту функцию что приводило к выпаданию списка при скрытой форме и глюку.
Всех благодарю за участие и добрые советы.
Изменено: vikttur - 27.10.2021 16:38:23
Страницы: 1
Наверх