[Excel-Formula] Excel: تطابق آخر حرف / سلسلة في سلسلة



Answers

ماذا عن إنشاء وظيفة مخصصة واستخدام ذلك في الصيغة الخاصة بك؟ يحتوي VBA على وظيفة InStrRev ، InStrRev ، تعمل تمامًا على ما تبحث عنه.

ضع هذا في وحدة نمطية جديدة:

Function RSearch(str As String, find As String)
    RSearch = InStrRev(str, find)
End Function

وستبدو وظيفتك هكذا (على افتراض أن السلسلة الأصلية في B1):

=LEFT(B1,RSearch(B1,"\"))
Question

هل هناك طريقة فعالة لتحديد آخر تطابق في السلسلة / السلسلة في سلسلة باستخدام وظائف أساسية؟ بمعنى آخر حرف / سلسلة من السلسلة ، ولكن موضع آخر حدث حرف / سلسلة في سلسلة. Search find العمل من اليسار إلى اليمين حتى لا أفكر في كيفية التقديم دون خوارزمية متكررة طويلة. وهذا الحل يبدو الآن بالية.




أنا متأخرة قليلاً للحزب ، لكن ربما هذا يمكن أن يساعد. كان للرابط في السؤال صيغة مشابهة ، لكن لي يستخدم عبارة IF () للتخلص من الأخطاء.

إذا لم تكن خائفاً من Ctrl + Shift + Enter ، فيمكنك القيام بذلك بشكل جيد باستخدام صيغة صفيف.

String (في الخلية A1): "one.two.three.four"

معادلة:

{=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))}  use Ctrl+Shift+Enter

النتيجة: 14

أول،

ROW($1:$99)

إرجاع صفيف من الأعداد الصحيحة من 1 إلى 99: {1,2,3,4,...,98,99} .

التالى،

MID(A1,ROW($1:$99),1)

إرجاع صفيف من سلاسل ذات طول واحد موجودة في السلسلة المستهدفة ، ثم إرجاع سلاسل فارغة بعد الوصول إلى طول السلسلة المستهدفة: {"o","n","e",".",..."u","r","","",""...}

التالى،

IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))

يقارن كل عنصر في الصفيف إلى السلسلة "." وإرجاع إما فهرس الحرف في السلسلة أو FALSE: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}

الاخير،

=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))

إرجاع القيمة القصوى للمصفوفة: 14

مزايا هذه الصيغة هي أنها قصيرة وسهلة الفهم نسبياً ولا تتطلب أي أحرف فريدة.

العيوب هي الاستخدام المطلوب Ctrl + Shift + Enter والحد على طول السلسلة. يمكن التعامل مع هذا مع وجود شكل مبين أدناه ، ولكن هذا الاختلاف يستخدم دالة OFFSET () وهي دالة متطايرة (قراءة: بطيئة).

لست متأكدا ما هي سرعة هذه الصيغة مقابل الآخرين.

الاختلافات:

=MAX((MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)=".")*ROW(OFFSET($A$1,,,LEN(A1)))) works the same way, but you don't have to worry about the length of the string

=SMALL(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd occurrence of the match

=LARGE(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd-to-last occurrence of the match

=MAX(IF(MID(I16,ROW($1:$99),2)=".t",ROW($1:$99))) matches a 2-character string **Make sure you change the last argument of the MID() function to the number of characters in the string you wish to match!



يمكنك استخدام هذه الوظيفة التي أنشأتها للعثور على آخر نسخة من سلسلة داخل سلسلة.

تأكد من أن صيغة Excel المقبولة تعمل ، ولكن من الصعب جدًا قراءتها واستخدامها. في مرحلة ما ، عليك أن تشرع في قطع أصغر حتى تكون قابلة للصيانة. وظيفتي التالية قابلة للقراءة ، ولكن هذا غير ذي صلة لأنك تسميها في صيغة باستخدام المعلمات المسماة. هذا يجعل استخدامه بسيطا.

Public Function FindLastCharOccurence(fromText As String, searchChar As String) As Integer
Dim lastOccur As Integer
lastOccur = -1
Dim i As Integer
i = 0
For i = Len(fromText) To 1 Step -1
    If Mid(fromText, i, 1) = searchChar Then
        lastOccur = i
        Exit For
    End If
Next i

FindLastCharOccurence = lastOccur
End Function

أنا استخدمه على هذا النحو:

=RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\"))



طريقة بسيطة للقيام بذلك في VBA هي:

YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))



Links