2016-07-04 13 views
0

excel 2013 vbaのユーザーフォームに問題が1つあります。結果の行数を集計する際に問題が発生しました。

検索ボタン(SearchButton)をクリックしたときに、ユーザーフォームの検索結果ボックス(SearchResultsListBox)に表示される行数(結果)の数をカウントしたいとします。

結果の数はResults foundボックス(ResultsFoundTextBox)に数値として表示されます。

現在、検索結果ボックスの行数(結果)に関係なく、常に96が返されます。なぜ生データは現在17-20行しか持たないのか分かりません。

これは私のコードです:

Private Sub SearchButton_Click() 
'dim the variables 
Dim Crit As Range 
Dim FindMe As Range 
Dim SearchMe As Range 
Dim the_sheet1 As Worksheet 
Dim the_sheet3 As Worksheet 

'error handler 
On Error GoTo errHandler: 

'set object variables 
Set the_sheet1 = Sheets("Data Sheet") 
Set the_sheet3 = Sheets("Filter Data") 

'hold in memory and stop screen flicker 
Application.ScreenUpdating = False 

'if All Columns is selected 
With Me.SearchComboBox 
If .ListIndex <> -1 Then 
Select Case .Value 
Case "All" 
    the_sheet3.Range("Y2") = "" 
    the_sheet3.Range("Y3") = Me.EnterTextBox.Value 

'if other categories are selected 
Case "Project Name", "Client", "Sector", "Status", "Contract Value", "Anticipated Final Account", "Revenue Traded Prior", "2015", "2016", "2017", "2018", "2019", "Discipline", "Board Director", "Associate Director", "Commercial Manager", "Project Manager", "Quantity Surveyor", "Pre-Con Start Date", "Actual Start Date", "Defect Period Start Date", "Defect Period End Date" 
    the_sheet3.Range("Y2") = Me.SearchComboBox.Value 
    the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
End Select 
End If 
End With 

'find the value in the column 
Set SearchMe = Sheets("Filter Data").Range("Y3") 
Set FindMe = Sheets("Data Sheet").Range("A2:V62").Find(What:=SearchMe, LookIn:=xlValues, LookAt _ 
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
    False, SearchFormat:=False) 
Sheets("Filter Data").Range("Y2").Value = Cells(2, FindMe.Column) 

Sheets("Data Sheet").Range("A1:V62").AdvancedFilter Action:=xlFilterCopy, _ 
    CriteriaRange:=Range("'Filter Data'!Criteria"), CopyToRange:=Range(_ 
    "'Filter Data'!Extract"), Unique:=False 

'variable for criteria header 
Set Crit = the_sheet3.Cells(2, FindMe.Column) 

'if no criteria is added to the search 
If Me.EnterTextBox.Value = "" Then 
the_sheet3.Range("Y3") = "" 
Else 
'add values from the search 
the_sheet3.Range("Y2") = Crit 
If Crit = "Project Name" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Client" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Sector" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Status" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Contract Value" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "Anticipated Final Account" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "Revenue Traded Prior" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "2015" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "2016" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "2017" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "2018" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "2019" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "Discipline" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Board Director" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Associate Director" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Commercial Manager" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Project Manager" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Quantity Surveyor" Then 
the_sheet3.Range("Y3") = "*" & Me.EnterTextBox.Value & "*" 
If Crit = "Pre-Con Start Date" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "Actual Start Date" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "Defect Period Start Date" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
If Crit = "Defect Period End Date" Then 
the_sheet3.Range("Y3") = Me.EnterTextBox.Value 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 
End If 

'unprotect all sheets 
'Unprotect_All 

'add the dynamic data to the listbox 
Me.SearchResultListBox.RowSource = Range("'Filter Data'!Extract").Address(external:=True) 

'Number of results found 
Me.ResultsFoundTextBox.Value = Me.SearchResultListBox.ListCount 

'protect all sheets 
'Protect_All 

'error handler 
On Error GoTo 0 
Exit Sub 
errHandler: 

'if error occurs then show me exactly where the error occurs 
MsgBox "No match found for " & EnterTextBox.Text 

Exit Sub 

End Sub 

私はそれが問題であることはおそらく、この行で実現するが、私は非常に多くの選択肢とどれを試してみましたが動作するようです:

'Number of results found 
Me.ResultsFoundTextBox.Value = Me.SearchResultListBox.ListCount 

感謝すべて。最後のビットと私は終わった! :-)

答えて

1

If文が不適切に階層化されています。 Ifを最初に配置し、後でEnd Ifを配置すると、すべてのステートメントが入れ子になります。したがって、シーケンス内の1つのステートメントがFalseに評価されると、残りのステートメントには決して到達しません。すべての小切手で同じ値をチェックしている場合は、このセクションをSelect Case ... Caseブロックで書き直すことをお勧めします(これにより、コードはずっと短く読みやすくなります)。

+0

また、 'ElseIf'を使うこともできます。コードを正しくインデントすると、このようなエラーが見つかります。 [VBA Smart Indenter]をダウンロードする(https://www.add-ins.com/macro-products-for-Microsoft-Excel/how-to-indent-vba-code/how-to-indent-vba-code.htm) )それは自由であり、それはフォーマットの時間を節約します。 –

関連する問題