Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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
使用Filter命令检查字符串是否在Excel VBA范围内_Vba_Excel - Fatal编程技术网

使用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 single
Transpose
在该测试代码中工作,因此不确定它为什么不适用于您。但是,如果(在代码中)
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