excel中文章列表的搜索框

时间:2015-03-20 14:34:23

标签: vba excel-vba excel

我想创建一个搜索框和按钮,它返回包含在框中输入内容的所有行,所有单元格都是字符串值,我想要搜索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

3 个答案:

答案 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