2016-06-26 28 views
0

シートの列 "M"に "!UKINADMISSIBLE"の検索コードがあります。リストボックス(listbox1)に "!UKINADMISSIBLE"を持つ選択された行がすべて表示されます。それはうまく動作しますが、シートから「!UKINADMISSIBLE」をすべて削除すると、このコード行でこのエラー(リストプロパティ、無効なプロパティ値を設定できませんでした)を得られます--->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で検索したい項目を探し、検索を2回実行します。なぜ列Mで一度だけ検索し、 'ヒット'行を変数に格納するのでしょうか?次に、ListBox配列にこれらの行を設定するだけです。また、Userform_InitializeイベントでListBox列のサイジングを1回だけ行うことを検討することもできます。

宣言のほとんどが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

あなたはほとんどそこにあった。

このためスケルトンコードは、以下のもののように見えるかもしれません。 検索された値を持つ列Mに少なくとも1つのセルがある場合は、リストボックスに要素を追加するだけです

さらに、追加するデータが常に列A〜Mにある場合、列数をカウントしたり、リストボックスの設定を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

ああ、私はいくつかのコードラインを台無しにしました。ありがとうございますuser3598756あなたの時間のために。よく感謝します。 –

関連する問題