Excel中单个单元格中多个值的checkbox

我是C#/ .NET开发人员,但不太熟悉Excel编程或VBA。 对于一个副项目,我有一个电子表格,供非技术用户用来input数据。 稍后,这个电子表格将通过我编写的C#命令行程序导出为不同的格式,以便将数据转储到不同的系统中。

我需要input的数据完全按照命令行程序预期的那样input,所以由于拼写错误或轻微的字眼差异导致的用户错误将会成为问题。 我需要用户从可能的值中进行select,而不是依靠用户input正确的值。

对于在单元格中只能有单个值的列,我可以通过使用用户可以从中select的下拉菜单来完成此操作。 我通过这里的说明做到了这一点:

http://office.microsoft.com/en-us/excel-help/insert-or-delete-a-drop-down-list-HP010072599.aspx

问题是,我有几个列的单元格可以保存多个值,用逗号分隔。 例如,我有一个“颜色”列。 该列中单元格的值可以是单一颜色(例如“红色”)或用逗号分隔的颜色列表(例如“红色,绿色,蓝色”)。 理想情况下,我希望用户能够单击单元格,并查看可从中select颜色的checkbox列表,完成后单元格将用逗号分隔的颜色进行更新。

什么是完成这个最好的方法? 我试过Googlesearch,发现这个方法:

http://www.contextures.com/excel-data-validation-multiple.html

…允许从下拉菜单中select多个项目,但这样做很不方便,因为每次需要添加其他项目时都必须重新打开下拉菜单。 checkbox会更方便。 这是可能的,如果是这样,怎么样?

尝试这个:

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 

在上面的代码中,我使用了MsForm.Listboxtypes的MsForm.Listbox
首先设置你在这里讨论过的Listbox OleObject
在上面的代码中,我将我的Listbox命名为LB_Colors ,可以通过访问其属性来更改它。

假设你设置你的数据如下:

在这里输入图像描述

上面的代码在执行select时执行。
如果select等于B2 ,则会出现创build的ListBox对象。

在这里输入图像说明

我们将ListBox对象的位置(left,top)和width设置为等于B2所以它看起来像一个下拉菜单。
用户可以select值。

在这里输入图像说明

当用户已经对select感到满意时,只需单击ListBox
select将被写入B2 ,并且ListbBox将不可见,如下所示。

在这里输入图像说明

这是你想要的吗?

Excel具有与.NET的WinForms Project Type类似的Userformsfunction,而且它们的工作方式非常相似。 在Excel中的代码编辑器中,右键单击资源pipe理器窗口中的模块文件夹,然后添加一个用户窗体。 一个devise师会performance出与VS2013相似的(虽然不如浮华)。 表单也会从事件types系统中运行。

你可以从formName.Show调用你的用户formName.Show

从那里,实现你的input约束,并将input调整为单元格所需的string。

祝你好运!

补充:您可能需要设置一个工作表事件,以激活特定的单元格以打开表单。 这样,他们只需点击单元格,而不必运行任何东西。