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
感謝すべて。最後のビットと私は終わった! :-)
また、 '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) )それは自由であり、それはフォーマットの時間を節約します。 –