首页 > 解决方案 > 使用带有 SelectionChange 的 Excel VBA 用户窗体代码编译错误

问题描述

第一次在 stackoverflow 上发帖(所以我希望我遵守所有规则)。我在这里(以及一般的谷歌)浏览了这么多帖子以找到答案,但我没有尝试过任何工作。

我的文件背景:我有一张包含项目列表的工作表 (sheet1)(为了这个例子,我们只说 Apple、Banana、Orange 等)。它们在 A 列中(准确地说是 A2:A77)。

现在在 Sheet2 上,我希望在您单击特定单元格时弹出一个用户窗体(假设 sheet2 上的 A2:A50)。当用户窗体弹出时,有一个带有可搜索列表(组合框)和一个按钮的下拉列表(基本上您“接受”选择,然后将其添加到您选择的单元格中)。我在这个网站上找到了一个模板(http://boisgontierjacques.free.fr/pages_site/listes_cascade.htm#ListeIntuitiveForm),它完全符合我的要求。该网站是法语的,但基本上它是指向名为“Recherche Intuitive TextBox ListBox Form”的模板的链接。

如上所述,我已经完全按照模板复制了代码。我已确保命名相同,命名范围等,但没有任何效果。我尝试更改部分代码(将其设置为范围,设置变量等,但总是出错)。

这是我在 Sheet2 中的代码(单击单元格以弹出用户窗体):

Private Sub WorkSheet_SelectionChange(ByVal Target as Range)
If Not Intersect ([A2:A50]), Target) Is Nothing And Target.Count = 1 Then
    UserForm4.Left = Target.Left + 150
    UserForm4.Top = Target.Top + 90 - Cells(ActiveWindow.ScrollRow, 1).Top
    UserForm.Show
End If
End Sub

这是我为用户窗体提供的代码(我已经仔细检查了对象的命名,它们是相同的):

Dim a()
Private Sub UserForm_Initialize()
  Set a = [Liste]
  Me.ComboBox1.List = a
End Sub

Private Sub ComboBox1_Change()
  Set d1 = CreateObject("Scripting.Dictionary")
  tmp = UCase(Me.ComboBox1) & "*"
  For Each c In a
    If UCase(c) Like tmp Then d1(c) = ""
  Next c
  Me.ComboBox1.List = d1.keys
  Me.ComboBox1.DropDown
End Sub

Private Sub CommandButton1_Click()
  ActiveCell = Me.ComboBox1
  Unload Me
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then ActiveCell = Me.ComboBox1: Unload Me
End Sub

上面提到的模板包括代码、用户窗体、列表等,但由于某种原因,当我尝试复制它时,它给了我错误。它以错误 424(我解决了这个问题)开始,然后是错误 91(也解决了那个问题),但现在它给了我一个“编译错误:无法分配给数组”错误。

当我尝试调试 (F8) 时,它会突出显示这部分代码:

Private Sub UserForm_Initialize()- 这以黄色突出显示

a = [Liste].Value(这是原始版本,给了我 424 错误;

当我将其更改为Set a = [Liste](我在网上找到的建议之一)时,它a=以蓝色突出显示并给我编译错误。

该代码在网站的模板工作簿中运行良好,但我无法弄清楚为什么它在我的工作中不起作用。

非常感谢您的帮助,我已经尝试解决这个问题几个小时了!

标签: excelvba

解决方案


推荐阅读