نعلم جميعًا الدالة VLOOKUP() المعروفة التي تساعدنا على دمج البيانات من جداول مختلفة. ومع ذلك، فإن هذه الوظيفة لها عيب واحد مهم - لا يمكنها الجمع بين قيم متشابهة، أي إذا كان هناك خطأ في الكلمة، فلن يكون هناك تطابق.
لكي نتمكن من الجمع بين القيم التقريبية، يمكننا إنشاء دالتنا الخاصة. دعنا نسميها FuzzyLookup().
لنتخيل أن لدينا قائمتين. كلاهما يحتويان على نفس العناصر تقريبًا، لكن قد تتم كتابتهما بشكل مختلف قليلاً. وتتمثل المهمة في العثور على العنصر الأكثر تشابهاً من القائمة الثانية لكل عنصر في القائمة الأولى، أي. تنفيذ بحث عن أقرب نص مماثل إلى أقصى حد.
والسؤال الكبير في هذه الحالة هو ما الذي يجب أخذه بعين الاعتبار معيار "التشابه". فقط عدد الأحرف المطابقة؟ هل عدد المباريات المتتالية ؟ هل يجب مراعاة حالة الأحرف أو المسافات؟ ماذا تفعل مع ترتيب مختلف للكلمات في العبارة؟ هناك العديد من الخيارات ولا يوجد حل واحد - لكل موقف سيكون أحدهما أفضل من الآخر.
في حالتنا، نقوم بتنفيذ الخيار الأبسط - البحث حسب الحد الأقصى لعدد تطابقات الأحرف. إنها ليست مثالية، ولكنها تعمل بشكل جيد في معظم المواقف.
لإضافة الدالة FuzzyLookup ، افتح القائمة Tools - Macros - Edit Macros... ، يختار Module1 وانسخ النص التالي إلى الوحدة:
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 ' نتحقق من كل كلمة في عبارة البحث For x = 0 To StrExt StrWord = StrArray(x) If Len(StrWord) = 0 Then GoTo continue_x MaxStrWordRate = 0 ' نتحقق من كل كلمة في الخلية التالية من جدول القيم الأصلي 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 ' نحن نحافظ على أفضل مباراة 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) ' نحن نبحث عن حدوث كل رمز Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1) ' نحن نزيد من عداد الصدف If Position > 0 Then Count = Count + 1 ' قم بإزالة الرمز الموجود 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
التالي، إغلاق Macro Editor والعودة إلى ورقة العمل LibreOffice Cac - الآن يمكنك استخدام ميزتنا الجديدة FuzzyLookup() .
يمكنك أيضًا استخدام الميزة FUZZYLOOKUP() عن طريق تثبيت الامتداد المجاني YouLibreCalc.oxt أو نسخته كاملة المواصفات YLC_Utilities.oxt .
بعد ذلك ستكون هذه الوظيفة متاحة في كافة الملفات التي سيتم فتحها في LibreOffice Calc.