我是C#/ .NET开发人员,但对Excel编程或VBA不太熟悉。对于辅助项目,我有一个电子表格,非技术用户将使用该电子表格进行数据输入。稍后,这个电子表格将通过我编写的C#命令行程序导出为不同的格式,以便将数据转储到不同的系统中。
我需要输入与命令行程序预期完全相同的数据值,因此由于拼写错误或轻微的措辞差异而导致的用户错误会出现问题。我需要用户从可能的值中进行选择,而不是依赖于用户输入正确的值。
对于单元格中只能包含单个值的列,我可以通过使用用户可以选择的下拉菜单来完成此操作。我是通过这里的说明做到的:
http://office.microsoft.com/en-us/excel-help/insert-or-delete-a-drop-down-list-HP010072599.aspx
问题是,我有几个列,其单元格可以包含多个值,以逗号分隔。例如,我有一个“颜色”列。该列中的单元格的值可以是单色(例如“红色”)或由逗号分隔的颜色列表(例如“红色,绿色,蓝色”)。理想情况下,我希望用户能够单击单元格并查看可以从中选择颜色的复选框列表,完成后,单元格将使用逗号分隔的颜色进行更新。
实现这一目标的最佳方法是什么?我试过谷歌搜索并找到了这个方法:
http://www.contextures.com/excel-data-validation-multiple.html
...允许从下拉菜单中选择多个项目,但这很不方便,因为每次需要添加其他项目时都必须重新打开下拉列表。复选框会更方便。这是可能的,如果是的话,怎么样?
答案 0 :(得分:7)
试试这个:
Option Explicit
Dim fillRng As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim LBColors As MSForms.ListBox
Dim LBobj As OLEObject
Dim i As Long
Set LBobj = Me.OLEObjects("LB_Colors")
Set LBColors = LBobj.Object
If Not Intersect(Target, [B2]) Is Nothing Then
Set fillRng = Target
With LBobj
.Left = fillRng.Left
.Top = fillRng.Top
.Width = fillRng.Width
.Visible = True
End With
Else
LBobj.Visible = False
If Not fillRng Is Nothing Then
fillRng.ClearContents
With LBColors
If .ListCount <> 0 Then
For i = 0 To .ListCount - 1
If fillRng.Value = "" Then
If .Selected(i) Then fillRng.Value = .List(i)
Else
If .Selected(i) Then fillRng.Value = _
fillRng.Value & "," & .List(i)
End If
Next
End If
For i = 0 To .ListCount - 1
.Selected(i) = False
Next
End With
Set fillRng = Nothing
End If
End If
End Sub
在上面的代码中,我使用了OleObject
类型的MsForm.Listbox
首先设置已经讨论HERE的Listbox OleObject
在上面的代码中,我将Listbox
命名为LB_Colors
,可以通过访问其属性进行更改。
假设您设置了如下数据:
上面的代码在进行选择时执行
如果选择等于B2
,则会显示创建的ListBox
对象。
我们将ListBox
对象位置(左,上)和宽度设置为B2
,因此它看起来像下拉。
然后,用户可以选择值。
当用户对选择感到满意时,只需点击ListBox
即可
选择将写在B2
中,ListbBox
将再次隐身。如下所示。
这是你正在尝试的吗?
答案 1 :(得分:1)
Excel具有Userforms的功能,类似于.NET的WinForms项目类型,它们的工作方式非常相似。从excel中的代码编辑器中,右键单击资源管理器窗口中的模块文件夹并添加Userform。设计师将表明它与VS2013中的相似(尽管不像华而不实)。表单也会在事件类型系统中运行。
您可以使用formName.Show
来调用您的用户表单。
从那里,实现输入限制,并将输入编制到单元格所需的字符串中。
祝你好运!添加了: 您可能希望设置工作表事件,以便在激活特定单元格以打开表单时。这样,他们只需点击单元格而不必运行任何东西。