2016-06-26 2 views
0

У меня есть код, который ищет «! UKINADMISSILE» в столбце «M» листа. затем он отображает все выбранные строки, имеющие «! UKINADMISSIBLE» в списке (listbox1). он работает хорошо, но если я удалю все «! UKINADMISSIBLE» с листа, он даст мне эту ошибку (не смог установить свойство списка, значение Invalid property) в этой строке кода --->Me.ListBox1.List = arrLstBox () ---> ошибка Может кто-нибудь помочь мне исправить это, пожалуйста.не удалось установить свойство списка. Ошибка недопустимого значения свойства

Private Sub btnIUK_Click() 

Dim arrLstBox() 
Dim rng, FoundCell, tmpCell As Range 
Dim i, j, numRows, lastColumn, lastRow As Long 
Dim FirstAddress, searchFor, colWidth As String 

Set rng = ActiveSheet.UsedRange 
numRow = 0 

With rng 

    lastRow = .Rows.Count 
    lastColumn = .Columns.Count 

End With 

Me.ListBox1.ColumnCount = lastColumn 
Me.ListBox1.ColumnWidths = "60;70;190;40;90;90;70;80;50;60;90;120;5" 


    Set FoundCell = rng.Find(what:="!UKINADMISSIBLE", LookIn:=xlValues, lookat:=xlWhole) 

    If Not FoundCell Is Nothing Then _ 
    FirstAddress = FoundCell.Address 

    Do Until FoundCell Is Nothing 

     Set FoundCell = rng.FindNext(after:=FoundCell) 

     If FoundCell.Address = FirstAddress Then 
      numRow = numRow + 1 
      Exit Do 
     ElseIf FoundCell.Row <> rng.FindNext(after:=FoundCell).Row Then 
      numRow = numRow + 1 
     End If 

ReDim arrLstBox(1 To numRow + 1, 1 To lastColumn + 1) 

Loop 

Do Until FoundCell Is Nothing 

    For i = 1 To numRow 
     For j = 1 To lastColumn 

      If Not IsEmpty(Cells(FoundCell.Row, j).Value) Then 

       arrLstBox(i, j) = Cells(FoundCell.Row, j).Value 

      End If 


     Next j 

     Set FoundCell = rng.FindNext(after:=FoundCell) 

     If FoundCell.Address = FirstAddress Then _ 
      Exit For 

    Next i 

    If FoundCell.Address = FirstAddress Then _ 
      Exit Do 

Loop 

Me.ListBox1.List = arrLstBox()----->ERROR 

lastRow = ListBox1.ListCount 
MsgBox "Records Found = " & lastRow, vb, "Inadmissibles On UK Sectors" 

End Subode here 

ответ

0

Проблема в том, что ваш массив пуст. В вашем коде вы должны проверить это и просто ClearListBox, если это так.

Ваш код выглядит немного неэффективным. Например, вы просматриваете весь документ для элемента, который вы хотите найти только в столбце M, и вы дважды запускаете поиск. Почему бы не искать один раз только в столбце M и хранить строки «hit» в переменной? Затем вы можете просто заполнить массив ListBox этими строками. Вы также можете рассмотреть размер столбцов ListBox только один раз в своем Userform_Initialize событии.

Вы также должны знать, что большинство ваших объявлений: Variants. Вы должны объявить каждую переменную явно так, как это Dim a As Integer, b As Integer.

код скелет этого может выглядеть как-то ниже:

Option Explicit 

Private Sub btnIUK_Click() 
    Dim v As Variant 
    Dim i As Long 
    Dim j As Long 
    Dim hits As Collection 
    Dim hit As Variant 
    Dim arrItems() As Variant 

    'Read values into an array 
    v = ThisWorkbook.Worksheets("Sheet1").UsedRange.Value2 

    'Find the target values 
    Set hits = New Collection 
    For i = 1 To UBound(v, 1) 
     If v(i, 13) = "!UKINADMISSIBLE" Then hits.Add i 
    Next 

    'Populate the listbox array with the hit items 
    If hits.Count > 0 Then 
     ReDim arrItems(1 To hits.Count, 1 To UBound(v, 2)) 
     i = 1 
     For Each hit In hits 
      For j = 1 To 13 
       arrItems(i, j) = v(hit, j) 
      Next 
      i = i + 1 
     Next 
     Me.ListBox1.List = arrItems 
    Else 
     'There are not hits so clear the listbox 
     Me.ListBox1.Clear 
    End If 

End Sub 

Private Sub UserForm_Initialize() 
    With Me.ListBox1 
     .ColumnCount = 13 
     .ColumnWidths = "60;70;190;40;90;90;70;80;50;60;90;120;5" 
    End With 

End Sub 
+0

благодарственные нагрузки, действительно ценю это. спасибо снова :) –

+0

спасибо Ambie, действительно круто –

0

Вы были почти там. Просто добавьте элементы в ListBox, если есть по крайней мере одна ячейка в столбце M с искали значение

Кроме того, если данные будут добавлены всегда в столбцах А М, то вы могли бы и избежать подсчета столбцов и сдвига параметров ListBox к UserForm_Initialize Sub ,

Как это:

Private Sub btnIUK_Click() 

Dim arrLstBox() As Variant 
Dim foundCell As Range 
Dim i As Long, j As Long, nCells As Long 
Dim firstAddress As String 

With ThisWorkbook.Worksheets("MySheet") '<--| always specify the worksheet name 
    With .Range("M", .Cells(.Rows.Count, 13).End(xlUp)) '<--| consider column M cells down to its last non empty one 
     nCells = WorksheetFunction.CountIf(.Cells, "!UKINADMISSIBLE") '<--| count searched value occurrences in column M 
     If nCells > 0 then '<--| If there's at least one occurrence ... 
      ReDim arrLstBox(1 To nCells, 1 To 13) '<--| ... ReDim your array... 
      Set foundCell = .Find(what:="!UKINADMISSIBLE", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False) '<--| ...find first occurrence (it's there for sure!) 
      firstAddress = foundCell.Address '<--| ...and store first occurrence address 
      Do '<--| first loop is granted! 
       i = i + 1 '<--| update array row index 
       For j = 1 To 13 '<--| fill array row 
        arrLstBox(i, j) = foundCell.Offset(,-13 + j) '<--| use Offset from found cell to sta in its row and loop through columns 1 To 13 
       Next 
       Set foundCell = .FindNext (foundCell) '<--| look for subsequent occurrence 
      Loop While firstAddress <> foundCell.Address '<--| subsequent loops are made till Find() wraps back to the first one 
      Me.ListBox1.List = arrLstBox 
     End If '<--| fill listbox 
    End With 
End With 
MsgBox "Records Found = " & nCells, vb, "Inadmissibles On UK Sectors" 

End Sub 


Private Sub UserForm_Initialize() 
    With Me.ListBox1 
     .ColumnCount = 13 
     .ColumnWidths = "60;70;190;40;90;90;70;80;50;60;90;120;5" 
    End With 
End Sub 
+0

О да, я перепутал несколько строк кода. спасибо пользователю3598756 за ваше время. хорошо оценен. –

Смежные вопросы