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