2016-04-14 22 views
0

'daki çeşitli koşullara ait arama verileri Ben Excel Çalışma Sayfası verileri içeren bir tablom var; Burada görüntünün IMAGEexcel tablosundan VBA

Ben bir işlev işlev myFunction yazıyorum bağlantısıdır Işın karşılık gelen değeri ve en son tarih için bulmalı, hangi VBA (tarih olarak dt, varyant olarak isin) verilen tarih dt (dt tarihinden sonra olmaksızın).

İşte kodun bir örneğidir.

Function myFunction(isin As Variant, dt As Date) 

Dim ws As Worksheet 
Set ws = ThisWorkbook.Worksheets("sheet1") 
Dim last_row As Integer 
last_row1 = ws.Range("A1").End(xlDown).Row 

myFunction = WorksheetFunction.VLookup(isin, ws.Range("A1:C" & last_row1), 3, False) 

End Function 

Bu Excel'in vlookup fonksiyonunu kullanır ama hedef değeri bulmalı nasıl düşünemiyorum.

+0

değerini döndürmek için bu işlevi kurdunuz senin tarih, metin olarak biçimlendirilmiş bir tarih değil, bir excel tarih seri olarak saklanır. Test etmek için isnumber() veya requestxt() kullanıyorum. –

+0

VLOOKUP'u kullanmak için, aradığınız indeks değeriniz geri dönmek istediğiniz herhangi bir verinin solunda olmalıdır. Örneğinizde tablonuzu doğru okuduğumda sağa doğru. Bu durumda INDEX() ve MATCH() bir excel formülü kullanmak isteyebilirsiniz. bununla birlikte, bunların sadece VBA ile yapılmasının daha güzel yolları olabilir. –

+0

Cevabınız için teşekkürler, excel işlevleri ile değil, vba içinde bunu yapmak için bir yol arıyorum. Bu koddaki Vlookup bir çözüm değildir. – user2728523

cevap

0

Bu kodu test etmem gerekiyor, ancak tüm bilgilerinizin nerede olduğu kavramını tanımlamanız gerekiyor. Sonra her sıraya geçin ve hangi isimlerin eşleştiğini bulun. Bir eşleşme bulduğunuzda tarihin daha yeni olup olmadığını anlamaya çalışın. Eğer daha güncelse, karşılaştırmanızı günceller ve listede bulunduğunuz yeri depolar. Listeden geçtiğinizde, sakladığınız numara için üçüncü sütunun değerini döndürün. Şimdi listede bulunmayan bir isim verilir durumunda

, emin olun, yeni başlayanlar için 0.

Option Explicit 

Function myFunction(isin As String, dt As Date) As Double 

Dim ws As Worksheet 
Dim last_row As Integer 
Dim Header_row As Integer 
Dim Name_Col As Integer 
Dim Date_Col As Integer 
Dim Value_Col As Integer 
Dim counter_X As Integer 
Dim Temp_Index As Integer 
Dim Temp_Date As Date 

    Set ws = Worksheets("Sheet1") 

    'define the your table information 
    Header_row = 1 
    last_row = ws.Range("A1").End(xlDown).Row 

    Name_Col = 1 
    Date_Col = 2 
    Value_Col = 3 

    'Initialize variables 
    Temp_Date = 0 


    With ws 
     For counter_X = Header_row + 1 To last_row 
      If .Cells(counter_X, Name_Col).Value = isin Then 
       If .Cells(counter_X, Date_Col).Value <= dt Then 
        If .Cells(counter_X, Date_Col).Value > Temp_Date Then 
         Temp_Date = .Cells(counter_X, Date_Col).Value 
         Temp_Index = counter_X 
        End If 
       End If 
      End If 
     Next counter_X 

     If Temp_Date = 0 Then 
      myFunction = 0 
     Else 
      myFunction = .Cells(Temp_Index, Value_Col).Value 
     End If 
    End With 
End Function 

Example Results

+0

Kod için teşekkürler, ancak bir hata alıyorum "_Global" nesnesinin "Method" Range "hatası" başarısız oldu. – user2728523

+0

kabul ediyorum hala test ediyorum, bir ara ölçüm olarak izleyebilmeniz için VBA kodu düzenlemede daha hızlı olmanız durumunda bir ara önlem olarak yayınladım –

+0

Tek isim için iki dizi oluşturmak ve sonra aramak için? – user2728523