Aynı arama değerine (birincil anahtar) sahip birden çok veri satırı için Excel'de bir Vlookup gerçekleştirin


1

Aynı birincil anahtar için birden çok satırı olan Adlar için bir Vlookup yapmak istiyorum:

Deal ID (Primary Key) | Name
437                   | Tom Jones
437                   | Frank Thomas
437                   | Mary Smith

Vlookup, kayıttaki yalnızca 1. Adı döndürecektir (Tom Jones). Şöyle görünmesini istiyorum: Tom Jones, Frank Thomas, Mary Smith hepsi aynı çizgide.

Yanıtlar:


1

Excel'i ilişkisel bir veritabanı olarak kullanmaya çalışıyorsunuz, ki o kadar da iyi değil. Her şeyden önce, son yıllarda bir değişiklik olmadıkça (Excel 2010'dan sonra bir şey kullanmaktan zevk almadım), bir aralığı veya diziyi sınırlandırılmış bir dizeye dönüştürecek bir çalışma sayfası işlevi yoktur. Bunu yapan bir VBA çalışma sayfası işlevi ile gelmeniz gerekecek.

İstediğinizi yapmak için dizi formülü ve VBA kombinasyonunu kullanabilirsiniz. Daha ileri gitmeden önce, kendiniz düzenli olarak böyle şeyler yaparken bulursanız, gerçek bir veritabanı programı kullanmanızı şiddetle tavsiye ederim. Excel'i geçmişte basit ilişkisel-veritabanı benzeri görevler yapmakla kötüye kullandım, ama sadece basit olanları. Daha karmaşık bir şey yapmam gerekse son derece acı verici olurdu.

Aramak için kimliğinizin hücre içinde olduğunu F1ve tablonuzun çağrıldığını varsayarak Table1, aşağıdakileri bir dizi formülü olarak girersiniz (enter yerine control-shift-enter kullanın). SimpleCatVBA birleştirme çalışma sayfanızın işlevidir.

=SimpleCat(IF(Table1[Deal ID (Primary Key)]=$F$1, Table1[Name], ""))

SimpleCatBu özel örnek için işe yarayacak A şudur:

Function SimpleCat(Args() As Variant) As Variant
    Dim a As Variant
    SimpleCat = ""
    For Each a In Args
        If a <> "" Then SimpleCat = SimpleCat & a & ", "
    Next
    If Len(SimpleCat) > 0 Then SimpleCat = Left$(SimpleCat, Len(SimpleCat) - 2)
End Function

SimpleCatDaha genel özellikli genel bir birleştirme işlevine sahip olmak, herhangi birinin araç kutusunda faydalı olduğundan, daha genel bir hale getirmek için genişlemenizi sizin için bir egzersiz olarak bırakıyorum .

Açıklama:

Bir dizi formülü olarak değerlendirildiğinde, tüm tablo sütununu tek bir değerle karşılaştırmak bir TRUEs ve FALSEs dizisi oluşturur . Bir IFwill kullanarak yeni bir dizi inşa eder, değerleri gerçek tarafta kullanıyorsanız değerde kullandığınız dizinin doğru konumundan çeker IFve yanlış dizede kullanıyorsanız boş dize doldurursunuz IF. SimpleCatFonksiyon aralarında virgül ile birlikte bu yeni dizide tüm boş olmayan değerler koyar.


0

İki problem. İlk olarak, bu birincil anahtar değil; ikincisi, Excel'de takip ettiğiniz sonucu verecek sonuçta yerleşik bir işlev yoktur.

Birincil Anahtar, tek bir kayda bağlı olan ve hiçbir zaman tekrarlanmayan benzersiz bir tanımlayıcı olmalıdır. Excel'deki Arama işlevlerinin çoğunun çalışması için tasarlanan şey budur, bu nedenle bir eşleşme bulduklarında dururlar - bir eşleşme bulunmuşsa, her seferinde tüm aralığa bakmak zorunda kalmamaları için kaynakları kurtarır.

Burada aradığınız birleştirmeyi yapmanın tek yolu, birden çok değeri tek bir dizgeye çekerek makro veya özel bir işlev kullanmak olacaktır. Tam olarak ihtiyacınız olan kod, peşinde olduğunuz kesin sonuçlara bağlı olacaktır ve bu cevabın kapsamı dışında, korkarım.


0

Bu işlevi alırdım ...

Function ConcatRange(inputRange As Range, Optional delimiter As String) As String
    Dim oneCell As Range
    Dim usedRange As Range

    Set usedRange = Application.Intersect(inputRange.Parent.usedRange, inputRange.Cells)
    If Not (usedRange Is Nothing) Then
        For Each oneCell In usedRange
            If oneCell.Text <> vbNullString Then
                ConcatRange = ConcatRange & delimiter & Trim(oneCell.Text)
            End If
        Next oneCell
        ConcatRange = Mid(ConcatRange, Len(delimiter) + 1)
    End If
End Function

ve şöyle bir şey olacak yeni bir işlev yapmak için değiştirin:

Function ConcatIf(KeyRange as Range, KeyValue as Variant, DataColumnOffset As Integer)

KeyRange içindeki her bir hücreye gireceği ve sadece değeri KeyValue'ye eşitse, değeri oneCell.Offset(0, DataColumnOffset)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.