Ошибки в списках ActiveX Excel? - PullRequest
4 голосов
/ 25 февраля 2010

Я заметил, что я получаю всевозможные досадные ошибки, когда:

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

Я программирую довольно сложное приложение Excel, которое выполняет тонну обработки событий и использует много элементов управления. В течение нескольких месяцев я пытался справиться с множеством ошибок, связанных с этими комбо-боксами. Сейчас я не могу вспомнить все детали каждого экземпляра, но эти ошибки, как правило, связаны с указанием свойств listfillrange и relatedcell на именованные диапазоны и часто связаны с событиями поля со списком, которые запускаются в неподходящее время (например, когда application.enableevents = ложь) Эти проблемы, похоже, обострились в Excel 2007, поэтому мне пришлось полностью отказаться от этих полей со списками (теперь я использую поля со списками, содержащиеся в пользовательских формах, а не непосредственно на листах).

Кто-нибудь еще видел подобные проблемы? Если так, было ли изящное решение? Я посмотрел вокруг с Google и до сих пор не заметил никого с подобными проблемами.

Вот некоторые из симптомов, которые я вижу в итоге:

  • Сбой Excel при запуске (включает combobox_onchange, listfillrange-> named range на другом листе и взаимодействия workbook_open). (обратите внимание, у меня также была некоторая проверка данных на связанных ячейках на случай, если пользователь их редактировал напрямую.)
  • Ошибки рендеринга в Excel (обычно, когда меняется поле со списком, некоторые ячейки с другого листа случайным образом рисуются поверх текущего листа) Иногда это связано с тем, что экран на мгновение полностью мигает на другом листе.
  • Excel теряет рассудок (точнее, стек вызовов) (относится к первому пункту). Иногда, когда функция изменяет свойство в выпадающих списках, запускается событие combobox onchange, но оно никогда не возвращает управление функции, которая изначально вызвала изменение. События combobox_onchange запускаются, даже когда application.enableevents = false.
  • События запускаются, когда они не должны (я написал другой вопрос по переполнению стека, связанный с этим).

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

Ответы [ 5 ]

2 голосов
/ 30 ноября 2010

Мое поле со списком active-x работает нормально, когда мой Dell установлен в док-станцию, но при каждом нажатии на него размер шрифта увеличивается, что очень странно. Я добавил код изменения размера, который работает при отстыковке, но оба .height и .scaleheight терпят неудачу, когда состыкованы и когда запускаются программно (даже странно).

        Sheet2.Shapes("cb_SelectSKU").Select
        Selection.ShapeRange.Height = 40
        Selection.ShapeRange.ScaleHeight 0.8, msoFalse, msoScaleFromTopLeft

Затем я добавил свой собственный переключатель, похожий на enableevents, чтобы изменение размера происходило только тогда, когда пользователь выбирает значение в поле со списком, а не когда что-либо затрагивается во время работы макроса.

Select Case strHoldEvents
    Case Is = "N"                                                   'Combobox resizing fails with error when triggered programatically (from SaveData)

        Call ShowLoadShts

        Sheet2.Shapes("cb_SelectSKU").Select
        Selection.ShapeRange.Height = 40
        Selection.ShapeRange.ScaleHeight 0.8, msoFalse, msoScaleFromTopLeft


    Case Else
End Select

Наконец, это работает, независимо от того, подключен ли он или отстыкован, независимо от того, запущен ли он пользователем или во время процедуры. Посмотрим, будет ли оно ...

2 голосов
/ 25 февраля 2010

У меня нет однозначного ответа для вас, но я могу сказать, что прекратил использовать ListFillRange и LinkedCell для элементов управления ActiveX около 10 лет назад. Я не помню, с какими конкретными проблемами я столкнулся. Я просто помню, как пришел к выводу, что сколько бы времени они ни спасли меня, не стоит того, чтобы пытаться выследить ошибки. Итак, теперь я заполняю элементы управления кодом и работаю с выводом в событиях.

1 голос
/ 01 декабря 2017

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

'=========================================
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim str As String
Dim cboTemp As OLEObject
Dim ws As Worksheet
Set ws = ActiveSheet
On Error GoTo errHandler

If Target.Count > 1 Then GoTo exitHandler

Set cboTemp = ws.OLEObjects("ComboBox1")
  On Error Resume Next
If cboTemp.Visible = True Then
  With cboTemp
    .Top = 10
    .Left = 10
    .ListFillRange = "Treatment"
    .LinkedCell = Target.Address
    .Visible = False
    .Value = ""
  End With
End If



  On Error GoTo errHandler
  If Target.Validation.Type = 3 Then
    'if the cell contains a data validation list
    Application.EnableEvents = False
    'get the data validation formula
    str = Target.Validation.Formula1
    str = Right(str, Len(str) - 1)
    With cboTemp
      'show the combobox with the list
      .Visible = True
      .Left = Target.Left
      .Top = Target.Top
      .Width = Target.Width + 15
      .Height = Target.Height + 5
      .ListFillRange = ws.Range(str).Address
      .LinkedCell = Target.Address
    End With
    cboTemp.Activate
    'open the drop down list automatically
    Me.ComboBox1.DropDown
  End If

exitHandler:
  Application.ScreenUpdating = True
  Application.EnableEvents = True
  Exit Sub
errHandler:
  Resume exitHandler

End Sub
'====================================
'Optional code to move to next cell if Tab or Enter are pressed
'from code by Ted Lanham
'***NOTE: if KeyDown causes problems, change to KeyUp
'Table with numbers for other keys such as Right Arrow (39)
'https://msdn.microsoft.com/en-us/library/aa243025%28v=vs.60%29.aspx

Private Sub ComboBox1_KeyDown(ByVal _
        KeyCode As MSForms.ReturnInteger, _
        ByVal Shift As Integer)
    Select Case KeyCode
        Case 9 'Tab
            ActiveCell.Offset(0, 1).Activate
        Case 13 'Enter
            ActiveCell.Offset(1, 0).Activate
        Case Else
            'do nothing
    End Select
End Sub
'====================================

Я столкнулся со всевозможными проблемами, но, как в первую очередь упоминалось в этой теме, проблема LinkedCell была самой большой. Мой выбор из выпадающего меню будет идти куда угодно на листе, на котором я последний раз щелкнул, вместо ячейки, из которой я выбрал выпадающий список, и в процессе, также нарушая код того, куда будет идти выбор. Я использовал простой код ONE LINE, чтобы убедиться, что моя программа в ActiveX запускается только в раскрывающемся меню. Я использовал это до запуска команды LinkedCell:

If Target.Validation.Type = 3 Then
'... all the normal code here...
End If

Итак, мой код теперь выглядит так:

'... Code as before

If Target.Validation.Type = 3 Then
' NEW CODE LINE ABOVE
 If Target.Count > 1 Then GoTo exitHandler

Set cboTemp = ws.OLEObjects("ComboBox1")
  On Error Resume Next
If cboTemp.Visible = True Then
  With cboTemp
    .Top = 10
    .Left = 10
    .ListFillRange = "Treatment"
    .LinkedCell = Target.Address
    .Visible = False
    .Value = ""
  End With
End If
End If
' End of the new If

Невероятно, это сработало. И теперь мой лист Excel больше не ведет себя плохо. Надеюсь, это поможет.

1 голос
/ 02 декабря 2010

У меня частичный ответ для пользователей Dell и для вашей проблемы с форматированием

Проблема форматирования и отображения - еще одна известная, но недокументированная проблема в Excel.

Многие плоскопанельные мониторы (включая дисплеи ноутбуков) не могут правильно отображать шрифты в элементах управления текстовым полем электронной таблицы Excel: у вас слабая версия этой проблемы.

Наша компания недавно перешла на новые (и гораздо большие!) Мониторы, и я могу наконец использовать текстовые поля, метки и поля со списком на листах. Наши старые экраны Samsung правильно отображали текстовые элементы управления, но любые ручные или управляемые VBA обновления приводили к неразборчивому перемешиванию перекрывающихся символов.

У списков нет проблемы: проблема связана с частью текстового поля вашего поля со списком. Попробуйте манипулировать списком в процедурах событий VBA: это клудж, но он работает.

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

Проблема иногда улучшается (но никогда не решается полностью) с помощью шрифтов терминала или системы в элементе управления Active-X.

Проблема иногда улучшается (но никогда не решается полностью) с помощью события VBA, чтобы подтолкнуть или изменить размер элемента управления Active-X на 0,75 мм.

Проверьте, выпустил ли производитель вашего ноутбука обновление драйверов дисплея.

... И это все, что я знаю о проблеме рендеринга шрифтов. Если Майк (со своим ноутбуком Dell) читает это: удачи с этими обходными путями - насколько мне известно, нет никакого реального «исправления».

Проблема стабильности была главной головной болью для меня до выхода Excel 2003: использование любого элемента управления Active-X на листе было источником нестабильности. У жюри все еще нет элементов управления Listbox, встроенных в лист, даже в Excel 2003: я все еще избегаю их использования.

0 голосов
/ 25 февраля 2010

По этой причине я использую ячейки со списками проверки данных при помещении комбинированных полей в электронную таблицу.

...