使用Filter命令检查字符串是否在Excel VBA范围内
我正在检查一个单元格区域是否在另一个区域中定义了一个值 这是我当前的代码:使用Filter命令检查字符串是否在Excel VBA范围内,vba,excel,Vba,Excel,我正在检查一个单元格区域是否在另一个区域中定义了一个值 这是我当前的代码: Sub CheckInstallationName() Dim LastRow As Long With Worksheets(2) LastRow = .Cells(.Rows.Count, Worksheets(1).Cells(4, 3).Value).End(xlUp).Row End With Dim rngA As Range Set rngA =
Sub CheckInstallationName()
Dim LastRow As Long
With Worksheets(2)
LastRow = .Cells(.Rows.Count, Worksheets(1).Cells(4, 3).Value).End(xlUp).Row
End With
Dim rngA As Range
Set rngA = Range(Worksheets(1).Cells(4, 3).Value & "4:" & Worksheets(1).Cells(4, 3).Value & LastRow)
Dim cellA As Range
Dim InstallationNameRange As Variant
InstallationNameRange = Worksheets(1).Range("B16:B32").Value
For Each cellA In rngA
If UBound(Filter(InstallationNameRange, cellA.Value)) < 0 Then
'Some code
End If
Next cellA
End Sub
子检查InstallationName()
最后一排一样长
附工作表(2)
LastRow=.Cells(.Rows.Count,工作表(1).单元格(4,3).Value).End(xlUp).Row
以
Dim rngA As范围
设置rngA=Range(工作表(1).单元格(4,3).值和“4:”&工作表(1).单元格(4,3).值和最后一行)
暗淡的细胞范围
Dim InstallationNameRange作为变型
InstallationNameRange=工作表(1).范围(“B16:B32”).值
对于rngA中的每个细胞
如果UBound(Filter(InstallationNameRange,cellA.Value))<0,则
“一些代码
如果结束
下一单元
端接头
在
上,如果UBound(filter(InstallationNameRange,cellA.Value))<0,则会出现错误“运行时错误'13':类型不匹配”,并且找不到解决方案。这可能是一个非常小的修正。如果没有此if语句,代码将正常工作打开一个新的Excel并编写以下内容:
Public Sub CheckRangeInRange()
Dim rngA As Range
Dim rngB As Range
Dim rngCellA As Range
Dim rngCellB As Range
Dim blnError As Boolean
Set rngA = Worksheets(1).Range("A1:B10")
Set rngB = Worksheets(1).Range("D10:E20")
rngA.Interior.Color = vbYellow
rngB.Interior.Color = vbRed
For Each rngCellA In rngA
blnError = True
For Each rngCellB In rngB
If rngCellA = rngCellB Then
blnError = False
End If
Next rngCellB
If blnError Then Debug.Print "Display Error here!"
Next rngCellA
End Sub
将一些值放入A1:B10
和D10:E20
中,匹配值的地址将打印在即时窗口中。您不能在二维范围上使用过滤器
,从范围创建的任何数组都是二维的,即使是单行或列
为此,您可以使用“双重转置技巧”。请注意投票率较高的答案,而不是被接受的答案
例如:
在If
之前执行Debug.Print UBound(过滤器(InstallationNameRange,cellA.Value))
。如果它是一个错误,那么这可能是您收到的错误的原因。什么是过滤器
&它是在哪里定义的?@vityta过滤器是VBA过滤器中的标准函数(SourceArray,Match,[Include],[Compare])@RobinMackenzie在之前有一行,如果我仍然得到同样的错误,我知道你在这里试图做什么,这是我为我的代码做的第一件事,但这不会符合我的意图。当值不在数组中时,我想显示一个错误。此代码将为数组中的每一个其他值提供一个错误。@SLT-这就是VBA中有标志的原因。看编辑。啊,你是对的,像这样它会工作,但我认为罗宾·麦肯齐的解决方案计算速度更快,所以我要试试first@SLT-取决于您的目标-如果基于我的解决方案,它可以显示任何差异,而.Filter
只会告诉您是
或否
。我想您在我的代码中发现了问题,那就是Filter函数。我让你的函数工作,但我的范围是一列多行,这意味着我需要arr=Application.WorksheetFunction.Transpose(WorksheetFunction.Range(rng.Value))
对吗?但是,这一行不想用于meA singleTranspose
在该测试代码中工作,因此不确定它为什么不适用于您。但是,如果(在代码中)cellA.Value
不是InstallationNameRange
中的值,则下标将超出范围。
Option Explicit
Sub Test()
Dim rng As Range
Set rng = Sheet2.Range("C20:E20") 'a, b, c
' use the double transpose trick to convert 2-d array to 1-d array
Dim arr As Variant
arr = Application.WorksheetFunction.Transpose( _
Application.WorksheetFunction.Transpose(rng.Value))
' now Filter will work
Dim out As Variant
out = Filter(arr, "a")
Debug.Print out(0)
End Sub