معالجة السلسلة باستخدام Excel - كيفية إزالة جزء من السلسلة في حالة وجود جزء آخر؟

StackOverflow https://stackoverflow.com/questions/263225

سؤال

لقد قمت ببعض عمليات البحث على Google، ولم أتمكن من العثور على أي شيء، على الرغم من أنني ربما أبحث في الأماكن الخاطئة.أنا أيضًا لست ماهرًا جدًا في VBA، لكنني متأكد من أنني أستطيع اكتشاف ذلك باستخدام المؤشرات الصحيحة :)

لدي سلسلة أقوم بإنشائها وهي عبارة عن سلسلة من الخلايا المختلفة، بناءً على شروط مختلفة.لقد ضربت هذه بالترتيب.

=IF(A405<>A404,G405,G405&H404)

ما أريد فعله هو الرجوع إلى قائمتي المتسلسلة، وإزالة القيمة التي تم استبدالها إذا كانت القيمة البديلة موجودة في القائمة.

على سبيل المثال، راجع القائمة التالية:

A, D, G, Y, Z

أريد إزالة D لو و فقط لو Y حاضر.

كيف سأفعل هذا؟(VBA أو داخل الخلية، على الرغم من أنني أفضّل داخل الخلية)

هل كانت مفيدة؟

المحلول 7

لقد حصلت للتو على هذا كحل ممكن عبر البريد الإلكتروني أيضًا:

=IF(A15<>A14,G15,IF(OR(AND(G15="CR247, ",ISNUMBER(FIND("CR247, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR215, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR180, ",H14))),AND(G15="CR180, ",ISNUMBER(FIND("CR215, ",H14))),G15="CR113, "),H14,G15&H14))

(يحتوي هذا على القيم "الحقيقية" مع قواعد الأسبقية)

يبدو مشابها نسبيا ل @جوزيفإجابة.

هل هناك حل أفضل؟

نصائح أخرى

يحاول:

=IF(ISERROR(FIND("Y",A1)),A1,SUBSTITUTE(A1,"D, ",""))

ولكن هذا يفترض أن لديك دائمًا الفاصلة والمسافة بعد الحرف D.

أولاً، لماذا لا تحتفظ بمصفوفة سلسلة بدلاً من ذلك أثناء تصفحك لجميع الخلايا، ثم تقوم بتسلسلها كلها في النهاية؟

بخلاف ذلك، ستستخدم دوال السلسلة مثل INSTR وMID للقيام بشيء مثل:

start1 = instr(myLongString,"Y, ")
if start1 > 0 Then
    start2 = instr(myLongString,"D, ")
    if start2 > 0 then
        newLongString = left(myLongString, start2 - 1) & _
                        mid(myLongString, start2 + 3)
    end if
end if

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

فبا :يمكنك دائمًا استخدام كائن regexp.أعتقد أن هذا يمنحك القدرة على اختبار أي شيء في البرنامج النصي الخاص بك طالما قمت ببناء التعبير العادي بشكل صحيح.

الدفع : http://msdn.microsoft.com/en-us/library/yab2dx62(VS.85).aspx (للرجوع إليها regexp)
وأداة بسيطة لاختبار التعبيرات العادية الخاصة بك: http://www.codehouse.com/webmaster_tools/regex/

في الخلية:يمكنك القيام بذلك بطريقة أكثر ودية:
لنفترض في العمود A:A أن لديك القيم.
يمكنك إضافة عمود جديد حيث تقوم بإجراء الفحص
if(indirect("A"&row()) <> indirect("A"&row()-1), indirect("G"&row()), indirect("G"&row())& indirect("H"&row()))
أو مهما كانت القيم.ومع ذلك، أعتقد أن القيمة يجب أن تكون فارغة في أحد فروع عبارة if.بعد ذلك تقوم بتسلسل قيم العمود B:B فقط (تخطي الفراغات إذا لزم الأمر).

أتمنى أن يساعدك هذا.

ربما يكون من الأسهل البدء من النهاية، وإجراء الإضافات إلى بداية السلسلة، وإضافة D فقط في حالة عدم وجود Y.

أعتقد أن D يمكن أن يظهر في أي مكان، فماذا عن:

If InStr(strString, "Y") > 0 Then
   strString = Replace(strString, "d", "")
   strString = Replace(strString, "  ", "")
   strString = Replace(strString, " ,", "")
   strString = Replace(strString, ",,", ",")
End If

إذا لم يكن هناك عدد كبير جدًا من هذه المجموعات التي تريد إزالتها، فيمكنك استخدام =IF(FIND("D";أ2)> 0؛استبدال(A2;1;3;"");A2).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top