我是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中。
对此有任何建议吗?
谢谢。
答案 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一样,这不是真正的过滤器:它只是隐藏了与指定条件不匹配的行。