Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.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 - Fatal编程技术网

VBA:按字符串变量筛选

VBA:按字符串变量筛选,vba,Vba,除了通过变量Sector1进行的自动筛选之外,这段代码中的所有内容都可以工作 其思想是Sector1(下拉列表单元格B63)中的值可以变化。在Review选项卡中,我想在特定部分的D列(RngStart和RngStop之间)中搜索Sector1中的字符串值。当它找到它时,我想从A16开始将G列中的信息复制到营销表中。我知道这是可行的,因为如果我在下面的代码中输入了一个有效的扇区(例如“Health”),而不是sector1,它就会起作用。然而,有了这段代码,它只复制g列中的所有内容,而不过滤se

除了通过变量Sector1进行的自动筛选之外,这段代码中的所有内容都可以工作

其思想是Sector1(下拉列表单元格B63)中的值可以变化。在Review选项卡中,我想在特定部分的D列(RngStart和RngStop之间)中搜索Sector1中的字符串值。当它找到它时,我想从A16开始将G列中的信息复制到营销表中。我知道这是可行的,因为如果我在下面的代码中输入了一个有效的扇区(例如“Health”),而不是sector1,它就会起作用。然而,有了这段代码,它只复制g列中的所有内容,而不过滤sector1

Sub test()

Dim RngDest As Range
Dim RngStart As Range, RngStop As Range
Dim Sector1 As String

    Sector1 = Sheets("Dropdowns").Range("B63").Value
    With Sheets("Mkting")
        Set RngDest = .Range("A16")
    End With

    Set RngStart = Sheets("Review").Columns("A").Find("Impact Statements", , xlValues, xlPart)
    Set RngStop = Sheets("Review").Columns("A").Find("Quotes", , xlValues, xlPart)

    With Sheets("Review").Range("D" & RngStart.row & ":" & "D" & RngStop.row)
        .AutoFilter 1, Criteria1:=Sector1
        .Offset(1, 3).Copy RngDest
        .AutoFilter
    End With
End Sub

如果您只关心获取单个值(即,只有一个值与
自动筛选
匹配),则只需使用
匹配
返回您正在搜索的值的相对位置:

Dim foundRow as Variant
Dim rngToSearch as Range

'Define a range of column D:G, from start row to end row:
Set rngToSearch = Sheets("Review").Range("D" & RngStart.Row & ":G" & RngStop.Row)

'do a vlookup on that range
foundRow = Application.Match(Sector1, rngToSearch.Columns(1), False)

If not IsError(foundRow) Then
    rngToSearch.Cells(foundRow,1).Copy RngDest
End If
如果有多个可能出现的过滤值,那么我认为您可以采取几种方法,让我们尝试忽略标题行(通常作为“过滤”范围的一部分返回,不幸的是:

Dim rngToSearch as Range
Dim copyRange As Range

Set rngToSearch = Sheets("Review").Range("D" & RngStart.Row & ":G" & RngStop.Row)
'Get a single column range representing column G:
Set copyRange = rngToSearch.Offset(1, 3).Resize(rngToSearch.Rows.Count - 1, 1)

rngToSearch.AutoFilter 1, Criteria1:=Sector1

copyRange.SpecialCells(xlCellTypevisible).Copy rngDest

rngToSearch.AutoFilter 'Turn off the filter   
要省略G列中的空格,请在应用第一个自动筛选后立即执行类似操作,为G列添加另一个自动筛选:

rngToSearch.AutoFilter 4, Criteria1:="<>", Operator:=xlAnd
rngToSearch.AutoFilter 4,标准1:=“”,运算符:=xlAnd
这是我的测试版本(使用稍微不同的范围/等),输出到F2:

Sub test()
Dim rngToSearch As Range
Set rngToSearch = Range("A1:D8")

rngToSearch.AutoFilter 1, Criteria1:=2

rngToSearch.AutoFilter 4, Criteria1:="<>", Operator:=xlAnd

Dim copyRange As Range
Set copyRange = rngToSearch.Offset(1, 3).Resize(rngToSearch.Rows.Count - 1, 1)

If rngToSearch.SpecialCells(xlCellTypeVisible).Rows > 1 Then
    copyRange.SpecialCells(xlCellTypeVisible).Copy Range("F2")
End If

rngToSearch.AutoFilter

End Sub

子测试()
变暗RNG搜索作为范围
设置rngToSearch=范围(“A1:D8”)
rngToSearch.AutoFilter 1,准则1:=2
rngToSearch.AutoFilter 4,标准1:=“”,运算符:=xlAnd
暗拷贝范围作为范围
设置copyRange=rngToSearch.Offset(1,3)。调整大小(rngToSearch.Rows.Count-1,1)
如果rngToSearch.SpecialCells(xlCellTypeVisible).Rows>1,则
copyRange.SpecialCells(xlCellTypeVisible)。复制范围(“F2”)
如果结束
rngToSearch.AutoFilter
端接头

如果您只关心获取单个值(即,只有一个匹配项与您的
自动筛选
匹配),则只需使用
匹配
返回您正在搜索的值的相对位置:

Dim foundRow as Variant
Dim rngToSearch as Range

'Define a range of column D:G, from start row to end row:
Set rngToSearch = Sheets("Review").Range("D" & RngStart.Row & ":G" & RngStop.Row)

'do a vlookup on that range
foundRow = Application.Match(Sector1, rngToSearch.Columns(1), False)

If not IsError(foundRow) Then
    rngToSearch.Cells(foundRow,1).Copy RngDest
End If
如果有多个可能出现的过滤值,那么我认为您可以采取几种方法,让我们尝试忽略标题行(通常作为“过滤”范围的一部分返回,不幸的是:

Dim rngToSearch as Range
Dim copyRange As Range

Set rngToSearch = Sheets("Review").Range("D" & RngStart.Row & ":G" & RngStop.Row)
'Get a single column range representing column G:
Set copyRange = rngToSearch.Offset(1, 3).Resize(rngToSearch.Rows.Count - 1, 1)

rngToSearch.AutoFilter 1, Criteria1:=Sector1

copyRange.SpecialCells(xlCellTypevisible).Copy rngDest

rngToSearch.AutoFilter 'Turn off the filter   
要省略G列中的空格,请在应用第一个自动筛选后立即执行类似操作,为G列添加另一个自动筛选:

rngToSearch.AutoFilter 4, Criteria1:="<>", Operator:=xlAnd
rngToSearch.AutoFilter 4,标准1:=“”,运算符:=xlAnd
这是我的测试版本(使用稍微不同的范围/等),输出到F2:

Sub test()
Dim rngToSearch As Range
Set rngToSearch = Range("A1:D8")

rngToSearch.AutoFilter 1, Criteria1:=2

rngToSearch.AutoFilter 4, Criteria1:="<>", Operator:=xlAnd

Dim copyRange As Range
Set copyRange = rngToSearch.Offset(1, 3).Resize(rngToSearch.Rows.Count - 1, 1)

If rngToSearch.SpecialCells(xlCellTypeVisible).Rows > 1 Then
    copyRange.SpecialCells(xlCellTypeVisible).Copy Range("F2")
End If

rngToSearch.AutoFilter

End Sub

子测试()
变暗RNG搜索作为范围
设置rngToSearch=范围(“A1:D8”)
rngToSearch.AutoFilter 1,准则1:=2
rngToSearch.AutoFilter 4,标准1:=“”,运算符:=xlAnd
暗拷贝范围作为范围
设置copyRange=rngToSearch.Offset(1,3)。调整大小(rngToSearch.Rows.Count-1,1)
如果rngToSearch.SpecialCells(xlCellTypeVisible).Rows>1,则
copyRange.SpecialCells(xlCellTypeVisible)。复制范围(“F2”)
如果结束
rngToSearch.AutoFilter
端接头

如果您只关心获取单个值(即,只有一个匹配项与您的
自动筛选
匹配),则只需使用
匹配
返回您正在搜索的值的相对位置:

Dim foundRow as Variant
Dim rngToSearch as Range

'Define a range of column D:G, from start row to end row:
Set rngToSearch = Sheets("Review").Range("D" & RngStart.Row & ":G" & RngStop.Row)

'do a vlookup on that range
foundRow = Application.Match(Sector1, rngToSearch.Columns(1), False)

If not IsError(foundRow) Then
    rngToSearch.Cells(foundRow,1).Copy RngDest
End If
如果有多个可能出现的过滤值,那么我认为您可以采取几种方法,让我们尝试忽略标题行(通常作为“过滤”范围的一部分返回,不幸的是:

Dim rngToSearch as Range
Dim copyRange As Range

Set rngToSearch = Sheets("Review").Range("D" & RngStart.Row & ":G" & RngStop.Row)
'Get a single column range representing column G:
Set copyRange = rngToSearch.Offset(1, 3).Resize(rngToSearch.Rows.Count - 1, 1)

rngToSearch.AutoFilter 1, Criteria1:=Sector1

copyRange.SpecialCells(xlCellTypevisible).Copy rngDest

rngToSearch.AutoFilter 'Turn off the filter   
要省略G列中的空格,请在应用第一个自动筛选后立即执行类似操作,为G列添加另一个自动筛选:

rngToSearch.AutoFilter 4, Criteria1:="<>", Operator:=xlAnd
rngToSearch.AutoFilter 4,标准1:=“”,运算符:=xlAnd
这是我的测试版本(使用稍微不同的范围/等),输出到F2:

Sub test()
Dim rngToSearch As Range
Set rngToSearch = Range("A1:D8")

rngToSearch.AutoFilter 1, Criteria1:=2

rngToSearch.AutoFilter 4, Criteria1:="<>", Operator:=xlAnd

Dim copyRange As Range
Set copyRange = rngToSearch.Offset(1, 3).Resize(rngToSearch.Rows.Count - 1, 1)

If rngToSearch.SpecialCells(xlCellTypeVisible).Rows > 1 Then
    copyRange.SpecialCells(xlCellTypeVisible).Copy Range("F2")
End If

rngToSearch.AutoFilter

End Sub

子测试()
变暗RNG搜索作为范围
设置rngToSearch=范围(“A1:D8”)
rngToSearch.AutoFilter 1,准则1:=2
rngToSearch.AutoFilter 4,标准1:=“”,运算符:=xlAnd
暗拷贝范围作为范围
设置copyRange=rngToSearch.Offset(1,3)。调整大小(rngToSearch.Rows.Count-1,1)
如果rngToSearch.SpecialCells(xlCellTypeVisible).Rows>1,则
copyRange.SpecialCells(xlCellTypeVisible)。复制范围(“F2”)
如果结束
rngToSearch.AutoFilter
端接头

如果您只关心获取单个值(即,只有一个匹配项与您的
自动筛选
匹配),则只需使用
匹配
返回您正在搜索的值的相对位置:

Dim foundRow as Variant
Dim rngToSearch as Range

'Define a range of column D:G, from start row to end row:
Set rngToSearch = Sheets("Review").Range("D" & RngStart.Row & ":G" & RngStop.Row)

'do a vlookup on that range
foundRow = Application.Match(Sector1, rngToSearch.Columns(1), False)

If not IsError(foundRow) Then
    rngToSearch.Cells(foundRow,1).Copy RngDest
End If
如果有多个可能出现的过滤值,那么我认为您可以采取几种方法,让我们尝试忽略标题行(通常作为“过滤”范围的一部分返回,不幸的是:

Dim rngToSearch as Range
Dim copyRange As Range

Set rngToSearch = Sheets("Review").Range("D" & RngStart.Row & ":G" & RngStop.Row)
'Get a single column range representing column G:
Set copyRange = rngToSearch.Offset(1, 3).Resize(rngToSearch.Rows.Count - 1, 1)

rngToSearch.AutoFilter 1, Criteria1:=Sector1

copyRange.SpecialCells(xlCellTypevisible).Copy rngDest

rngToSearch.AutoFilter 'Turn off the filter   
要省略G列中的空格,请在应用第一个自动筛选后立即执行类似操作,为G列添加另一个自动筛选:

rngToSearch.AutoFilter 4, Criteria1:="<>", Operator:=xlAnd
rngToSearch.AutoFilter 4,标准1:=“”,运算符:=xlAnd
这是我的测试版本(使用稍微不同的范围/等),输出到F2:

Sub test()
Dim rngToSearch As Range
Set rngToSearch = Range("A1:D8")

rngToSearch.AutoFilter 1, Criteria1:=2

rngToSearch.AutoFilter 4, Criteria1:="<>", Operator:=xlAnd

Dim copyRange As Range
Set copyRange = rngToSearch.Offset(1, 3).Resize(rngToSearch.Rows.Count - 1, 1)

If rngToSearch.SpecialCells(xlCellTypeVisible).Rows > 1 Then
    copyRange.SpecialCells(xlCellTypeVisible).Copy Range("F2")
End If

rngToSearch.AutoFilter

End Sub

子测试()
变暗RNG搜索作为范围
设置rngToSearch=范围(“A1:D8”)
rngToSearch.AutoFilter 1,准则1:=2
rngToSearch.AutoFilter 4,标准1:=“”,运算符:=xlAnd
暗拷贝范围作为范围
设置copyRange=rngToSearch.Offset(1,3)。调整大小(rngToSearch.Rows.Count-1,1)
如果rngToSearch.SpecialCells(xlCellTypeVisible).Rows>1,则
copyRange.SpecialCells(xlCellTypeVisible)。复制范围(“F2”)
如果结束
rngToSearch.AutoFilter
端接头

我在David的伟大答案中添加了代码,以处理您正在排序的内容没有出现在您的RngToSeach中的情况-也就是说,Sector1不在您的范围内。David,我将您帮助我完成的许多其他事情放在一起。非常感谢您的帮助

子测试()

Dim RngToSearch作为范围
Dim RngDest As范围
调暗RngStart作为范围,RngStop作为范围
暗拷贝As范围
Dim Sector 1作为字符串
暗淡的