我的公司有一个相当大的导入模板,我已经创建了一个加载项,其中有一些我们经常使用的有用的快捷工具和过程。
我想做什么: 我想添加一个类似Intellisense的功能,只有当用户在工作表(而不是vbe)中工作时选择四个特定列(BF,BG,CS和CT)中的单元格时才能使用。
我想模仿这样的事情:
更具体: 当在四列中的任何一列中选择单元格时,我想根据在其他列中的整个工作表中输入的数据在下拉列表中提供建议。
当用户点击空白单元格时:
示例:
在列V,W和X中是值
印记选项|单一选项1 |高级自定义颜色可以额外的成本获得。要求报价。
分别。
这只是一个非常简单的例子,因为在两次重新填充之后,列表中显然会有多个值。
我的想法/想法:
我的想法也许这可以通过使用一个没有下拉箭头显示的组合框来重新创建下拉列表,但是我不确定这个方法是如何或者是否可以用于此,因为值需要重新填充并且将会有在第一轮值之后的单元格中的值,我认为这将被覆盖。我唯一的限制是我必须即时创建。我不能事先将控件拖到工作表上,以避免任何进一步的性能阻碍我只想在他们被选中的情况下一次一个单元格。
所以,最后我的问题是:
答案 0 :(得分:1)
Excel具有一些您可以适应的内置功能:
Comment
- 只需鼠标悬停Data Validation
消息 - 通过单击单元格Data Validation
下拉菜单 - 指示已知列表中的选项根据您的详细要求说明,我会选择 4
选项答案 1 :(得分:1)
实际上有很多方法可以实现这一点,并且可能还有一些与您想要的接近的自动化。如果您想要自己创建自己的道路,那么我将使用仅包含UserForm
的{{1}}。
有些API可以显示您选择的单元格旁边的ListBox
,并从UserForm
中移除边框,使其看起来更像智能感知。您可能还想处理UserForm
的某些自动调整大小。我会把所有这些留给你,但一个基本版本看起来像这样:
基本思想是您在适当级别创建项目数据库,然后在级别索引发生更改时使用适当的数组重新填充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中这样做,但这是我在阅读你的帖子时的第一个想法。我希望这是一些帮助。