Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 6815|回复: 20

[已解决]B列可多选下拉菜单,C列选项值相加

[复制链接]
发表于 2016-12-6 19:43 | 显示全部楼层 |阅读模式
如题,想实现:
1、sheet1工作表B列制作可多选的下拉菜单(不用复选框),在B列单元格中的下拉菜单中点选某项则在单元格中同时输入选项内容,与之同行的C列单元格值为B列单元格中多个选项对应值的和,如果不点选则单元格保留原有内容或清空(清空B列单元格内容时,同行C列单元格内容同步清空)
2、下拉菜单中的内容是动态的,即随sheet2表中的内容变化而变化
求助,谢谢!
最佳答案
2016-12-7 11:18
本帖最后由 苏子龙 于 2016-12-7 11:44 编辑
cunfu2010 发表于 2016-12-7 10:39
谢谢,如果不用复选框,如何实现鼠标点击即输入
  1. Private Sub ListBox1_Change()
  2. If ListBox1.ListIndex = -1 Then Exit Sub
  3.     Dim i&, s$, he
  4.     With ListBox1
  5.         For i = 0 To .ListCount - 1
  6.             If .Selected(i) Then
  7.                 s = s & "、" & .List(i)
  8.                 he = he + arr(i + 1, 2)
  9.             End If
  10.         Next
  11.        ActiveCell.Value = Mid(s, 2)
  12.        ActiveCell.Offset(0, 1).Value = he
  13.        .Visible = False   '加上这句就好了
  14.     End With
  15. End Sub
复制代码

Book1.rar

3.4 KB, 下载次数: 22

发表于 2016-12-7 08:16 | 显示全部楼层
  1. Dim arr


  2. Private Sub ListBox1_Change()
  3. If ListBox1.ListIndex = -1 Then Exit Sub
  4.     Dim i&, s$, he
  5.     With ListBox1
  6.         For i = 0 To .ListCount - 1
  7.             If .Selected(i) Then
  8.                 s = s & "、" & .List(i)
  9.                 he = he + arr(i + 1, 2)
  10.             End If
  11.         Next
  12.        ActiveCell.Value = Mid(s, 2)
  13.        ActiveCell.Offset(0, 1).Value = he
  14.     End With
  15. End Sub


  16. Private Sub Worksheet_SelectionChange(ByVal T As Range)
  17.     If T.Count > 1 Or T.Row < 2 Or T.Column <> 2 Then
  18.         ListBox1.Visible = False
  19.         Range("b:b").Interior.ColorIndex = 0
  20.         Exit Sub
  21.     End If
  22.    
  23.     arr = Sheet2.Range("a2:b" & Sheet2.[a65536].End(3).Row)
  24.     Range("b:b").Interior.ColorIndex = 0
  25.     T.Interior.ColorIndex = 6
  26.     With ListBox1
  27.         .Clear
  28.         .MultiSelect = 1
  29.         .ListStyle = 1
  30.         .List = Application.Index(arr, , 1)
  31.         .Top = T.Top
  32.         .Left = T.Offset(, 1).Left
  33.         .Height = T.Height * 6
  34.         .Width = T.Width + 20
  35.         .Visible = True
  36.     End With
  37. End Sub
复制代码

listbox多选项.zip

10.05 KB, 下载次数: 62

回复

使用道具 举报

 楼主| 发表于 2016-12-7 10:39 | 显示全部楼层

谢谢,如果不用复选框,如何实现鼠标点击即输入
回复

使用道具 举报

发表于 2016-12-7 11:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 苏子龙 于 2016-12-7 11:44 编辑
cunfu2010 发表于 2016-12-7 10:39
谢谢,如果不用复选框,如何实现鼠标点击即输入
  1. Private Sub ListBox1_Change()
  2. If ListBox1.ListIndex = -1 Then Exit Sub
  3.     Dim i&, s$, he
  4.     With ListBox1
  5.         For i = 0 To .ListCount - 1
  6.             If .Selected(i) Then
  7.                 s = s & "、" & .List(i)
  8.                 he = he + arr(i + 1, 2)
  9.             End If
  10.         Next
  11.        ActiveCell.Value = Mid(s, 2)
  12.        ActiveCell.Offset(0, 1).Value = he
  13.        .Visible = False   '加上这句就好了
  14.     End With
  15. End Sub
复制代码

listbox多选项改.zip

14.13 KB, 下载次数: 63

评分

参与人数 1 +3 收起 理由
cunfu2010 + 3 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-12-7 11:59 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2016-12-8 15:29 | 显示全部楼层

你好,这个附件中单元格最后都有一个空白行(因 vbCrLf造成的),如何把最后的空白行删掉,即只保留内容不要空白行

下拉框多选.rar

14.33 KB, 下载次数: 22

回复

使用道具 举报

发表于 2016-12-8 15:46 | 显示全部楼层
cunfu2010 发表于 2016-12-8 15:29
你好,这个附件中单元格最后都有一个空白行(因 vbCrLf造成的),如何把最后的空白行删掉,即只保留内容 ...

Private Sub ListBox1_Change()
If ListBox1.ListIndex = -1 Then Exit Sub
Dim i&, aa$, bb$
With ListBox1
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) Then
            aa = aa & ListBox1.List(i) & vbCrLf
            If col = 2 Then
                bb = bb & d(ListBox1.List(i)) & vbCrLf
            Else
                bb = bb & d1(ListBox1.List(i)) & vbCrLf
            End If
        End If
    Next
    ActiveCell.Value = Mid(aa, 1, InStrRev(aa, vbCrLf) - 1)
    ActiveCell.Offset(0, 1) = Mid(bb, 1, InStrRev(bb, vbCrLf) - 1)
    Me.ListBox1.Visible = True
End With
End Sub

评分

参与人数 1 +3 收起 理由
cunfu2010 + 3 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-12-8 16:13 | 显示全部楼层
苏子龙 发表于 2016-12-8 15:46
Private Sub ListBox1_Change()
If ListBox1.ListIndex = -1 Then Exit Sub
Dim i&, aa$, bb$

谢谢!!!!
回复

使用道具 举报

 楼主| 发表于 2016-12-8 20:11 | 显示全部楼层
苏子龙 发表于 2016-12-8 15:46
Private Sub ListBox1_Change()
If ListBox1.ListIndex = -1 Then Exit Sub
Dim i&, aa$, bb$

你好,这是我学做了另外一种下拉菜单多选,问题:1、如果单元格中有奇数个选项,其中有一个是“北京”,单击单元格时会先自动删除“北京”,而有偶数个选项时则没有这个问题;

2、如果单元格中的选项内容为奇数个时,单击单元格时会先自动添加“北京”,内容为为偶数个时则没有这个问题。
我想应该用w MOD 2进行判断,但我写不出来了,麻烦指点一下,谢谢!

下拉框多选3.rar

13.49 KB, 下载次数: 28

回复

使用道具 举报

发表于 2016-12-9 07:45 | 显示全部楼层
cunfu2010 发表于 2016-12-8 20:11
你好,这是我学做了另外一种下拉菜单多选,问题:1、如果单元格中有奇数个选项,其中有一个是“北京”, ...

不知道你说的是什么意思,如果判断输入要奇偶,那么在change加个判断,个人水平有限可能帮不了你,希望楼主另开帖说明要求,说清要做的具体内容,我想其他大神一定会回答的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 02:15 , Processed in 0.695797 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表