2014-12-13 3 views
2

Эй, у меня есть довольно странная проблема с кодом VBA. Я использую макросы для добавления/удаления пользовательских элементов управления программным способом. Когда я просто добавляю элемент управления пользовательской формой и после этого пытаюсь его удалить, все работает нормально. Но как только я пытаюсь удалить элементы управления пользовательской формы, которые я только что создал и использовал (как и userform.Show), я получил названную ошибку. После попытки снова это работает ... так что первый вопрос будет похожим, что, черт возьми, это? И второй вопрос заключается в том, как я могу решить эту проблему или мне даже нужно ее решить? Могу ли я просто запустить эту ошибку с помощью какой-либо обработки ошибок?Ошибка во время выполнения Excel VBA '-2147319767 (80028029)'

Я не уверен, что часть моего кода помогает понять мою проблему, но я предполагаю, что код для удаления элементов управления UserForm может помочь:

Public Function delete_userform_controls(strUserForm As String) 
    Dim VBProj As VBIDE.VBProject 
    Dim VBComp As VBIDE.VBComponent 
    Dim iCount As Integer 
    Dim cnt As Control 
    Dim iMaxColumns As Integer 
    Dim lCountOfLines As Long 

    Set VBProj = ActiveWorkbook.VBProject 
    Set VBComp = VBProj.VBComponents(strUserForm) 

    For Each cnt In VBComp.Designer.Controls 
     If TypeName(cnt) = "Label" Then iMaxColumns = iMaxColumns + 1 
    Next cnt 

    With VBComp.Designer 
     For iCount = 0 To iMaxColumns - 1 
      .Controls.Remove ("label_" & iCount & "") 
      .Controls.Remove ("textbox_" & iCount & "") 
     Next 
     .Controls.Remove ("ok_button") 
     .Controls.Remove ("cancel_button") 
    End With 

    With VBComp.CodeModule 
     .DeleteLines 1, .CountOfLines 
    End With 
End Function 

И только кроме того, если я не пользователь любой из userfoms я могу добавлять и удалять элементы управления столько, сколько хочу, никаких ошибок ... thx!

+1

Возможно, это проблема: http://dailydoseofexcel.com/archives/2014/12/11/recent-update-of-office-causes-problems-with-activex-controls/ –

+0

Можете ли вы изменить видимость элементов управления? – Qbik

ответ

1

Я подозреваю, что вы добавляете элементы управления во время разработки, но как только пользовательская форма загружается, вы пытаетесь удалить элементы управления во время выполнения, что запрещено. Когда вы видите ошибку в первый раз и выбираете [End], вы сбрасываете среду VBA, которая выгружает UserForm. (Другие вещи также происходят: все глобальные переменные теряют свои значения.) В этот момент пользовательская форма больше не загружается, поэтому вы можете удалять элементы управления.

Если это ваша ситуация, вам необходимо убедиться, что пользовательская форма загружена перед добавлением элементов управления. Когда вы делаете userform.Show в первый раз, происходят две вещи: форма загружается, а затем становится видимой. Вы можете загрузить его, не делая его видимым с помощью метода .Load. Затем вы можете добавить свои элементы управления. Пока вы не выгружаете форму с помощью метода .Unload (или сброса VBA), ваши элементы управления будут сохраняться. .Hide и .Show изменит видимость формы, но не приведет к тому, что элементы управления, добавленные во время выполнения, будут отброшены.

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

+1

Спасибо за ваш ответ. Наконец, именно эта тема вы подняли. Мне нужно было добавить «Load userform» перед каждым «userform.Show». Так это работает сейчас :) – Exic