Excel 基于其他列表框项目选择的列表框项目选择
工作表上有两个(ActiveX)列表框(月表和年表)。每一个都由H(月)和I(年)列中的唯一值填充(见下面的代码)。用户将在Monthlist中选择可用的月份。我希望“年表”中的可用项目反映“月表”中的选择。例如,如果表中有2015年5月和2016年6月的数据,并且用户从月份列表中选择“五月”,则“2015”应仅在“年度列表”中可用。(“2016”应灰显或不存在) 显而易见的解决方案是对H列应用过滤器,以反映Monthlist中的选择,然后从I列中收集唯一的可见值,并将其显示在Yearlist中。也许有更优雅的方法来解决这个问题?谢谢你的帮助Excel 基于其他列表框项目选择的列表框项目选择,excel,listbox,vba,Excel,Listbox,Vba,工作表上有两个(ActiveX)列表框(月表和年表)。每一个都由H(月)和I(年)列中的唯一值填充(见下面的代码)。用户将在Monthlist中选择可用的月份。我希望“年表”中的可用项目反映“月表”中的选择。例如,如果表中有2015年5月和2016年6月的数据,并且用户从月份列表中选择“五月”,则“2015”应仅在“年度列表”中可用。(“2016”应灰显或不存在) 显而易见的解决方案是对H列应用过滤器,以反映Monthlist中的选择,然后从I列中收集唯一的可见值,并将其显示在Yearlist中
Sub UniqueMonthsAndYears(ByVal ws As Object)
Dim LastRow, i, j, k As Long
Dim c As Range
Dim MyArUniqVal() As Variant
Dim i2, j2, k2 As Long
Dim c2 As Range
Dim MyArUniqVal2() As Variant
Dim MonthList As MSForms.ListBox
Dim YearList As MSForms.ListBox
ReDim MyArUniqVal(0)
ReDim MyArUniqVal2(0)
Dim rng As Range
Dim cl As Range
LastRow = ActiveSheet.Range("H" & Rows.Count).End(xlUp).Row
Set rng = Range("H9:H" & LastRow)
With ThisWorkbook.ActiveSheet
For Each cl In rng
If cl.EntireRow.Hidden = False Then '//Use Hidden property to check if filtered or not
Debug.Print cl
If cl.Value <> cl.Offset(1, 0).Value Then '~~~~~MonthArray
MyArUniqVal(UBound(MyArUniqVal)) = cl.Value
ReDim Preserve MyArUniqVal(UBound(MyArUniqVal) + 1)
End If
If cl.Offset(0, 1).Value <> cl.Offset(1, 1).Value Then 'Year Array
MyArUniqVal2(UBound(MyArUniqVal2)) = cl.Offset(0, 1).Value
ReDim Preserve MyArUniqVal2(UBound(MyArUniqVal2) + 1)
End If
End If
Next cl
ReDim Preserve MyArUniqVal(UBound(MyArUniqVal) - 1)
ReDim Preserve MyArUniqVal2(UBound(MyArUniqVal2) - 1)
End With
'Fill the listbox
ws.YearList.Clear
For k2 = 0 To UBound(MyArUniqVal2)
ws.YearList.AddItem (MyArUniqVal2(k2))
Next k2
ws.MonthList.Clear
For k = 0 To UBound(MyArUniqVal)
ws.MonthList.AddItem (MyArUniqVal(k))
Next k
End Sub
Sub UniqueMonthsAndYears(ByVal ws作为对象)
最后一行,i,j,k的长度
调光范围
Dim MyArUniqVal()作为变体
尺寸i2、j2、k2与长度相同
变暗c2 As范围
Dim MyArUniqVal2()作为变体
暗月份列表为MSForms.ListBox
以MSForms.ListBox格式显示的Dim YearList
ReDim MyArUniqVal(0)
ReDim MyArUniqVal2(0)
变暗rng As范围
Dim cl As范围
LastRow=ActiveSheet.Range(“H”和Rows.Count).End(xlUp).Row
设置rng=范围(“H9:H”和最后一行)
使用ThisWorkbook.ActiveSheet
对于rng中的每个cl
如果cl.EntireRow.Hidden=False,则“//使用Hidden属性检查是否已筛选
调试。打印cl
如果cl.Value cl.Offset(1,0).Value,则'~~~~~蒙塔雷
MyArUniqVal(UBound(MyArUniqVal))=cl.值
雷迪姆保留MyArUniqVal(UBound(MyArUniqVal)+1)
如果结束
如果cl.Offset(0,1)。值cl.Offset(1,1)。值然后是“年份数组”
MyArUniqVal2(UBound(MyArUniqVal2))=cl.Offset(0,1).值
雷迪姆保护MyArUniqVal2(UBound(MyArUniqVal2)+1)
如果结束
如果结束
下一个cl
雷迪姆保留MyArUniqVal(UBound(MyArUniqVal)-1)
雷迪姆保护MyArUniqVal2(UBound(MyArUniqVal2)-1)
以
“填写列表框
ws.YearList.Clear
对于k2=0至UBound(MyArUniqVal2)
ws.YearList.AddItem(MyArUniqVal2(k2))
下一个k2
ws.MonthList.Clear
对于k=0至UBound(MyArUniqVal)
ws.MonthList.AddItem(MyArUniqVal(k))
下一个k
端接头