我想创建一个搜索框和按钮,它返回包含在框中输入内容的所有行,所有单元格都是字符串值,我想要搜索350行和6列。
最左边的列填充了文章名称,这些文章名称将成为文章的超链接,接下来的五列是文章中的主要关键字,但我希望搜索查看所有行和列,然后隐藏或过滤不匹配行。
这种方法似乎不起作用,我是否错误地使用了InStr?请注意,单元格(2,1)是搜索框。
Sub Button1_Click()
BeginRow = 6
EndRow = 350
BeginCol = 1
EndCol = 8
For ColCnt = BeginCol To EndCol
For RowCnt = BeginRow To EndRow
If InStr(Cells(RowCnt, ColCnt).Value, Cells(2, 1).Value) = 0 Then
Cells(RowCnt, ColCnt).EntireRow.Hidden = True
Else
Cells(RowCnt, ColCnt).EntireRow.Hidden = False
End If
Next RowCnt
Next ColCnt
End Sub
答案 0 :(得分:0)
你没有说明"似乎无法正常工作"真的意味着,但如果我冒险猜测我会说:
您在第1栏开始搜索。在链接文字中找不到它后,您转到第2栏并在Cell(7,2)
中找到关键字,以便第7行可见。
稍后您正在搜索第3列,您需要测试Cell(7,3)
,在那里找不到关键字,因此您可以隐藏该行。但是等等,它在第7行,所以你希望它可见!
如果这是你的问题,我建议切换到一行然后切换到列搜索模式。对于每一行,设置found=false
然后搜索您的列,如果找到它,请设置found=true
。
当您完成搜索该行的列后,请设置.EntireRow.Hidden = Found
。
更快的方法是
dim rng as range
set rng = Worksheet.range(cells(beginCol, BeginRow), Cells(EndCol, EndRow)).Find What:=Cells(2,1)
while not rng = nothing
'do your FOUND stuff here
set rng = Worksheet.range(cells(beginCol, BeginRow), Cells(EndCol, EndRow)).Find What:=Cells(2,1)
end while
答案 1 :(得分:0)
我创建了一个类似的东西,它在 ertdfgcvb 命名区域中找到所有匹配项,然后创建一个包含所有匹配项的下拉列表。然后它将第一个匹配值放在目标单元格中。
Sub listakészítő(ByVal Target As Range)
On Error GoTo Err
szoveg = "*" & Target.Value & "*"
x = Application.WorksheetFunction.CountIf(Range("ertdfgcvb"), szoveg) - 1
Dim MyList() As String
ReDim MyList(0 To x)
Dim cella As Range
i = 0
On Error Resume Next
For Each cella In Range("Ertdfgcvb")
If CStr(cella.Value) Like szoveg Then
MyList(i) = CStr(cella.Value)
i = i + 1
End If
Next cella
On Error GoTo Err
With Target.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=Join(MyList, ",")
.ShowError = False
End With
Application.EnableEvents = False
Target = MyList(0)
Application.EnableEvents = True
Err:
End Sub
答案 2 :(得分:0)
您似乎想要faster horse,这就是您要找的内容:
Sub Button1_Click()
BeginRow = 6
EndRow = 350
BeginCol = 1
EndCol = 8
For RowCnt = BeginRow To EndRow 'in each row
For ColCnt = BeginCol To EndCol 'check each column
Matching = False 'for matches
If InStr(Cells(RowCnt, ColCnt).Value, Cells(2, 1).Value) > 0 Then Matching = True 'identify it
Next ColCnt
Cells(RowCnt, 1).EntireRow.Hidden = Matching = False 'and hide the row if none of the rows match, unhide if any of them does
Next RowCnt
End Sub
由于它很容易创建,我甚至做了一个不能用逻辑暗淡操作的替代方案:
Sub Button1_Click()
BeginRow = 6
EndRow = 350
BeginCol = 1
EndCol = 8
For RowCnt = BeginRow To EndRow
Cells(RowCnt, 1).EntireRow.Hidden = True
Next
For RowCnt = BeginRow To EndRow 'in each row
For ColCnt = BeginCol To EndCol 'check each column
If InStr(Cells(RowCnt, ColCnt).Value, Cells(2, 1).Value) > 0 Then Cells(RowCnt, 1).EntireRow.Hidden = False
Next
Next
End Sub