Farklı tablolardaki verileri birleştirmemize yardımcı olan iyi bilinen VLOOKUP() işlevini hepimiz biliyoruz. Ancak bu işlevin önemli bir dezavantajı vardır - benzer değerleri birleştiremez, yani kelimede bir hata varsa eşleşme olmaz.
Yaklaşık değerleri birleştirebilmek için kendi fonksiyonumuzu oluşturabiliriz. Buna FuzzyLokup() adını verelim.
İki listemiz olduğunu düşünelim. Her ikisi de yaklaşık olarak aynı öğelere sahiptir, ancak biraz farklı yazılabilirler. Görev, birinci listedeki her öğe için ikinci listedeki en benzer öğeyi bulmaktır; En yakın maksimum benzer metin için bir arama uygulayın.
Bu durumda asıl soru "benzerlik" kriterinin ne olduğudur. Sadece eşleşen karakterlerin sayısı mı? Ardışık maç sayısı mı? Karakter büyük/küçük harf veya boşluklar dikkate alınmalı mıdır? Bir cümledeki kelimelerin farklı düzenlemeleriyle ne yapmalı? Pek çok seçenek var ve tek bir çözüm yok; her durum için biri veya diğeri diğerlerinden daha iyi olacaktır.
Bizim durumumuzda, en basit seçeneği uyguluyoruz - maksimum karakter eşleşmesi sayısına göre arama yapın. Mükemmel değil ama çoğu durumda oldukça iyi çalışıyor.
Eklemek işlev FuzzyLokup , menüyü aç Tools - Macros - Edit Macros... , seçme Module1 ve aşağıdaki metni modüle kopyalayın:
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String ' moonexcel.com.ua Dim Str As String Dim CellArray As Variant Dim StrArray As Variant If IsMissing(SimThreshold) Then SimThreshold = 0 Str = LCase(LookupValue) StrArray = Split(Str) StrExt = UBound(StrArray) For Each Cell In SrcTable CellArray = Split(LCase(Cell)) CellExt = UBound(CellArray) CellRate = 0 ' Arama ifadesindeki her kelimeyi kontrol ediyoruz For x = 0 To StrExt StrWord = StrArray(x) If Len(StrWord) = 0 Then GoTo continue_x MaxStrWordRate = 0 ' Bir sonraki hücredeki her kelimeyi orijinal değerler tablosundan kontrol ediyoruz For i = 0 To CellExt CellWord = CellArray(i) If Len(CellWord) = 0 Then GoTo continue_i FindCharNum = OccurrenceNum(StrWord, CellWord) StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord)) If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate continue_i: Next i CellRate = CellRate + MaxStrWordRate continue_x: Next x ' En iyi maçı koruyoruz If CellRate > MaxCellRate Then MaxCellRate = CellRate BestCell = Cell FindCharNum = OccurrenceNum(Str, Cell) SimRate = FindCharNum / Max(Len(Str),Len(Cell)) End If Next Cell IF SimRate >= SimThreshold Then IF SimThreshold = -1 Then ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")" ElseIf SimThreshold = -2 Then ReturnValue = Format(SimRate, "0.00") Else ReturnValue = BestCell End If Else ReturnValue = "" End If FuzzyLOOKUP = ReturnValue End Function Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String) For i = 1 To Len(SourceString) ' Her sembolün oluşumunu arıyoruz Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1) ' Tesadüf sayacını artırıyoruz If Position > 0 Then Count = Count + 1 ' Bulunan sembolü kaldır TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position) End If Next i OccurrenceNum = Count End Function Function Max(ByVal value1 As Variant, ByVal value2 As Variant) If value1 > value2 Then Result = value1 Else Result = value2 End If Max = Result End Function
Sonraki, kapat Macro Editor ve çalışma sayfasına geri dönün LibreOffice Calc - artık yeni özelliğimizi kullanabilirsiniz FuzzyLokup() .
Bu özelliği de kullanabilirsiniz FUZZYLOOKUP() ücretsiz uzantıyı yükleyerek YouLibreCalc.oxt veya tam özellikli sürümü YLC_Utilities.oxt .
Bundan sonra bu fonksiyon LibreOffice Calc'de açılacak tüm dosyalarda mevcut olacaktır.