Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-如何对多个框使用宏按钮_Vba_Excel - Fatal编程技术网

VBA-如何对多个框使用宏按钮

VBA-如何对多个框使用宏按钮,vba,excel,Vba,Excel,我不熟悉VBA和宏。我会试着解释我试图创造什么,然后我会解释我有什么问题 我的Excel中有两张表格;'“第1页”和“第2页” 表1充满了数据。这些数据从A列到AK列,共有4206行 表2仅包含一个输入单元格框,该框旁边有一个“GO”按钮。该按钮被指定给宏 我想创建什么? 在输入单元格框中,我键入类似“GB”的内容,然后按下“GO”按钮。“GO”按钮将在第1页中查找包含“GB”的单元格。有两个特定列中可能包含“GB”;其中一个是K列,另一个是L列。“GO”按钮将在这两列中查找“GB”并过滤行 重

我不熟悉VBA和宏。我会试着解释我试图创造什么,然后我会解释我有什么问题

我的Excel中有两张表格;'“第1页”和“第2页”

表1充满了数据。这些数据从A列到AK列,共有4206行

表2仅包含一个输入单元格框,该框旁边有一个“GO”按钮。该按钮被指定给宏

我想创建什么?

在输入单元格框中,我键入类似“GB”的内容,然后按下“GO”按钮。“GO”按钮将在第1页中查找包含“GB”的单元格。有两个特定列中可能包含“GB”;其中一个是K列,另一个是L列。“GO”按钮将在这两列中查找“GB”并过滤行

重要提示:我不想设计一个宏,让它们在K列和L列中查找“GB”。相反,我希望它们在K列或L列中查找“GB”

我创造了什么?

我设计了一个宏并将其分配给“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
什么与代码一起工作?有什么问题吗?

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

有什么建议吗


谢谢。

我想像这样的东西可能就可以了。我对“GB”是否会变化或每次都是相同的有点困惑,所以我为两者都包括了选项(默认情况下代码假定它是静态的)。我也不知道您是否希望它区分大小写,因此默认情况下,它不区分大小写(要使其区分大小写,请删除
LCase
函数)


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

我不知道如何使用过滤器来实现这一点,但我已经做了一个变通方法,使用IF cells(I,1)=“X”或cells(I,2)=“X”循环单元格,然后使用'Nothing\u when\u true Else rows(I).EntireRow.Hidden=如果为,则为真结束。只需在循环之前取消隐藏每个按钮上的所有行。抱歉,但我不清楚这一点。您是说使用IF语句而不是VBA/Macro吗?宏将包含一个循环(对于i=start-TO-end),其中包含一个IF语句,如果该行不符合条件,则隐藏该行。它通过隐藏行进行伪筛选,但没有提供真正筛选的其他好处,例如排序。在子例程工作之前,您还需要工作表(“名称”)。Cells.EntireRow.Hidden=False。这应该在按下按钮时执行,因此我们希望避免在最后使用多个搜索隐藏所有行。您还可以使ws.Rows(x).EntireRows.Hidden=False,而不是取消隐藏整个工作表。这一点很好。更进一步,您可以使用
ws.range(ws.rows(firstRow).EntireRow,ws.rows(lastRow).EntireRow.Hidden=False来取消隐藏指定范围内的行,因此在中添加了该选项。大家好,谢谢!真的很有帮助。
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