当用户在Excel工作表

时间:2016-03-20 22:13:02

标签: excel vba excel-vba combobox excel-2010

我的公司有一个相当大的导入模板,我已经创建了一个加载项,其中有一些我们经常使用的有用的快捷工具和过程。

我想做什么: 我想添加一个类似Intellisense的功能,只有当用户在工作表(而不是vbe)中工作时选择四个特定列(BF,BG,CS和CT)中的单元格时才能使用。

我想模仿这样的事情:
Intellisense

更具体: 当在四列中的任何一列中选择单元格时,我想根据在其他列中的整个工作表中输入的数据在下拉列表中提供建议。

当用户点击空白单元格时:

  1. 他们会给出一个可供选择的值列表
  2. 一旦他们选择了该值,就会将其添加到单元格中,并在其末尾添加冒号
  3. 仍然在同一个单元格中,我希望下拉列表根据用户首先选择的内容重新填充并显示新值。(列表将小于第一个列表,因为它们的第一个值会缩小选择范围)
  4. 一旦用户选择了第二个值,它将被添加到单元格中值的末尾以及另一个冒号。
  5. 最后,下拉列表会根据用户选择的内容再次重新填充,并使用最后一组值显示它们(列表将小于第一个和第二个列表,因为这些值会缩小选项范围),他们选择这些值然后完成填写单元格
  6. 示例: 在列V,W和X中是值
    印记选项|单一选项1 |高级自定义颜色可以额外的成本获得。要求报价。 分别。

    1. 当用户点击BF列中的单元格时,他们首先会显示一个下拉列表,其中包含" Imprint Option"以及第V列中的其他选择。
    2. 如果他们选择" Imprint Option"然后"印记选项:"进入当前单元格,列表重新填充在" Imprint Option"右侧的W列中找到的值。 (仅在这种情况下意为"单一选项1和#34;将被列出)
    3. 当用户选择"单选项1"单元格值现在是"印记选项:单选项1:"此列表现在仅显示值"高级自定义颜色可用于额外成本。要求报价。"
    4. 当用户选择此值时,单元格值已完成,显示"印记选项:单个选项1:高级自定义颜色可用于额外成本。要求报价。",并且没有显示列表
    5. 这只是一个非常简单的例子,因为在两次重新填充之后,列表中显然会有多个值。

      我的想法/想法:
      我的想法也许这可以通过使用一个没有下拉箭头显示的组合框来重新创建下拉列表,但是我不确定这个方法是如何或者是否可以用于此,因为值需要重新填充并且将会有在第一轮值之后的单元格中的值,我认为这将被覆盖。我唯一的限制是我必须即时创建。我不能事先将控件拖到工作表上,以避免任何进一步的性能阻碍我只想在他们被选中的情况下一次一个单元格。

      所以,最后我的问题是:

      1. 这可以重新创建吗?
        • 如果是这样,我应该怎么做呢? (即使这种方法很复杂,我也可以听到)
      2. 如果这不可能,你能否建议一种类似的方法?

3 个答案:

答案 0 :(得分:1)

Excel具有一些您可以适应的内置功能:

  1. 插入Comment - 只需鼠标悬停
  2. 即可
  3. 插入Data Validation消息 - 通过单击单元格
  4. 触发
  5. 插入Data Validation下拉菜单 - 指示已知列表中的选项
  6. 使用工作表事件宏来显示UserForm
  7. 根据您的详细要求说明,我会选择 4

    选项

答案 1 :(得分:1)

实际上有很多方法可以实现这一点,并且可能还有一些与您想要的接近的自动化。如果您想要自己创建自己的道路,那么我将使用仅包含UserForm的{​​{1}}。

有些API可以显示您选择的单元格旁边的ListBox,并从UserForm中移除边框,使其看起来更像智能感知。您可能还想处理UserForm的某些自动调整大小。我会把所有这些留给你,但一个基本版本看起来像这样:

enter image description here

基本思想是您在适当级别创建项目数据库,然后在级别索引发生更改时使用适当的数组重新填充ListBox。我用XML做我的数据库,但你可以按照自己的意愿去做。

以下代码可以帮助您入门,但您希望扩展它以处理所有可能的用户活动,例如想要退出,改变主意,删除等等。

第1步:创建一个ListBox,其上只有一个UserForm,并确保ListBox属性设置为单一。在下面的示例中,我调用了MultiSelect IntelliSense UserForm lboxOptions

第2步:这是userform

背后的框架代码
ListBox

第3步:在Option Explicit Private mItems() As String Private mSubItems1() As String Private mSubItems2() As String Private mSubItems3() As String Private mSubItems4() As String Private mIndex As Integer Private mCell As Range Private Property Let Index(val As Integer) mIndex = val Select Case val Case 0: lboxOptions.List = mItems Case 1: lboxOptions.List = mSubItems1 Case 2: lboxOptions.List = mSubItems2 Case 3: lboxOptions.List = mSubItems3 Case 4: lboxOptions.List = mSubItems4 End Select End Property Private Sub HandleItemSelected() Dim i As Integer 'Identify the selected item For i = 0 To lboxOptions.ListCount - 1 If lboxOptions.Selected(i) Then If mIndex = 0 Then 'Write to the cell and add a full stop mCell.Value = lboxOptions.List(i) & "." 'Trigger the next level of dropdown Index = i + 1 Else 'Write to the cell and close the window mCell.Value = mCell.Value & lboxOptions.List(i) Me.Hide End If End If Next End Sub Private Sub lboxOptions_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'Trap the return key event as if 'selected' If KeyAscii = vbKeyReturn Then HandleItemSelected End If End Sub Private Sub lboxOptions_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 'Trap the click event as if 'selected' HandleItemSelected End Sub Private Sub UserForm_Activate() 'Reset the list and store the target cell Set mCell = Selection Index = 0 End Sub Private Sub UserForm_Initialize() 'Define the arrays of selections. 'I'd probably create an XML for this and read it into some arrays here. Const items As String = "Cake|IceCream|Pasta|Chips" Const subs1 As String = "Eggs|Flour|Butter|Sugar|Bake" Const subs2 As String = "Milk|Eggs|Sugar|Freeze" Const subs3 As String = "Eggs|Flour|Boil" Const subs4 As String = "Potatoes|Oil|Fry" mItems = Split(items, "|") mSubItems1 = Split(subs1, "|") mSubItems2 = Split(subs2, "|") mSubItems3 = Split(subs3, "|") mSubItems4 = Split(subs4, "|") End Sub 事件

中输入此代码
Worksheet_SelectionChange

答案 2 :(得分:0)

使用数据验证可以完成您的描述。这篇文章概述了这个过程:https://support.microsoft.com/en-us/kb/211485。这可能不是您正在寻找的,因为您最终会得到具有用户选择的不同可用选项的多个单元格。然后,您可以使用连接公式将所有选择组合到一个单元格中。其他人可能有更好的方法在VBA中这样做,但这是我在阅读你的帖子时的第一个想法。我希望这是一些帮助。