Excel 基于其他列表框项目选择的列表框项目选择

Excel 基于其他列表框项目选择的列表框项目选择,excel,listbox,vba,Excel,Listbox,Vba,工作表上有两个(ActiveX)列表框(月表和年表)。每一个都由H(月)和I(年)列中的唯一值填充(见下面的代码)。用户将在Monthlist中选择可用的月份。我希望“年表”中的可用项目反映“月表”中的选择。例如,如果表中有2015年5月和2016年6月的数据,并且用户从月份列表中选择“五月”,则“2015”应仅在“年度列表”中可用。(“2016”应灰显或不存在) 显而易见的解决方案是对H列应用过滤器,以反映Monthlist中的选择,然后从I列中收集唯一的可见值,并将其显示在Yearlist中

工作表上有两个(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
端接头