EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

时间:2022-01-05 08:22:36
用了VB 实现下拉多选,目前只能在A2及以下的单元格里出现选项栏,如何改成别的单元格比如:J5到J20
vb代码如下:
Private Sub ListBox1_Change()
If Reload Then Exit Sub '见下方说明
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)
Next
ActiveCell = Mid(t, 2)
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With ListBox1
If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then
t = ActiveCell.Value
Reload = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。
For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容
If InStr(t, .List(i)) Then
.Selected(i) = True
Else
.Selected(i) = False
End If
Next
Reload = False
.Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框
.Left = ActiveCell.Left
.Width = ActiveCell.Width
.Visible = True
Else
.Visible = False
End If
End With
End Sub

15 个解决方案

#1


If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then 你给限制了啊

#2


我一点代码都不懂,代码从网上找的,如何修改啊? 

#3


你的代码中:
If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then
........
这个就表示: 如果活动单元格的列号=1( A列)并且行号>1,就执行 …………

同理,如果你想改成“J5到J20”,那么,条件就得改成:
If ActiveCell.Column = 10 And ActiveCell.Row >=5 And  ActiveCell.Row <=20 Then
..........

引用 2 楼 hotxuxing 的回复:
我一点代码都不懂,代码从网上找的,如何修改啊? 

如果你真是“一点儿代码也不懂”,建议你远离编程…………
EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

#4


多谢大神,完全是工作需要啊  EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

#5


引用 3 楼 Chen8013 的回复:
你的代码中:
If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then
........
这个就表示: 如果活动单元格的列号=1( A列)并且行号>1,就执行 …………

同理,如果你想改成“J5到J20”,那么,条件就得改成:
If ActiveCell.Column = 10 And ActiveCell.Row >=5 And  ActiveCell.Row <=20 Then
..........

Quote: 引用 2 楼 hotxuxing 的回复:

我一点代码都不懂,代码从网上找的,如何修改啊? 

如果你真是“一点儿代码也不懂”,建议你远离编程…………
EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

大神,按照你的指点,我改了行和列,新问题又来了:下拉菜单我点第一个选项,结果跳到下面的别的选项了,是不是还得相应修改其它的值?

#6


这个当然跟“值”有关的啊!
没具体的代码,怎么说得清楚问题出在哪?
EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格
你“取值”的代码是怎么写的?

#7


引用 6 楼 Chen8013 的回复:
这个当然跟“值”有关的啊!
没具体的代码,怎么说得清楚问题出在哪?
EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格
你“取值”的代码是怎么写的?
顶楼的代码里就是,具体我也不清楚 从网上复制的

http://wenku.baidu.com/link?url=-J4qV5rgjZDfW7IoZXUDcA20YOu__fDNXS_glOuNoyiOgudlPic_YVArnCP1RILBqQMmBOpmpBlteNadYRLYZn_u0zBQOAoUFFhUHVo6Tqm

#8


把“问题”说清楚点……
从你贴出来的代码,看不出有什么不对的。 EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

#9


引用 8 楼 Chen8013 的回复:
把“问题”说清楚点……
从你贴出来的代码,看不出有什么不对的。 EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

嗯,我改成了“J5到J20”,做的下拉菜单有“选项一”到“选项二十”,共计二十个选项,
当我在
J5单元格里选中“选项一"时,结果显示选中“选项七”了,
J6单元格里选中“选项一"时,结果显示选中“选项八”了,
往下依此类推
这个论坛能传附件吗?

#10


引用 8 楼 Chen8013 的回复:
把“问题”说清楚点……
从你贴出来的代码,看不出有什么不对的。 EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格


我放百度云盘里了文件,还请大神多多帮忙
http://yun.baidu.com/share/link?shareid=2531268533&uk=471032393

#11


我把代码简单的修改了一下,试了运行效果,没什么问题。
你的那个选择列表,只有20个选项,把它的高度拉那么高干吗!!! EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

Option Explicit

Private Reload As Boolean
Private t As String
Private i As Long

Private Sub ListBox1_Change()
   If Reload Then Exit Sub
   t = ""
   For i = 0 To ListBox1.ListCount - 1
      If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)
   Next
   ActiveCell = Mid$(t, 2)
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   With ListBox1
      If ActiveCell.Column = 10 And ActiveCell.Row >= 5 And ActiveCell.Row <= 20 Then
         t = ActiveCell.Value
         Reload = True
         For i = 0 To .ListCount - 1
            If InStr(t, .List(i)) Then
               .Selected(i) = True
            Else
               .Selected(i) = False
            End If
         Next
         Reload = False
         .Top = ActiveCell.Top + ActiveCell.Height
         .Left = ActiveCell.Left
         .Width = ActiveCell.Width
         .Visible = True
      Else
         .Visible = False
      End If
   End With
End Sub

#12


引用 11 楼 Chen8013 的回复:
我把代码简单的修改了一下,试了运行效果,没什么问题。
你的那个选择列表,只有20个选项,把它的高度拉那么高干吗!!! EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

Option Explicit

Private Reload As Boolean
Private t As String
Private i As Long

Private Sub ListBox1_Change()
   If Reload Then Exit Sub
   t = ""
   For i = 0 To ListBox1.ListCount - 1
      If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)
   Next
   ActiveCell = Mid$(t, 2)
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   With ListBox1
      If ActiveCell.Column = 10 And ActiveCell.Row >= 5 And ActiveCell.Row <= 20 Then
         t = ActiveCell.Value
         Reload = True
         For i = 0 To .ListCount - 1
            If InStr(t, .List(i)) Then
               .Selected(i) = True
            Else
               .Selected(i) = False
            End If
         Next
         Reload = False
         .Top = ActiveCell.Top + ActiveCell.Height
         .Left = ActiveCell.Left
         .Width = ActiveCell.Width
         .Visible = True
      Else
         .Visible = False
      End If
   End With
End Sub


我用了这个代码 问题还是没解决
在J5单元格选择“选项一”时还是跳到“选项七"  还有那里需要修改的吗?  能不能给我传一份你调试好的 我直接用 EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

#13


忘记说了  我用的是office2003版的

#14


引用 13 楼 hotxuxing 的回复:
忘记说了  我用的是office2003版的

这个代码的运行结果,跟Office版本无关的。
我贴的代码是测试过的,没有问题。
你把你原来的代码全部删除,换成我贴出来的不就行了!

#15


两个列表框代码这么写在一块,而不冲突

#1


If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then 你给限制了啊

#2


我一点代码都不懂,代码从网上找的,如何修改啊? 

#3


你的代码中:
If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then
........
这个就表示: 如果活动单元格的列号=1( A列)并且行号>1,就执行 …………

同理,如果你想改成“J5到J20”,那么,条件就得改成:
If ActiveCell.Column = 10 And ActiveCell.Row >=5 And  ActiveCell.Row <=20 Then
..........

引用 2 楼 hotxuxing 的回复:
我一点代码都不懂,代码从网上找的,如何修改啊? 

如果你真是“一点儿代码也不懂”,建议你远离编程…………
EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

#4


多谢大神,完全是工作需要啊  EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

#5


引用 3 楼 Chen8013 的回复:
你的代码中:
If ActiveCell.Column = 1 And ActiveCell.Row > 1 Then
........
这个就表示: 如果活动单元格的列号=1( A列)并且行号>1,就执行 …………

同理,如果你想改成“J5到J20”,那么,条件就得改成:
If ActiveCell.Column = 10 And ActiveCell.Row >=5 And  ActiveCell.Row <=20 Then
..........

Quote: 引用 2 楼 hotxuxing 的回复:

我一点代码都不懂,代码从网上找的,如何修改啊? 

如果你真是“一点儿代码也不懂”,建议你远离编程…………
EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

大神,按照你的指点,我改了行和列,新问题又来了:下拉菜单我点第一个选项,结果跳到下面的别的选项了,是不是还得相应修改其它的值?

#6


这个当然跟“值”有关的啊!
没具体的代码,怎么说得清楚问题出在哪?
EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格
你“取值”的代码是怎么写的?

#7


引用 6 楼 Chen8013 的回复:
这个当然跟“值”有关的啊!
没具体的代码,怎么说得清楚问题出在哪?
EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格
你“取值”的代码是怎么写的?
顶楼的代码里就是,具体我也不清楚 从网上复制的

http://wenku.baidu.com/link?url=-J4qV5rgjZDfW7IoZXUDcA20YOu__fDNXS_glOuNoyiOgudlPic_YVArnCP1RILBqQMmBOpmpBlteNadYRLYZn_u0zBQOAoUFFhUHVo6Tqm

#8


把“问题”说清楚点……
从你贴出来的代码,看不出有什么不对的。 EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

#9


引用 8 楼 Chen8013 的回复:
把“问题”说清楚点……
从你贴出来的代码,看不出有什么不对的。 EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

嗯,我改成了“J5到J20”,做的下拉菜单有“选项一”到“选项二十”,共计二十个选项,
当我在
J5单元格里选中“选项一"时,结果显示选中“选项七”了,
J6单元格里选中“选项一"时,结果显示选中“选项八”了,
往下依此类推
这个论坛能传附件吗?

#10


引用 8 楼 Chen8013 的回复:
把“问题”说清楚点……
从你贴出来的代码,看不出有什么不对的。 EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格


我放百度云盘里了文件,还请大神多多帮忙
http://yun.baidu.com/share/link?shareid=2531268533&uk=471032393

#11


我把代码简单的修改了一下,试了运行效果,没什么问题。
你的那个选择列表,只有20个选项,把它的高度拉那么高干吗!!! EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

Option Explicit

Private Reload As Boolean
Private t As String
Private i As Long

Private Sub ListBox1_Change()
   If Reload Then Exit Sub
   t = ""
   For i = 0 To ListBox1.ListCount - 1
      If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)
   Next
   ActiveCell = Mid$(t, 2)
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   With ListBox1
      If ActiveCell.Column = 10 And ActiveCell.Row >= 5 And ActiveCell.Row <= 20 Then
         t = ActiveCell.Value
         Reload = True
         For i = 0 To .ListCount - 1
            If InStr(t, .List(i)) Then
               .Selected(i) = True
            Else
               .Selected(i) = False
            End If
         Next
         Reload = False
         .Top = ActiveCell.Top + ActiveCell.Height
         .Left = ActiveCell.Left
         .Width = ActiveCell.Width
         .Visible = True
      Else
         .Visible = False
      End If
   End With
End Sub

#12


引用 11 楼 Chen8013 的回复:
我把代码简单的修改了一下,试了运行效果,没什么问题。
你的那个选择列表,只有20个选项,把它的高度拉那么高干吗!!! EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

Option Explicit

Private Reload As Boolean
Private t As String
Private i As Long

Private Sub ListBox1_Change()
   If Reload Then Exit Sub
   t = ""
   For i = 0 To ListBox1.ListCount - 1
      If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i)
   Next
   ActiveCell = Mid$(t, 2)
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   With ListBox1
      If ActiveCell.Column = 10 And ActiveCell.Row >= 5 And ActiveCell.Row <= 20 Then
         t = ActiveCell.Value
         Reload = True
         For i = 0 To .ListCount - 1
            If InStr(t, .List(i)) Then
               .Selected(i) = True
            Else
               .Selected(i) = False
            End If
         Next
         Reload = False
         .Top = ActiveCell.Top + ActiveCell.Height
         .Left = ActiveCell.Left
         .Width = ActiveCell.Width
         .Visible = True
      Else
         .Visible = False
      End If
   End With
End Sub


我用了这个代码 问题还是没解决
在J5单元格选择“选项一”时还是跳到“选项七"  还有那里需要修改的吗?  能不能给我传一份你调试好的 我直接用 EXCEL用列表框控件做下拉多选功能,VB里如何修改成指定单元格

#13


忘记说了  我用的是office2003版的

#14


引用 13 楼 hotxuxing 的回复:
忘记说了  我用的是office2003版的

这个代码的运行结果,跟Office版本无关的。
我贴的代码是测试过的,没有问题。
你把你原来的代码全部删除,换成我贴出来的不就行了!

#15


两个列表框代码这么写在一块,而不冲突