EXCEL中实现多选列表

一人在外 2014-02-11 04:45:28
如题想在EXCEL中用VBA添加多选列表,自己想了几个方式:请大家指正
1.遍历多选框的方式,优点:实现简单,缺点:更新内容不便,界面挫
2.利用UserFormer,在其上添加combobox或者多选框,优点:实现相对简单,缺点:界面依然很挫,且更新内容不便
3.直接用combobox控件的方式,每单击目标列单元格就弹出一次,添加内容直接补充在上次添加内容后,优点:实现简单相对简洁,缺点:误触,逻辑判断上比较麻烦,否则用起来很麻烦。界面嘛。。。硬伤
4.使用一个下拉多选框,这个未实现,估计只能用其他控件模拟下,不知有没有谁实现了,谁如果给出个分数加倍。
...全文
1861 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
一人在外 2014-02-14
  • 打赏
  • 举报
回复
引用 3 楼 Topc008 的回复:
[quote=引用 2 楼 fengzhileiyi 的回复:] [quote=引用 1 楼 Topc008 的回复:] 用数据有效性----序列即可
我可能没说明白,不是单选,是多选,即下拉表中选择多个。这个有解么?[/quote] 这个估计得自己写个东东了......... 不过,要是多弄几个单选能不能满足要求?.......[/quote] 用UserForm实现了,效果差了点不过。。。就那么回事吧。以下是我找到的代码,给大家分享下:
新建一个模块,建立一个公共变量
Public rangeAddr As String

sheet1 添加代码
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Column = 11 Then
        rangeAddr = Target.Address'将单元格地址保存到公共变量中
        UserForm1.Show
    End If
End Sub


新建一个窗体,添加代码如下:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
   On Error Resume Next
     For I = 0 To UserForm1.Controls.Count - 1
        If UserForm1.Controls(I) = True Then
            Tval = Tval & "+" & UserForm1.Controls(I).Caption
        End If
    Next
    Sheet1.Activate
    'MsgBox rangeAddr
    Sheet1.Range(rangeAddr).Value = Right(Tval, Len(Tval) - 1)'将结果关联到选中的单元格
End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub UserForm_Initialize()
'先计算有多少个控件,每10个换列
If Sheet3.Range("A2").End(xlDown).Row / 10 > Round(Sheet3.Range("A2").End(xlDown).Row / 10, 0) Then
    counts = Round(Sheet3.Range("A2").End(xlDown).Row / 10, 0) + 1
Else
     counts = Sheet3.Range("A2").End(xlDown).Row / 10
End If
'设置窗体高度和宽度
UserForm1.Width = 150 * counts'每增加1列宽度加150。(这里并没有判断是否会超过屏幕的宽度,如果数据量太多可以调整每列显示的个数
UserForm1.Height = 250

For X = 1 To counts

    Y = 10 * X '每列显示10个控件

    If X = 1 Then '开始第1列显示
        Start = 2
        Ends = 11
    Else '换列显示
        Start = Ends + 1
        Ends = Y + 1
    End If

    If Ends > Sheet3.Range("A2").End(xlDown).Row Then '防止溢出
        Ends = Sheet3.Range("A2").End(xlDown).Row
    End If

   'Debug.Print "STRAT:" & Start & "  Ends : " & Ends
    For I = Start To Ends '循环生成控件
       Set ChkBox = UserForm1.Controls.Add("Forms.CheckBox.1", "Chk" & Str(I))
       If I > 11 Then
           tops = 2 + 20 * (I - Y + 8) '换列后的控件高度坐标
       Else
          tops = 2 + 20 * (I - 2)
       End If
       ChkBox.Top = tops
       ChkBox.Height = 25'控件的高度
       ChkBox.Width = 200'控件的宽度
       ChkBox.Left = 20 + 150 * (X - 1) '220 换列后的横坐标
      ' Debug.Print "TOP:" & tops & "  LEFT: " & 20 + 150 * (X - 1) '220
       ChkBox.Caption = Sheet3.Cells(I, 1)'控件显示的标题
       Set ChkBox = Nothing
    Next
      'Debug.Print "X:" & X
Next

End Sub
一人在外 2014-02-12
  • 打赏
  • 举报
回复
引用 1 楼 Topc008 的回复:
用数据有效性----序列即可
我可能没说明白,不是单选,是多选,即下拉表中选择多个。这个有解么?
一如既往哈 2014-02-12
  • 打赏
  • 举报
回复
引用 2 楼 fengzhileiyi 的回复:
[quote=引用 1 楼 Topc008 的回复:] 用数据有效性----序列即可
我可能没说明白,不是单选,是多选,即下拉表中选择多个。这个有解么?[/quote] 这个估计得自己写个东东了......... 不过,要是多弄几个单选能不能满足要求?.......
一如既往哈 2014-02-11
  • 打赏
  • 举报
回复
用数据有效性----序列即可

2,463

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧