2016-09-06 73 views
0

我想在表格中过滤结果并用此结果创建列表框, 此代码适用于表单上的列表框,但不适用于表单,任何想法?创建带有过滤值的列​​表框excel

Sub MyListBox() 

Dim rng As Range 
Dim vArr As Variant 
Dim ListBox1 As Object ---> this works on sheet but not works on form 

Dim x As Single 
Dim y As String 
y = Worksheets("Sheet2").Cells(1, 12).Value 
x = Worksheets("Sheet2").Cells(2, 12).Value 
Application.ScreenUpdating = False 
Application.EnableEvents = False 
Application.DisplayAlerts = False 

Set rng = Range("TestMaterial") 

Set ListBox1 = ActiveSheet.OLEObjects(1).Object ---> this works on sheet but not works on form 

rng.AutoFilter field:=13, Criteria1:=y 
rng.AutoFilter field:=12, Criteria1:=x 

Worksheets.Add 
rng.SpecialCells(xlCellTypeVisible).Copy Range("a1") 

vArr = ActiveSheet.UsedRange 

With ListBox1 
    .List = (vArr) 
End With 

ActiveSheet.Delete 
Worksheets("TRAINING").AutoFilterMode = False 
'rng.AutoFilter.Clear 


Application.ScreenUpdating = True 
Application.EnableEvents = True 
Application.DisplayAlerts = True 
End Sub 

我发现这个代码,但这个创造了新的列表框,但不填充列表框与数据,只有标题,没有找到什么是不正确的,与此代码我怎么能弥补现有列表框?

Sub MyListBox() 
Dim rng As Range 
Dim vArr As Variant 

    Dim ListBox1 As MSForms.Control 
Application.ScreenUpdating = False 
Application.EnableEvents = False 
Application.DisplayAlerts = False 

Set rng = Range("TestMaterial") 
    Set ListBox1 = frmplan.Controls.Add("Forms.ListBox.1") ---> adds new Listbox to form even I have some one with name "Listbox1" 

rng.AutoFilter field:=13, Criteria1:=txtsdept.Value 
rng.AutoFilter field:=12, Criteria1:=txtsgrade 


Worksheets.Add 
rng.SpecialCells(xlCellTypeVisible).Copy Range("a1") 

vArr = ActiveSheet.UsedRange 

    With ListBox1 

    .List = (vArr) 
End With 

ActiveSheet.Delete 
Worksheets("TRAINING").AutoFilterMode = False 



Application.ScreenUpdating = True 
Application.EnableEvents = True 
Application.DisplayAlerts = True 
End Sub 
+1

如果代码在用户表单中,则不需要变量 - 只需按名称引用列表框:'ListBox1.List = vArr' – Rory

+0

上面的代码是正确的,它将正常工作。请检查所选范围是否包含数据,因为UserRange数据已添加到ListBox中。另外我相信TestMaterial是一个有效的范围(例如,“A1:A5”) –

+0

第二个代码是否可以填充现有的Listbox而不创建新的?在第一个代码中,我可以创建一个Listbox并填充它,但是在第二个代码中,即使我有一个Listbox代码也会创建一个新代码。 –

回答

0

试试下面的代码为“用户窗体”案:

Sub MyListBox() 
    With Range("TestMaterial") 
     .AutoFilter Field:=13, criteria1:=txtsdept.value 
     .AutoFilter Field:=12, criteria1:=txtsgrade 
     If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then FillListBox .SpecialCells(xlCellTypeVisible), Me.ListBox1 
     .Parent.AutoFilterMode = False 
    End With 
End Sub 

Sub FillListBox(filteredRng As Range, LB As msforms.ListBox) 
    Dim vArr As Variant 

    vArr = GetArray(filteredRng) '<--| fill array 
    With LB 
     .ColumnCount = UBound(vArr, 2) 
     .List = vArr 
    End With 
End Sub 

Function GetArray(filteredRng As Range) As Variant 
    Dim calculation As XlCalculation 

    ApplicationBoost True, calculation '<--| boost application "up" 
    With filteredRng 
     Worksheets.Add 
     .Copy Range("A1") 
     GetArray = ActiveSheet.UsedRange '<--| fill returned array 

     Application.DisplayAlerts = False '<--| disable alerts for what strictly needed 
     ActiveSheet.Delete 
     Application.DisplayAlerts = True '<--| enable alerts back 
    End With 
    ApplicationBoost False, calculation '<--| boost application "back"  
End Function 

Sub ApplicationBoost(boost As Boolean, calculation As XlCalculation) 
    With Application 
     If boost Then 
      calculation = .calculation '<--| retrieve current calculation setting 
      .calculation = xlCalculationManual '<--| turn calculation off 
     Else 
      .calculation = calculation '<--| restore current calculation setting 
     End If 
     .ScreenUpdating = Not boost 
     .EnableEvents = Not boost 
    End With 
End Sub 

,你可以看到,我重构你的代码,并分成更小位,你可以更容易地处理两者增强和维护您的代码

+0

亲爱的,我还是不明白你的代码的某些部分,但这就是我一直在寻找的,并且非常出色!感谢您的帮助! –

+0

不客气。然后请将我的答案标记为已接受。谢谢。 – user3598756