ایجاد سوال
dark_mode
0 دوستدار 0 امتیاز منفی
17 visibility
موضوع: آفیس توسط:

مارتی یک کاربرگ با یک سری طولانی از اعداد در ستون A دارد. اینها شامل حروف و اعداد مانند A123BC، AB123C و غیره است. مارتی می خواهد داده ها را به سه ستون تقسیم کند، به طوری که متن قبل از اعداد در یک ستون باشد. ستون، اعداد در ستون دوم و متن بعد از اعداد در سوم.

عاملی که تقسیم شماره قطعه به بخش ها را پیچیده می کند این است که طول مشخصی برای هر جزء از شماره قطعه ترکیبی وجود ندارد. اگر طول مؤلفه ها استاندارد بود، می توانید از تابع Text to Columns در اکسل استفاده کنید. از آنجایی که آنها وجود ندارند و هیچ مرزبندی بین اجزا وجود ندارد، پس این راه بالقوه برای یک راه حل بسته است.

اگر می خواهید از فرمول هایی برای جدا کردن شماره های قطعه استفاده کنید، به سه عدد از آنها نیاز دارید، یکی برای هر جزء که می خواهید استخراج کنید. با فرض اینکه شماره قسمت ها از الگوی مشخص شده (متن، ارقام، متن) پیروی می کنند و شماره قسمت اول در سلول A1 است، می توانید از موارد زیر در سلول B1 استفاده کنید:

=LEFT(A1,MATCH(FALSE,ISERROR(1*MID(A1,ROW(INDIRECT("1:100")),1)),0)-1)

این باید به عنوان یک فرمول آرایه وارد شود، به این معنی که باید آن را با استفاده از Ctrl+Shift+Enter وارد کنید . فرمول اولین رقم عددی را در شماره قطعه پیدا می کند و سپس همه چیز قبل از آن رقم را برمی گرداند. روی هر قسمتی که طول آن بیش از 100 کاراکتر نباشد کار می کند.

برای استخراج جزء دوم قطعه نامبر می توانید فرمول زیر را در سلول C1 قرار دهید:

=MID(A1,MATCH(FALSE,ISERROR(1*MID(A1,ROW(INDIRECT("1:100")),
1)),0),COUNT(1*MID(A1,ROW(INDIRECT("1:100")),1)))

باز هم، این یک فرمول واحد است و باید به عنوان یک فرمول آرایه ( Ctrl+Shift+Enter ) وارد شود تا بتواند روی هر کاراکتر در شماره قطعه اصلی کار کند. شماره قطعه را بررسی می کند و نقطه شروع ارقام را تعیین می کند و سپس تمام آن ارقام را استخراج می کند. یک رشته متنی را برمی گرداند، حتی اگر آن رشته از ارقام تشکیل شده باشد. اگر می خواهید در واقع به عنوان یک عدد در نظر گرفته شود (البته که از شر صفرهای ابتدایی خلاص می شود)، باید کل فرمول را در یک تابع Value محصور کنید، همانطور که در اینجا نشان داده شده است:

=VALUE(MID(A1,MATCH(FALSE,ISERROR(1*MID(A1,ROW(INDIRECT("1:100")),
1)),0),COUNT(1*MID(A1,ROW(INDIRECT("1:100")),1))))

برای به دست آوردن آخرین مولفه شماره قطعه، باید از فرمول زیر استفاده کنید که دوباره به عنوان فرمول آرایه وارد شده است:

=MID(A1,MATCH(FALSE,ISERROR(1*MID(A1,ROW(INDIRECT("1:100")),
1)),0)+COUNT(1*MID(A1,ROW(INDIRECT("1:100")),1)),100)

در حالی که این روش بسیار خوب کار می کند، فرمول های آرایه به طور مشخصی محاسباتی فشرده هستند، به خصوص زمانی که تعداد زیادی از فرمول ها را در کاربرگ خود دارید. اگر شما نیاز به جداسازی هزاران شماره قسمت دارید، به این معنی است که در نهایت با 3000 فرمول آرایه مواجه می شوید که می تواند در محاسبه مجدد بسیار بسیار کند باشد.

اگر در این موقعیت قرار گرفتید، ممکن است بخواهید از یک ماکرو برای جدا کردن شماره های قطعه استفاده کنید. ماکرو زیر باید روی شماره های قسمتی کار کند که از الگوی متن، اعداد، متن پیروی می کنند، همانطور که قبلاً توضیح داده شد.

Sub Split1()
    Dim C As Range
    Dim sNew As New
    Dim i As Integer
    
    For Each C In Selection
        sNew = ""
        i = 1

         Get first part, which is text
        Do While IsNumeric(Mid(C, i, 1)) = False
            sNew = sNew & Mid(C, i, 1)

            i = i + 1
            If i > Len(C) Then Exit Do
        Loop
        C.Offset(0, 1).Value = sNew

         Pull next part, which should be digits
        sNew = ""
        Do While IsNumeric(Mid(C, i, 1)) = True
            sNew = sNew & Mid(C, i, 1)

            i = i + 1
            If i > Len(C) Then Exit Do
        Loop
        C.Offset(0, 2).Value = sNew

         Use rest of original cell
        sNew = Mid(C, i, Len(C))
        C.Offset(0, 3).Value = sNew
    Next C
End Sub

برای استفاده از ماکرو، کافی است تعدادی از شماره های قطعه را انتخاب کرده و آن را اجرا کنید. ماکرو از مفهوم جستجوی تغییرات بین مقادیر عددی/غیر عددی در رشته ای از کاراکترها در سلول استفاده می کند. هنگامی که به یکی از این مرزها رسید، بخشی از رشته اصلی قبل از مرز در یک سلول جدید قرار می گیرد. این مفهوم را می توان کمی کوتاه کرد، همانطور که در مثال زیر انجام شده است.

Sub Split2()
    Dim C As Range
    Dim j As Integer
    Dim k As Integer

    For Each C In Selection
        j = 1
        Do While Not (IsNumeric(Mid(C.Value, j, 1))) And j 

The difference between this version of the macro and the previous one, of course, is that this version steps through the original cell and determines the boundaries all at once. When they are known, then the components of the original part number are stuffed into the cells.

An interesting approach to pulling apart the part numbers is to use a couple of short user-defined functions that determine where the boundaries are between the components. Consider the following two functions:

Function pNumber(X)
    i = 1
    Do Until Mid(X, i, 1) Like "#": i = i + 1: Loop
    pNumber = i
End Function
Function pAlpha(X)
    X = UCase(X)
    i = pNumber(X)
    Do Until Mid(X, i, 1) Like "[A-Z]": i = i + 1: Loop
    pAlpha = i
End Function

These are much shorter than the previous macros, and all they do is return the boundary where the numbers start (in the case of pNumber) and the boundary where the second group of text starts (in the case of pAlpha). To use the functions, you use the following three formulas to return, respectively, the first, second, and third components of the original part number:

=MID(A1,1,pNumber(A1)-1)
=MID(A1,pNumber(A1),pAlpha(A1)-pNumber(A1))
=MID(A1,pAlpha(A1),LEN(A1)-pAlpha(A1)+1)
اگر خواستی، با این لینک از ما حمایت کن

پاسخ شما

looks_5نام شما برای نمایش - اختیاری
حریم شخصی : آدرس ایمیل شما محفوظ میماند و برای استفاده های تجاری و تبلیغاتی به کار نمی رود
عدد چهار رقمی در تصویر را وارد کنید

برای جلوگیری از این تایید در آینده, لطفا وارد شده یا ثبت نام کنید.
اگر حساب گوگل دارید به راحتی وارید شوید

0 پاسخ وجود دارد

سوالات مشابه

برای دسترسی راحت به مطالب سایت ، اپلیکیشن سایت را نصب کنید
و لطفا بعد از نصب امتیاز دهید. با تشکر از حمایت شما
0 دوستدار 0 امتیاز منفی
0 پاسخ 38 visibility
0 دوستدار 0 امتیاز منفی
0 پاسخ 22 visibility
0 دوستدار 0 امتیاز منفی
0 پاسخ 50 visibility
ارسال شده در 27 تیر 1402 موضوع: آفیس توسط: Admin
0 دوستدار 0 امتیاز منفی
0 پاسخ 35 visibility

23.7k سوال

9.0k پاسخ

614 دیدگاه

11.2k کاربر

230 نفر آنلاین
0 عضو و 230 مهمان در سایت حاضرند
بازدید امروز: 12330
بازدید دیروز: 17853
بازدید کل: 20324514
...