VBA: Ошибка выполнения 9. Кажется, он не может найти публичную функцию в том же модуле кода UserForm.

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

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

Но когда я пытаюсь вызвать эту функцию в UserForm_Initialize, она систематически выдает ошибку выполнения 9 (нижний индекс вне допустимого диапазона).

Это означает, что он не может найти функцию, несмотря на то, что она Общедоступная и даже если они находятся в одном модуле (модуль кода UF).

Есть UserForm_Initialize, и я не могу найти способ вызвать свою функцию...

Private Opt As MSForms.OptionButton
Private Prod()
Private Stock()


Private Sub UserForm_Initialize()
Dim MaxWidth As Long, _
    TotalHeight As Long, _
    A()
MaxWidth = 0

'Add_Options (Split("test1,test2,test3,test4,test5,test6,test7", ","))

'Call GetMatchingArt
'A = GetMatchingArt()
'Add_Options A
'Add_Options GetMatchingArt
Add_Options GetMatchingArt()





For i = 0 To UF_Prod.Controls.Count - 1
    If UF_Prod.Controls(i).Width > MaxWidth Then MaxWidth = UF_Prod.Controls(i).Width
    TotalHeight = TotalHeight + UF_Prod.Controls(i).Height * 11 / 10
Next i

Me.Height = TotalHeight
Me.Width = MaxWidth * 12 / 10

If Me.CommandButton1.Width >= MaxWidth Then Me.CommandButton1.Width = 6 * MaxWidth / 10

Me.CommandButton1.Top = Me.Height - Me.CommandButton1.Height * 7 / 4
Me.CommandButton1.Left = (Me.Width - Me.CommandButton1.Width) / 2

MsgBox "UF ready", vbinfo, "Loaded UF"
End Sub

Вот функция:

Public Function GetMatchingArt() As Variant
LoadInfo
Dim cVal As String, _
    A() 

cVal = ActiveCell.Value2

For i = LBound(Prod, 1) To UBound(Prod, 1)
    If InStr(1, Prod(i, 1), cVal) Then
        A(UBound(A)) = Prod(i, 1)
        ReDim Preserve A(UBound(A) + 1)
    Else
        'No match
    End If
Next i
ReDim Preserve A(UBound(A) - 1)

GetMatchingArt = A
End Function

И остальная часть кода, который я использую (у которого не было проблем):

Public Sub LoadInfo()
    Prod = Sheets("Products").UsedRange.Value2
    Stock = Sheets("Stock").UsedRange.Value2
End Sub


Sub Add_Options(ByVal Arr As Variant)

For i = LBound(Arr) To UBound(Arr)
    Set Opt = UF_Prod.Controls.Add("Forms.optionButton.1", "Opt" & i, True)
    With Opt
        .Caption = Arr(i)
        .Top = Opt.Height * Int((i + 1) / 2)
        .Left = 10 + (Int((i + 1) / 2) * 2 - i) * UF_Prod.Width / 2
    End With
    Set Opt = Nothing
Next i
End Sub

Спасибо за вашу помощь! :)


person R3uK    schedule 30.04.2015    source источник
comment
Из того, что я вижу, бегло просмотрев ваш код. Вы пытаетесь добавить новую кнопку параметров в событие инициализации. Насколько я знаю, вы не можете этого сделать, так как код вызывается до того, как что-либо будет действительно инициализировано. Попробуйте поместить код в активацию, а не в инициализацию   -  person Sam    schedule 30.04.2015
comment
@ Сэм: Круто! :) Теперь все работает отлично! Я давно не делала УФ, я совсем забыла об этом! Сделайте ответ, чтобы я мог принять его и закрыть это! ;)   -  person R3uK    schedule 30.04.2015
comment
Без проблем. сейчас сделаю ответ. знак равно   -  person Sam    schedule 30.04.2015


Ответы (1)


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

РЕДАКТИРОВАТЬ. Оказывается, вы можете вставлять кнопки в инициализацию. Однако этот код не работал и работал на событии активации. Итак, что-то в коде пыталось использовать что-то, что не было инициализировано.

person Sam    schedule 30.04.2015
comment
Боюсь, это неправда. Вы, безусловно, можете добавить элементы управления в событие Initialize — я делаю это постоянно. - person Rory; 30.04.2015
comment
Тогда в этом случае, так как это сработало. Что-то еще не должно быть загружено, чтобы запустить код. Поэтому было бы лучше сделать это после полной инициализации формы и в событии активации - person Sam; 30.04.2015
comment
Возможно, но вам действительно следует отредактировать свой ответ, я думаю, поскольку он неверен в его нынешнем виде. ;) - person Rory; 30.04.2015