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

Rusty فهرستی از کدهای پستی را در ستونی از یک کاربرگ دارد. او می خواهد راهی برای "فشرده کردن" کدها به گونه ای که محدوده های متوالی مقادیر در یک ردیف قرار گیرند. بنابراین، به عنوان مثال، به جای اینکه 35013، 35014، و 35015 سه ردیف را بگیرند، در یک ردیف به عنوان 35013-35015 ظاهر می شوند.

چند راه برای انجام این کار وجود دارد - با یا بدون ماکرو. در سمت "بدون ماکرو" حصار، تعدادی رویکرد مختلف وجود دارد، و همه آنها شامل استفاده از ستون های اضافی برای نگه داشتن نتایج میانی است.

به عنوان مثال، فرض کنید که داده های خود را در ستون A دارید که از سلول A2 شروع می شود و سلول A1 خالی است (حتی متن سرصفحه در آن وجود ندارد). در این حالت می توانید فرمول زیر را در سلول B2 وارد کنید:

=IF(NOT(A2-A1=1),A2,IF(A3-A2=1,B1,A2)) 

سپس در سلول C2 فرمول طولانی زیر را وارد کنید:

=IF(NOT(A3-A2=1),IF(A2-A1=1,TEXT(B1,"00000")
&" - "&TEXT(B2,"00000"),TEXT(A2,"00000")),"")

اکنون می توانید فرمول های سلول های B2:C2 را در ستون های مربوطه کپی کنید. آنچه در ستون C به دست می آورید، سری فشرده کدهای پستی است. می توانید این مقادیر را - با استفاده از Paste Special برای نادیده گرفتن سلول های خالی - در هر جای دیگری که می خواهید کپی کنید.

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

Sub CombineValues()
    Dim rng As Range
    Dim rCell As Range
    Dim sNewArray() As String
    Dim x As Long
    Dim y As Long
    Dim sStart As String
    Dim sEnd As String

    Set rng = Selection
    sStart = rng.Cells(1)
    sEnd = sStart
    y = 1
    For x = 1 To rng.Count - 1
        If rng.Cells(x + 1) - _
          rng.Cells(x) > 1 Then  End
            ReDim Preserve sNewArray(1 To y)
            If sStart = sEnd Then
                sNewArray(y) = sStart
            Else
                sNewArray(y) = sStart & "-" & sEnd
            End If
            sStart = rng.Cells(x + 1)
            y = y + 1
        End If
        sEnd = rng.Cells(x + 1)
        ReDim Preserve sNewArray(1 To y)
        If sStart = sEnd Then
            sNewArray(y) = sStart
        Else
            sNewArray(y) = sStart & "-" & sEnd
         End If
    Next
    rng.ClearContents
    For x = 1 To y
        rng.Cells(x) = "" & sNewArray(x)
    Next
    Set rng = Nothing
    Set rCell = Nothing
End Sub
اگر خواستی، با این لینک از ما حمایت کن

پاسخ شما

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

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

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

سوالات مشابه

برای دسترسی راحت به مطالب سایت ، اپلیکیشن سایت را نصب کنید
و لطفا بعد از نصب امتیاز دهید. با تشکر از حمایت شما
0 دوستدار 0 امتیاز منفی
0 پاسخ 34 visibility
0 دوستدار 0 امتیاز منفی
0 پاسخ 27 visibility
0 دوستدار 0 امتیاز منفی
0 پاسخ 128 visibility
0 دوستدار 0 امتیاز منفی
0 پاسخ 26 visibility
0 دوستدار 0 امتیاز منفی
0 پاسخ 27 visibility

24.3k سوال

9.6k پاسخ

614 دیدگاه

11.2k کاربر

380 نفر آنلاین
0 عضو و 380 مهمان در سایت حاضرند
بازدید امروز: 18460
بازدید دیروز: 53446
بازدید کل: 20409206
...