在Excel VBA中为用户提供一个范围选择工具/实用程序

13

我正在尝试在Excel 2007 VBA中开发一个用户表单,并想要提供一个范围选择图标给用户,类似于这样:Range Selection Icon

然而,我没有找到任何内置的表单设计工具或任何在线工具可以提供这个功能,或者至少给我一个想法。如果有人有任何想法,请帮助我,非常感谢。

4个回答

14

这个控件被称为RefEdit控件。

要使用它,您必须首先通过右键单击工具箱窗口并选择附加控件...将其添加到工具箱窗口。然后选择RefEdit.Ctrl并关闭对话框。

现在您可以在工具箱中选择它并将其放置在您的表单上。


不要将其放在框架控件中,否则会导致一些崩溃。这是一个相当不稳定的控件。我一直在尝试Peltier的替代方案——更多的工作,更少的崩溃。http://peltiertech.com/WordPress/refedit-control-alternative/ - Dick Kusleika
我在想如何使用Excel使用的相同控件(如babbupandey所示),而不是有缺陷的RefEdit :/ - Daniel Bonetti
RefEdit是最接近内置控件的东西。我希望他们能修复RefEdit,因为它比我用来避免RefEdit的漏洞的InputBox更好的用户体验。 - Jon Peltier

2

除了使用RefEdit.Ctrl之外,另一种选择是利用TextBox控件的一些未公开功能并使用Application.InputBox函数。

有两个TextBox控件的属性不会出现在属性对话框中,它们允许您在右侧添加一个按钮。它们是DropButtonStyleShowDropButtonWhen。当单击该按钮时,它将为控件触发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进行交互。

1
尽管这个问题已经快有十年的历史了,但它仍然是我通过谷歌搜索的第一个结果,所以我要发表一个答案,作为另一种需要考虑的方法。对于许多人的需求,类型设置为单元格引用的InputBox可能已经足够了。InputBox类型会完成验证用户响应的繁琐工作。有关如何使用InputBox类型,请参见此文章:https://www.thespreadsheetguru.com/blog/vba-to-select-range-with-inputbox

0

我喜欢@krey的回答,它基本上是@stifin回答中分享链接的一个非常简化版本--> https://www.thespreadsheetguru.com/blog/vba-to-select-range-with-inputbox

但两者都使用了“奇怪”的按钮名称,我认为指南应该使用默认名称/值,以便最终用户易于理解和操作。此外,我添加了一个CommandButton来“运行”用户窗体和一个“选择”语句进行初始测试。我还想提供一个初始值,因为我尝试预填充我的用户窗体,但允许最终用户在需要时覆盖。

这里是最终代码片段,利用一个名为TextBox1(默认)和一个名为CommandButton1(也是默认)的TextBox的用户窗体。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接