【问题标题】:Checkboxes for multiple values in a single cell in ExcelExcel中单个单元格中多个值的复选框
【发布时间】:2014-06-12 16:23:31
【问题描述】:

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

我需要完全按照命令行程序所期望的那样输入数据值,因此由于拼写错误或细微的措辞差异导致的用户错误将是有问题的。我需要用户从可能的值中进行选择,而不是依赖用户输入正确的值。

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

https://support.office.com/en-ie/article/add-or-remove-items-from-a-drop-down-list-0b26d3d1-3c4d-41f5-adb4-0addb82e8d2c

问题是,我有几列,其单元格可以包含多个值,用逗号分隔。例如,我有一个“颜色”列。此列中单元格的值可以是单一颜色(例如“红色”)或以逗号分隔的颜色列表(例如“红色、绿色、蓝色”)。理想情况下,我希望用户能够单击单元格并查看可以从中选择颜色的复选框列表,完成后,单元格将更新为用逗号分隔的颜色。

实现这一目标的最佳方法是什么?我试过谷歌搜索,发现这个方法:

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

... 允许从下拉菜单中选择多个项目,但不方便,因为每次需要添加另一个项目时都必须重新打开下拉菜单。复选框会更方便。这可能吗?如果可以,怎么做?

【问题讨论】:

    标签: excel excel-2007 vba


    【解决方案1】:

    试试这个:

    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.Listbox 类型的OleObject
    首先设置您的Listbox OleObject,这是在HERE 中讨论的。
    在上面的代码中,我将Listbox 命名为LB_Colors,可以通过访问其属性来更改它。

    假设您将数据设置如下:

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

    我们将ListBox 对象的位置(左、上)和宽度设置为等于B2,所以它看起来像一个下拉菜单。
    然后用户可以选择值。

    当用户已经对选择感到满意时,只需点击退出ListBox
    选择将写入B2ListbBox 将再次不可见,如下所示。

    这是你正在尝试的吗?

    【讨论】:

    • 哇,这真是很好的指导。我跟着它,它似乎工作得很好。虽然我想知道一件尴尬的事情。每当我选择单元格时,原始项目都会被清除(即使我没有做任何事情)。是否有一个快速简便的解决方案,至少不会通过移动我的光标来清除它?
    • @ThomasCheng 尝试删除第二个For Loop
    【解决方案2】:

    Excel 具有类似于 .NET 的 WinForms 项目类型的用户窗体功能,并且它们的工作方式非常相似。在 excel 的代码编辑器中,右键单击资源管理器窗口中的模块文件夹并添加一个用户窗体。设计师将展示它与 VS2013 中的相似(尽管没有那么华丽)。表单也使用事件类型系统。

    您可以使用formName.Show 从任何子系统调用您的用户表单。

    从那里,实施您的输入约束并将输入编造为单元格所需的字符串。

    祝你好运!

    添加: 您可能希望为激活特定单元格以打开表单时设置工作表事件。这样,他们只需单击单元格,而不必运行任何东西。

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 2013-02-26
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多