VBA - 如何将宏按钮用于多个框

时间:2017-08-22 18:52:43

标签: excel vba excel-vba

我是VBA和宏的新手。我将尝试解释我想要创建的内容,然后我将解释我遇到的问题。

我的Excel中有两张纸; '表1'和'表2'。

表1中包含大量数据。该数据从A列到AK,有4206行。

工作表2仅包含一个输入单元格框,其中包含一个' GO'框旁边的按钮。该按钮被分配给宏。

我想创建什么?

在输入单元格框中输入类似' GB'然后按“GO'按钮。 ' GO'按钮将在工作表1中查看具有' GB'在他们中。有两个特定的列可以有' GB'在他们中;其中一个是K列,一个是L列。' GO'按钮将在这两列中查找' GB'并过滤行。

重要提示:我不想设计一个宏,以便他们寻找GB' GB'在列K 列L中。相反,我希望他们寻找' GB'在列K 列L。

我创造了什么?

我设计了一个宏并将其分配给了' GO'框。这是我输入的代码:

Option Explicit

Sub Macro1()
'
' Macro1 Macro
'
    Sheets("Sheet 1").Select
    If ActiveSheet.AutoFilterMode Or ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
    End If
    Range("A12:AM4216").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Range("A1:AK2"), Unique:=False

End Sub

什么与代码有关?问题是什么?

代码将返回具有' GB'在L列中。这很棒。但是,我正在寻找如何更改代码的方法,以便它返回具有' GB'在列K 列L中。

对此有任何建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为这样的事情应该可以做到。我对GB' GB'是否有点困惑。可能会有所不同,或者每次都是相同的,所以我为两者都包含了选项(默认情况下代码假定它是静态的)。我也不知道你是否希望它区分大小写,所以默认情况下,它不区分大小写(使其区分大小写,删除LCase函数)。

Sub Macro1()
Dim ws As Worksheet
Dim firstRow As Long, lastRow As Long
Dim firstCol As String, secondCol As String
Dim findStr As String
Dim x As Long

'define worksheet to check
Set ws = ActiveWorkbook.Sheets("Sheet1") 'or whichever sheet

'define search string to check for based on static value
findStr = "GB"

'define search string to check for based on cell value
'findStr = ws.cells("A1") 'or whichever cell

'define start and end rows to loop through
firstRow = 12
lastRow = 4216

'define columns to check
firstCol = "K"
secondCol = "L"

'turn off screenupdating
Application.ScreenUpdating = False

'unhide rows in range
ws.Range(ws.Rows(firstRow).EntireRow, ws.Rows(lastRow).EntireRow).Hidden = False

'loop through the rows
For x = firstRow To lastRow
    'if either cell has the search string in it (regardless of case)...
    If InStr(LCase(ws.Range(firstCol & x)), LCase(findStr)) Or InStr(LCase(ws.Range(secondCol & x)), LCase(findStr)) Then
        '...do nothing
    Else
        '...otherwise, hide the row
        ws.Rows(x).EntireRow.Hidden = True
    End If
Next x

'turn screenupdating back on
Application.ScreenUpdating = True    

End Sub

请注意,与上面提到的Cyril一样,这不是真正的过滤器:它只是隐藏了与指定条件不匹配的行。