我正在尝试在Excel 2007 VBA中开发用户表单,并希望为用户提供范围选择图标,如下所示:
但是,我还没有找到任何内置的表单设计工具或任何提供此功能的在线工具,或者至少给了我一个想法。如果有人对此有任何想法,我将非常感谢他们的帮助。
答案 0 :(得分:12)
此控件称为 RefEdit 控件。
要使用它,您必须首先将其添加到工具箱窗口,方法是右键单击工具箱窗口并选择其他控件... 。然后选择 RefEdit.Ctrl 并关闭对话框。
现在您可以在工具箱中选择它并将其放在表单上。
答案 1 :(得分:1)
使用 RefEdit.Ctrl 的另一种方法是挂钩 TextBox 控件的一些未记录的功能并使用 Application.InputBox 函数。
TextBox控件的两个属性未显示在“属性”对话框中,允许您在右侧添加按钮。它们是 DropButtonStyle 和 ShowDropButtonWhen 。单击该按钮时,它将触发控件的 DropButtonClick 事件,您可以在其中显示输入框。
首先在表单上放置 TextBox 控件。然后将以下内容添加到 UserForm_Initialize 过程:
Private Sub UserForm_Initialize()
txtRefersTo.DropButtonStyle = frmDropButtonStyleReduce
txtRefersTo.ShowDropButtonWhen = frmShowDropButtonWhenAlways
End Sub
然后按如下方式向 DropButtonClick 事件添加事件处理程序,以使用 Application.InputBox 对话框捕获范围:
Private Sub txtRefersTo_DropButtonClick()
Me.Hide
txtRefersTo.Text = Application.InputBox("Select the range", "Range Picker", txtRefersTo.Text, Type:=8)
Me.Show vbModal
End Sub
此方法的主要优点是,它允许您将控件放在框架内或单独的选项卡上,而不会遇到与 RefEdit.Ctrl 相关的问题。缺点是它需要一个单独的对话框来与Excel交互。
答案 2 :(得分:0)
尽管这个问题已经存在了将近十年,但它仍然是我的第一个Google搜索结果,因此我将发布答案作为另一种考虑的方法。类型设置为单元格引用的输入框 可能足以满足许多人的需求。 InputBox类型完成了验证用户响应的工作。有关如何使用InputBox类型的信息,请参阅本文:https://www.thespreadsheetguru.com/blog/vba-to-select-range-with-inputbox
答案 3 :(得分:0)
I liked @krey answer 基本上是@stifin 答案中共享的链接的非常简化的版本 --> https://www.thespreadsheetguru.com/blog/vba-to-select-range-with-inputbox
但是两个按钮都使用了“奇数”名称,我认为指南应该使用默认名称/值,以便最终用户易于理解和操作。此外,我添加了一个 CommandButton
来“运行”用户表单和一个用于初始测试的“选择”语句。我还想在尝试预填充我的用户表单时提供一个初始值,但允许最终用户在需要时进行覆盖。
这是使用用户窗体的最终代码片段,其中一个 TextBox
名为 TextBox1
(默认)和一个 CommandButton
名为 CommandButton1
(也是默认)。
Option Explicit
Public rng As Range
Public Sub UserForm_Initialize()
Me.TextBox1.DropButtonStyle = fmDropButtonStyleReduce
Me.TextBox1.ShowDropButtonWhen = fmShowDropButtonWhenAlways
Set rng = Range("A1:B4")
TextBox1.Value = rng.Address(False, False)
End Sub
Public Sub CommandButton1_Click()
rng.Select
Unload Me
End Sub
Public Sub TextBox1_DropButtonClick()
Me.Hide
Set rng = Application.InputBox("Select the range", "Range Picker", TextBox1.Text, Type:=8)
TextBox1.Value = rng.Address(False, False)
Me.Show
End Sub