2017-10-05 103 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'中的值,您將會得到下標超出範圍。 –