天道酬勤,学无止境

How to reference ActiveX ComboBox in Excel 2016 VBA

问题

我在这里和其他地方尝试了各种解决方案,例如:

dim wb as workbook, ws as worksheet

Dim cb As Object
Set cb = ws.OLEObjects("ComboBoxViews")

或者

ComboBoxViews

或者

ws.comboboxviews

但是都返回错误 1004,没有找到具有指定名称的项目。 但它确实存在,检查名称非常清楚的属性是'comboboxviews'。

有任何想法吗?

编辑:

为了让其他人在未来寻求帮助并使用 Romcel 非常有用的代码作为基础,似乎为了向 ActiveX ComboBox(这是我的最终目标)添加项目,您需要将其作为对象引用:

Sub caller3()
Dim ws As Worksheet
Dim oleob As OLEObject
Set ws = ThisWorkbook.Sheets("Sheet1")

For Each oleob In ws.OLEObjects
  If TypeName(oleob.Object) = "ComboBox" Then
    oleOb.Object.AddItem "TEST"  <<< CORRECT
    oleOb.AddItem "TEST"  <<< INCORRECT
  End If
Next

End Sub
回答1

您可以直言不讳地参考工作表中的控件,例如。

Sub caller1a()
Sheet1.ComboBox1.Value = "value 1a"    '   no errors
End Sub


但是你不能这样引用它们。

Sub caller1b()
Dim ws As Worksheet
  Set ws = Sheet1
  ws.ComboBox1.Value = "value1b"    '  will give error
End Sub


如果您熟悉 Excel 如何为每个控件提供各自的索引。 您可以将每个控件称为。

Sub caller2()
Dim ws As Worksheet
  Set ws = Sheet1
  ws.OLEObjects(1).Object.Value = "value2"
End Sub

或者只是安全地循环它们并检查它是否是您正在使用的正确控件。

Sub caller3()
Dim ws As Worksheet
Dim oleob As OLEObject
Set ws = ThisWorkbook.Sheets("Sheet1")

For Each oleob In ws.OLEObjects
  If TypeName(oleob.Object) = "ComboBox" Then
    oleob.Object.Value = "value3"
  End If
Next

End Sub

希望这可以帮助。 祝你好运!

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to reference ActiveX ComboBox in Excel 2016 VBA
    I've tried various solutions on here and elsewhere such as: dim wb as workbook, ws as worksheet Dim cb As Object Set cb = ws.OLEObjects("ComboBoxViews") or ComboBoxViews or ws.comboboxviews But all return Error 1004, the item with specified name wasn't found. But it DOES exist, checking properties the name is very clearly 'comboboxviews'. Any ideas? EDIT: To make it clear for anyone else seeking help in the future and using Romcel's very helpful code as a base, it seems that in order to add items to an ActiveX ComboBox (which is my final goal), you need to reference it as an object: Sub
  • 如何在 Excel 中使用 vba 创建和填充 activex 组合框。(How to create and populate an activex combobox using vba in excel.)
    问题 我在尝试在 vba 中为 excel 创建然后填充 activex 组合框时遇到问题。 下面的代码在作为两个单独的宏运行时有效,但是当我尝试将两者放在一起时,会创建一个空的组合框。 谁能告诉我这是为什么以及如何克服这个问题? 提前致谢,JW Sub CreateComboBox1() 'Creating ComboBox1: ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _ Link:=False, DisplayAsIcon:=False, Left:=50, Top:=80, Width:=100, _ Height:=15).Select End Sub Sub PopulateComboBox1() 'Populating ComboBox1 Sheet1.ComboBox1.AddItem "Date", 0 Sheet1.ComboBox1.AddItem "Player", 1 Sheet1.ComboBox1.AddItem "Team", 2 Sheet1.ComboBox1.AddItem "Goals", 3 Sheet1.ComboBox1.AddItem "Number", 4 End 回答1 试试这个 Sub CreateComboBox1() With ActiveSheet
  • VBA:如何引用 ComboBox 对象(VBA: How To Reference ComboBox Object)
    问题 我在 Excel 的第一个工作表上创建了一个单独的 ComboBox。 但是,我找不到引用其对象的方法。 我插入了一个模块,我的一个 sub 可以成功引用以下值: 工作表(“工作表1”)。名称 但是,以下内容不可用并引发错误: 组合框1.Value 错误消息是:运行时错误“424”:需要对象 有人可以解释如何在我的工作表中引用这个 ComboBox 吗? 谢谢 回答1 这取决于您创建的组合框类型: 表单控件: Sheets("Sheet1").DropDowns(1) ActiveX 控件: Sheets("Sheet1").ComboBox1 Sheets("Sheet1"). 如果代码位于 VBA 模块Sheet1则可以省略。 另请参阅 Excel 2010 中的“表单控件”和“ActiveX 控件”有什么区别?
  • How to create and populate an activex combobox using vba in excel.
    I am having a problem when trying to create and then populate a activex combobox in vba for excel. The code below works when run as two seperate macros but when I try to put the two together an empty combobox is created. Can anybody tell me why this is and how to overcome this problem? Thanks in advance, JW Sub CreateComboBox1() 'Creating ComboBox1: ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _ Link:=False, DisplayAsIcon:=False, Left:=50, Top:=80, Width:=100, _ Height:=15).Select End Sub Sub PopulateComboBox1() 'Populating ComboBox1 Sheet1.ComboBox1.AddItem "Date", 0 Sheet1
  • Excel的窗体控件和ActiveX控件之间的区别(Differences between Excel's Form Controls & ActiveX Controls)
    问题 为什么Excel中提供两种控件? (2个按钮,2个组合框,2个复选框等...) 窗体控件和ActiveX控件有什么区别? 我应该使用哪一个? 我发现一些代码示例可以在控件上在线使用,而另一些则不能。 怎么来的? 如何处理每种类型,如何区分它们? 回答1 Excel可用的两种控件存在[永恒的]混淆-不同的在线资源使用的对比术语加剧了这种情况。 这只是Form Controls和ActiveX Controls之间差异的一般概述(基于我的旧笔记,这些内容最终帮助我找出了差异!)请访问随附的链接,以获取有关每个控件的更详细信息,包括代码和示例项目。 ☺ (改编自我在此处的原始帖子-现在已关闭) 概述: 控件有两种类型:表单控件和ActiveX控件: 这两种类型的控件可以在工作表上使用,但只有ActiveX控件可以在用户窗体中使用。 表单控件是Shapes集合的一部分(就像“绘图对象”一样),因此被称为: ActiveX控件基本上是工作表的一部分,因此被称为: 两种类型的控件都可以在工作表中创建,修改和删除,也可以使用VBA编程地进行删除,但是,两种类型的控件在使用VBA引用它们时的语法略有不同。 一些站点讨论还讨论了数据表单。 这不过是专门为数据输入/处理而设计的用户表单,因此将它们(听起来更熟悉)称为“数据输入用户表单”会更有意义。 Office文档有时也将工作表称为表单。
  • 如何将事件与用户窗体上的选项按钮控件一起使用(How to use Events with Option Button Controls on Userform [duplicate])
    问题 这个问题已经在这里有了答案: 将代码分配给动态创建的按钮(2个答案) 3年前关闭。 我正在尝试从Excel工作表中的范围添加一个选项按钮。 For Each Value In OptionList Set opt = UserForm3.Controls.Add("Forms.OptionButton.1", "radioBtn" & i, True) opt.Caption = Value opt.Top = opt.Height * i opt.GroupName = "Options" UserForm3.Width = opt.Width UserForm3.Height = opt.Height * (i + 2) i = i + 1 Next 我想创建一个事件处理程序,以便在从用户运行代码时如果选择radiobtn1 。 尽管我有很多答案,但这些答案是针对工作表用户表单的。 我的意图是使用VBA用户表单。 请帮我与您的想法。 回答1 用户表单只有一种类型,但是[Excel]可用的两种控件存在[永恒]的困惑–不同在线资源使用的对比术语加剧了这种困惑。 (仅有关ActiveX控件的部分适用于用户表单。)也许我可以通过在一些可以帮助我理解的文字中加以说明。 ☺ 概述: 控件有两种类型:表单控件和ActiveX控件: 这两种类型的控件可以在工作表上使用
  • 为什么 VBA 仅在退出 Excel 时在 ComboBox 上生成“未找到方法或数据成员”错误?(Why does VBA generates a "Method or data member not found" error on a ComboBox, only when exiting Excel?)
    问题
  • 在 Excel ComboBox 中动态设置 ListFillRange(Dynamically set ListFillRange in Excel ComboBox)
    问题 我尝试做类似的事情: cmbMyBox.ListFillRange = "E2" 但组合框似乎没有填充。 回答1 首先,为了尝试从 VBA 设置 listfillrange,您需要包含 '=' 符号,如下所示: combobox.ListFillRange = "=E3:E13" 而不是combobox.ListFillRange = "E3:E13" ,这是行不通的。 您可以有一个动态命名范围,例如: listItems: "=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA(Sheet1!$A:$A))" 使用 VBA 像这样设置 ListFillRange: combobox.ListFillRange = "=listItems"再次使用'='符号!! 此动态范围列表项会动态增长/缩小,具体取决于您在 A 列中的值。 我知道我回答得很晚,但我注意到很多人认为命名范围总是必须固定的,而它们也可以是动态的...... 你怎么做到这一点? 在 Excel 2007 及更高版本中,您可以转到功能区选项卡"Formulas"并单击“名称管理器”按钮,而不是选择单元格并在左上角的框中为其命名,您可以在此处管理所有定义的命名范围. 创建一个新的,并给它值(不带引号): "=Sheet1!$A$1:INDEX(Sheet1!$A:$A;COUNTA
  • Why does VBA generates a "Method or data member not found" error on a ComboBox, only when exiting Excel?
    I have two ComboBoxes, Sheet1.Line_Items, and Sheet1.SerialNumber and some code that interacts with the two. Overall code works fine, but generates an "Method or data member not found" error when exiting Excel. Is there a way to prevent that error from happening, or even a way to suppress the error so that users are not inconvenienced by the error when closing Excel? My code: Private Sub Line_Items_Change() ' Line_Items is an ActiveX ComboBox Dim ar As Variant Dim i As Integer Dim data As Dictionary If Sheet1.Line_Items.Value Then ar = GetSerialNumber(Sheet1.Line_Items.Value) Else ar =
  • Excel - 通过 VBA 显示 ComboBox DropDown(Excel - Display ComboBox DropDown by VBA)
    问题 我需要一个工作簿来在打开时显示组合框列表下拉列表。 工作簿中的组合框是一个表单控件,因此是一个形状。 似乎无法找到相关的属性。 回答1 如果您使用的是 ActiveX 控件,请参阅以下内容,否则,如果您使用的是表单控件,则如果您希望通过代码进行下拉,则将它们替换为 ActiveX 控件。 下面的代码适用于表单和工作表中的 ActiveX 控件。 如果控件在工作表上,则将ComboBox1.SetFocus更改为ComboBox1.Activate 我能想到的两种方法... 使用简单的命令 久经考验 Private Sub CommandButton1_Click() ComboBox1.DropDown End Sub 使用发送键。 如果使用不当,发送键是不可靠的。 久经考验 Private Sub CommandButton1_Click() ComboBox1.SetFocus SendKeys "%{Down}" End Sub 截图 回答2 我在使用 .dropdown 时遇到过很多崩溃,但使用 SendKeys 找到了一些成功... 回答3 我认为最好的 UserForm 组合框是 Siddharth Rout ComboBox1.SetFocus SendKeys "%{Down}" 对于工作表上的某些组合框 CB.DropDown 就足够了 .. 就像它们没有
  • VBA Excel 组合框:下拉列表滚动问题(VBA Excel Combobox: drop-down list scrolling issue)
    问题 我正在运行 32 位 Excel 2010。我创建了多个 ActiveX 控件组合框,它们的下拉列表中都有条目数。 问题是,我想使用鼠标滚动来滚动列表,而不是使用鼠标单击来滚动列表,但它实际上不起作用。 当我在列表内部滚动时,它会向下滚动整个列表而不是其中的内容。 那么有谁知道如何添加这个功能呢? 回答1 我使用这种方法来阻止列表从组合框分离并用鼠标滚动向下移动工作表。 它实际上禁用了鼠标滚动,但您仍然可以移动鼠标来选择一个项目,如果它出现,则可以操作右侧的滚动条。 选择放置 ActiveX 组合框和工作表的行在公式栏中键入命名范围,然后按 Enter。 例如:“rngJobRoleCombo” 在开发模式下右键单击控件,然后选择“查看代码” 选择控件的 GotFocus 事件Private Sub cboJobRole_GotFocus() Me.ScrollArea = Range("rngJobRoleCombos").Address End Sub 选择控件 LostFocus 事件Private Sub cboJobRole_LostFocus() Me.ScrollArea = "" End Sub 当控件处于焦点时,这会将鼠标滚动限制到工作表的单元格范围地址。
  • 带有 DatePicker 的 Excel VBA 中的“对象库无效或包含引用...”(“Object Library invalid or contains references…” in Excel VBA with DatePicker)
    问题 我一直在处理带有大量 VBA 代码的 Excel 工作簿,现在我已将此文件发送给一些同事进行测试,但它在他们的计算机上不起作用。 我们都在同一家公司工作,使用 Windows XP SP2 和 Office 2003。 工作簿有一个在单击形状时打开的表单,它包含一些控件。 当他们单击表单的形状以显示以下错误时: “对象库无效或包含对无法找到的对象定义的引用” 在表单中有一个 DatePicker,我认为问题就在这里。 如果我从表单中删除 datePicker 并再次向他们发送文件,他们不会收到此错误消息。 我已经尝试删除这两个站点“Microsoft”和“lessanvaezi”中提到的 mscomct2.exd 文件,但错误仍然存​​在。 我检查并生成了新的 .exd 文件。 一些附加信息: 我检查了他们的系统,他们确实在正确的位置(c:\Winxp\System32)有文件 mscomct2.ocx。 如果我打开一个空的 Excel 文件,请转到 VBA 编辑器转到工具->参考,我看不到注册“Microsoft Common Control-2 6.0 (SP6)”(mscomct2.ocx) 的选项。 相反,我看到了“Microsoft Windows Common Controls Satellite-3 6.2)”(cmct3de.dll)。 我将带有
  • Excel ActiveX 组合框将所选日期显示为数字而不是日期(Excel ActiveX combobox displays selected date as number rather than date)
    问题 我有一个 ActiveX 组合框。 它的 ListFillRange 是另一个工作表上的范围。 它找到日期,但是当我选择它们时,我得到了这个奇怪的值。 有谁知道发生了什么以及如何解决它? 我已经尝试通过 VBA 代码修复它,但它是同样的问题,我真的很感激。 示例代码: Private Sub ProdDateCombobox_DropButtonClick() ProdDateCombobox.ListFillRange = "ProductionList" End Sub ProductionList 是具有日期的单元格范围 D2;D100 回答1 您得到的数字是自 1900 年 1 月 1 日以来的天数 - 这就是 Excel 存储日期的方式。 该问题的一种解决方案是: 您的日期格式为日期,在D2:D100范围内命名为ProductionList 。 当您选择下拉列表时,日期会正确显示在下拉列表中,但所选日期显示为数字 - 2018 年 7 月 4 日,显示数字 43285(自 1900 年 1 月 1 日以来的天数)。 在空白范围内输入公式=TEXT(D2,"dd/mm/yyyy")其中D2是ProductionList命名范围中的第一个日期。 将公式向下拖动到日期的末尾。 复制这个新的公式范围并将特殊值粘贴为仅在原始列表上的值。 您的原始列表现在应该正确显示在组合框中
  • Excel VBA ComboBox DropDown Button Size--改变了自己(Excel VBA ComboBox DropDown Button Size--changed itself)
    问题
  • 带有建议/自动完成功能的 Excel 数据验证(Excel data validation with suggestions/autocomplete)
    问题
  • 如何提高excel VBA中用户表单的保存速度(How to improve the saving speed for userform in excel VBA)
    问题 这是我创建的用户表单。 然后,它被用作输入平台。有一些不同的表格,例如2016 年,2017 年.... 保存按钮的逻辑是搜索用户输入的年份(日期)并定位正确的工作表。 然后,它将找到该工作表的最后一行。 例如,最后一行是第 1000 行。用户表单的第一行将保存在第 1001 行。用户表单的第二行将保存在第 1002 行...... 问题 然而,当我在真正的 excel 文件中测试时,保存速度太慢。由于真正的 excel 文件很大(每个工作表中大约 1XXXX 行)。它使用 8 秒为用户表单保存一行,13 秒保存两行. 显然,节省的速度是不可接受的。 有什么方法可以改善吗? If ComboBox3.Value = "2016" Then Worksheets("2016").Activate j = WorksheetFunction.CountA(Worksheets("2016").Range("A:A")) + 1 End If If ComboBox3.Value = "2017" Then Worksheets("2017").Activate j = WorksheetFunction.CountA(Worksheets("2017").Range("A:A")) + 1 End If '1st If ComboBox4.Value = "" Then Else
  • 无法将项目添加到组合框(Can't add items to a combobox)
    问题 我试过这些网站寻求帮助: excel-easy.com 网站故事.dk ozgrid.com stackoverflow.com 语境网微软网站 将不胜感激的帮助! 这是我的代码: Private Sub FusegearPerformanceUserForm1() With FailureComboBox .AddItem "japp" End With End Sub 回答1 所以,只是为了完成: 这个问题的解决方案是,文件以不能包含 VBA 代码的XLSX格式保存。 以XLSM格式保存文件后,一切都按预期工作。 回答2 Excel 中的控件操作让我困惑了一段时间,直到我意识到它们有两种,这可能是您困惑的一部分。 例如,有: 一个表单控件组合框,以及, 一个ActiveX 控件组合框。 两者的外观、行为和控制类似,但不完全相同。 点击图片放大: 我意识到这不是你的问题,但我想我应该确保你可以确定你正在使用哪个控件,因此确保你使用(和谷歌搜索)正确的信息 - 特别是因为术语“组合框”和“下拉框”经常互换使用。 Google 搜索与 BA Combo Box Control 相关的 Vcode 有 50% 的情况是错误的,因此您需要更具体。 AS为代码差异: 表单控制组合框 'add item ActiveWorkbook.Sheets("Sheet1").Shapes(
  • Excel ActiveX combobox displays selected date as number rather than date
    I have an ActiveX combobox. Its ListFillRange is a range on another sheet. It finds the dates, but when I select them I get this weird value. Anybody know whats up and how to fix it? I have tried fixing it through VBA code but its the same problem, I would really appreciate it. Example code: Private Sub ProdDateCombobox_DropButtonClick() ProdDateCombobox.ListFillRange = "ProductionList" End Sub ProductionList being a range of cells D2;D100 with dates
  • 在 Excel vba 中更新 ActiveX 按钮上的标题(Updating caption on ActiveX button in Excel vba)
    问题
  • Updating caption on ActiveX button in Excel vba
    I'm trying to update the caption of an ActiveX control button on an Excel spreadsheet to note that the code associated with the click event is working. The code pulls data from an azure database so pressing the button triggers anywhere from a 5-10 sec delay. My original code had a single sub that essentially looked like this: Sub GetInfofromDB() btnUpdate.Caption = "Updating...." <<code to get data from azure db>> btnUpdate.Caption = "Update List" 'reverts button to standard text End Sub However the button caption never changes. The combobox update works. I separated the caption update into