2016-04-04 18 views
0

verin. İki aralığım var (her ikisi de 2 boyutlu). R1 (H1: M4), R2'deki (A6: N15) hücrelerin birkaç olası değerinin listesini içerir. R2 boş hücreler içerebilir. R2'deki bir hücre R1'deki bir hücreyle eşleşiyorsa, son hücreyi R1'in eşleştirilen değerinde sütunda (N1: N4) çıkarmak istiyorum. I sınıfı H1 kullanıyorumBir aralıkta bir değer arayın ve başka bir aralıkla karşılaştırın. Varsa, bu değeri

IF(A6="", "Blank", 
    IFERROR(VLOOKUP(A6, $H$1:$N$4, 7,FALSE), 
    IFERROR(VLOOKUP(A6, $I$1:$N$4, 6,FALSE), 
     IFERROR(VLOOKUP(A6, $J$1:$N$4, 5,FALSE), 
     IFERROR(VLOOKUP(A6, $K$1:$N$4, 4,FALSE), 
      IFERROR(VLOOKUP(A6, $L$1:$N$4, 3,FALSE), 
      IFERROR(VLOOKUP(A6, $M$1:$N$4, 2,FALSE), 
       IFERROR(VLOOKUP(A6, $N$1:$N$4, 1,FALSE), "None")))))))) 

Not: çünkü Vlookup arasında N4

I P6 (IFERROR iç içe) aşağıdaki formülü kullanıyorum.

Bu bana bir çözüm sunuyor, ancak daha verimli bir çözüm istiyorum.

+1

[yakalayan olacaktır. Bul] (http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/)? –

+0

Muhtemelen size düşündüğünüz çözümü vermez. Bu VLOOKUP'ların her biri yalnızca G45 için H1: H4 sütununa bakacaktır. Siz sadece ** ** sütun N'den geri dönmek için gidiyoruz, asla H: M'den. – Jeeped

cevap

0

Bu yardımcı olur mu?

Sub Test() 
    Dim R1 As Variant, R2 As Variant, x As Variant, y As Variant 
    Set R1 = Range("H1:M4") 
    Set R2 = Range("A6:N15") 
    For Each x In R1 
     If x.Value = "" Then 
     GoTo skip 
     End If 

     For Each y In R2 
      If y.Value = "" Then 
       y.Offset(0, 16) = "Blank" 
      ElseIf x = y Then 
      y.Offset(0, 16) = x 
      End If 
     Next y 
skip: 
Next x 
End Sub 
+0

Bir Goto ifadesi kullanmamayı tercih ediyorum. –

0

aşağıdaki çalışır:

Sub FindMatches() 
    Dim R1 As Variant, R2 As Variant, x As Variant, y As Variant 
    Set R1 = Range("H1:M4") 
    Set R2 = Range("A6:N15") 
    For Each x In R1 
     If x.Value = "" Then 
     End If 
     For Each y In R2 
      If y.Value = "" Then 
       y.Offset(0, 16) = "Blank" 
      ElseIf x.value = y.value Then 
       y.Offset(0, 16) = x.Offset(0, 7 - x.Column) 
      End If 
     Next y 
     End If 
    Next x 
End Sub 
0

Eğer R1 ve R2

hem döngü çok daha az yinelemeleri

o ince olacağını yapar bu

Option Explicit 

Sub FindThem() 
Dim rng1 As Range, rng2 As Range, cell As Range 
Dim strng As String 
Dim i As Long, iRow As Long, nCol As Long 

Set rng1 = Range("H1:M4") 
Set rng2 = Range("A6:N15") 
nCol = rng1.Columns.Count 

For i = 1 To rng1.Rows.Count 
    strng = strng & Join(Application.Transpose(Application.Transpose(rng1.Rows(i))), "-") & "-" 
Next i 
strng = "-" & strng ' this is the string that collects all rng1 values 

For Each cell In rng2 
    i = InStr(strng, "-" & cell.Value & "-") 
    If i > 0 Then 
     iRow = Len(Left(strng, i + 1)) - Len(Replace(Left(strng, i + 1), "-", "")) ' count the "position" of the value in the string 
     cell.Offset(, 16) = rng1(Int(iRow/nCol) + IIf(iRow Mod nCol = 0, 0, 1), 7) 
    End If 
Next cell 
End Sub 

deneyebilirsiniz En hızlı hangisi olduğunu bilmek, sağlanan hızın,

ile karşılaştığınız bir sorun olduğunu tabii

, ama bu bütün olası çözümler için bir sorun, R1 değerleri farklı olmalıdır olmalıdır, aksi takdirde sadece R2 içinde ilk oluşumu (kolon satır ve sütuna göre arama sıra)