2017-10-05 99 views
2

我试着去检查,如果单元格区域各有另一范围内检查字符串是在范围内的Excel VBA与筛选命令

这是我当前的代码中定义的值:

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 

If UBound(filter(InstallationNameRange, cellA.Value)) < 0 Then我收到错误“运行时错误'13':类型不匹配”,找不到解决方案。可能它是一个非常小的修复。如果没有这个if语句代码工作

+1

做'Debug.Print UBound函数(过滤(InstallationNameRange,cellA.Value))''的前If'。如果它是一个错误,那么这就是你所得到的错误的可能原因。 –

+0

什么是“过滤器”,它在哪里定义? – Vityata

+3

@Vityata过滤器是VBA过滤器中的标准函数(SourceArray,Match,[Include],[Compare])https://msdn.microsoft.com/en-us/library/fat7fw0s(v=vs.90).aspx – SLT

回答

1

打开一个新的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:B10D10:E20和匹配值的地址将在即时窗口打印。

+0

我看到你在这里试图做什么,这是我为我的代码做的第一件事,但是这对我的意图不起作用。当数值不在数组中时,我想显示一个错误。此代码将为数组中的每个其他值提供一个错误。 – SLT

+0

@SLT - 这就是为什么VBA中有标志。查看编辑。 – Vityata

+0

啊,你是对的,就像这样它会工作,但我认为对于大范围Robin Mackenzie的解决方案计算速度更快,所以我将首先尝试 – SLT

1

您不能在2-d范围内使用Filter,并且从Range创建的任何数组都是2-d,即使它是单行或列。

您可以使用'双Transpose特技`这个question。请注意高票通过的答案,而不是接受的答案。

例如为:

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 
+0

我想你在我的代码中发现了问题,它是Filter函数。我有你的函数工作,但我的范围是1行与多行,所以这意味着我需要'arr = Application.WorksheetFunction.Transpose(WorksheetFunction.Range(rng.Value))'对吗?但是,这行不想为我工作 – SLT

+0

单个'Tranpose'在测试代码中工作,所以不知道为什么它不适合你。但是,如果(在您的代码中)'cellA.Value'不是'InstallationNameRange'中的值,您将会得到下标超出范围。 –