VBA:运行时错误 9 - 似乎无法在同一个用户窗体代码模块中找到 Public 函数
VBA : Runtime Error 9 - Seems it can't find Public Function in the same UserForm code module
这是我正在构建的用户窗体的代码,所有内容 运行 都可以通过测试数组顺利完成。
我正在寻找与 public 函数 GetMatchingArt 的部分匹配,这对他自己来说很好,为每个匹配添加一个 OptionButton
.
但是当我尝试在 UserForm_Initialize
中 调用这个函数 时,它系统地给我 运行时错误 9 (下标超出范围)。
意味着它找不到函数,尽管它是 Public 即使它们 在同一个模块中 (用友的代码模块).
有 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
感谢您的帮助! :)
据我所见,快速浏览了您的代码。您正在尝试在 initalize 事件中添加一个新的选项按钮。据我所知,您不能这样做,因为在真正初始化任何内容之前都会调用代码。尝试将代码置于 activate 而不是 initialise
编辑。原来你可以在初始化中插入按钮。然而这段代码并没有作用于激活事件。所以代码中的某些东西试图使用尚未初始化的东西。
这是我正在构建的用户窗体的代码,所有内容 运行 都可以通过测试数组顺利完成。
我正在寻找与 public 函数 GetMatchingArt 的部分匹配,这对他自己来说很好,为每个匹配添加一个 OptionButton
.
但是当我尝试在 UserForm_Initialize
中 调用这个函数 时,它系统地给我 运行时错误 9 (下标超出范围)。
意味着它找不到函数,尽管它是 Public 即使它们 在同一个模块中 (用友的代码模块).
有 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
感谢您的帮助! :)
据我所见,快速浏览了您的代码。您正在尝试在 initalize 事件中添加一个新的选项按钮。据我所知,您不能这样做,因为在真正初始化任何内容之前都会调用代码。尝试将代码置于 activate 而不是 initialise
编辑。原来你可以在初始化中插入按钮。然而这段代码并没有作用于激活事件。所以代码中的某些东西试图使用尚未初始化的东西。