ویرایش یک ماکرو

Collapse
X
 
  • زمان
  • نمایش
حذف همه
new posts
  • master

    • 2010/07/18
    • 118

    ویرایش یک ماکرو

    با سلام
    من پیرینت بانک رو هر ماه اینترنتی میگم و بعد از یه سری تغییرات چاپ میکنم چون هر ماه تغییرات تکراری بود یه بار زدم کارایی که میکنم به صورت ماکرو ضبط بشه و بعد هر ماه ماکرو رو اجرا میکنم اما یه جاش گیر کردم
    یه تغییراتی که میدم ی ستون هست که تراکنشها داخلش هست واریز ها مثبت هستن و برداشت ها منفی
    من میخوام اینا از هم جدا بشن چیزی که به ذهنم میرسید اول ستون رو سورت میکردم بعد یه ستون کنار این ستون باز میکردم عدد منفی ها رو میبردم اون ستون و از این ستون هم پاک میکردم و دوباره پیرینت رو براسا شماره ردیفش سورت میکردم اینجوری مشکلم حل میشد اما توی ماکرو این دیگه جوابگو نیست چون هر ماه تعداد تراکنش ها متفاوت هست اینجوری الان مقلا من از خونه c1 تا c30 رو کپی میکردم و میبردم خونه کناری و بعدش هم از اینجا پاک میکردم ولی همیشه که c1 تا c30 نیست چطوری میشه این مشکل رو حل کرد؟ یعنی ماکرو رو ویرایش کنم که بهجای اینکه c1 تا c30 کپی کنه c1 تا اخرین سلولی که عدد منفی داره رو کپی کنه (یا مثلا اصلا بدون مرتب سازی کد بنویسم که کل ستون c رو پیماش کنه هر خونه ای عدد منفی داره رو کپی کنه ببره خونه متناظرش رد ستون b و از ستون c هم پاک کنه)
    نمیدونم منظورم رو رسوندم یا نه
    با تشکر
  • Javid Mokhtari
    مدير تالار ويژوال بيسيك

    • 2012/01/16
    • 1212
    • 73.00

    #2
    با سلام.
    به روش های مختلف میشه جواب داد.
    کد PHP:
    a:
    For 
    3 To Sheet1.Range("a100000").End(xlUp).Row
        
    If Cells(i1) < 0 Then
            Sheet1
    .Range("b100000").End(xlUp).Offset(10).Value Cells(i1)
            
    Cells(i1).Delete Shift:=xlUp
            
    GoTo a:
        
    End If
    Next i 
    فایل های پیوست شده
    [FONT=Tahoma][INDENT][CENTER][SIZE=3][FONT=courier new][B][FONT=comic sans ms][SIZE=3][FONT=arial]دوره های آموزش رایگان اکسل از صفر تا پیشرفته بصورت تصویری
    بیش از [COLOR=#008000]60[/COLOR] جلسه آموزش ویدئویی رایگان

    شرکت در دوره:
    [/FONT][/SIZE]
    [SIZE=5] [FONT=Tahoma][FONT=courier new][B][URL]https://javidsoft.ir/courses/[/URL][/B][/FONT][/FONT][/SIZE][/FONT]
    [/B][/FONT][/SIZE]
    [/CENTER]
    [/INDENT]
    [/FONT]

    کامنت

    • master

      • 2010/07/18
      • 118

      #3
      اقا ممنون فقط یه جای کار ایراد داره
      فرض کن ستون به این شکل هست:
      کد:
      http://www.upload7.ir/imgs/2014-08/44642153679922083484.jpg
      من میخوام بعدش این شکلی بشه:
      کد:
      http://www.upload7.ir/imgs/2014-08/29957976715496481537.jpg
      یعنی در واقع نمیخوام سلولهای دارای مقادیر منفی حذف بشن بلکه مخوام پاک بشه والبته قبلش بره خونه متناظرش در ستون کناریش
      ضمنا اگه قرار باشه به جای منفی و مثب از رنگ استفاده کنیم کد چه تغییری میکنه؟(فرض مثبت ها رنگ قرمز و منفی ها ابی هستن)
      با تشکر

      کامنت

      • Javid Mokhtari
        مدير تالار ويژوال بيسيك

        • 2012/01/16
        • 1212
        • 73.00

        #4
        نوشته اصلی توسط master
        اقا ممنون فقط یه جای کار ایراد داره

        یعنی در واقع نمیخوام سلولهای دارای مقادیر منفی حذف بشن بلکه مخوام پاک بشه والبته قبلش بره خونه متناظرش در ستون کناریش
        ضمنا اگه قرار باشه به جای منفی و مثب از رنگ استفاده کنیم کد چه تغییری میکنه؟(فرض مثبت ها رنگ قرمز و منفی ها ابی هستن)
        با تشکر
        میشه کد رو به شکل زیر تغییر داد:
        کد PHP:
        For 3 To Sheet1.Range("a100000").End(xlUp).Row
            
        If Cells(i1) < 0 Then
                Cells
        (i2) = Cells(i1)
                
        Cells(i1) = ""
            
        End If
        Next i 
        و برای تعیین رنگ برای اعداد مثبت و منفی می توان از کاندشینال فرمتینگ استفاده کرد(داخل فایل پیوستی هست)
        فایل های پیوست شده
        [FONT=Tahoma][INDENT][CENTER][SIZE=3][FONT=courier new][B][FONT=comic sans ms][SIZE=3][FONT=arial]دوره های آموزش رایگان اکسل از صفر تا پیشرفته بصورت تصویری
        بیش از [COLOR=#008000]60[/COLOR] جلسه آموزش ویدئویی رایگان

        شرکت در دوره:
        [/FONT][/SIZE]
        [SIZE=5] [FONT=Tahoma][FONT=courier new][B][URL]https://javidsoft.ir/courses/[/URL][/B][/FONT][/FONT][/SIZE][/FONT]
        [/B][/FONT][/SIZE]
        [/CENTER]
        [/INDENT]
        [/FONT]

        کامنت

        • master

          • 2010/07/18
          • 118

          #5
          سلام
          اگه میشه توضیح بدید شرط اتمام حلقه for چی هست؟
          من با توجه به فایل خودم کد رو به این شکل تغییر دادم:
          کد PHP:
          For 1 To Sheet1.Range("a100000").End(xlUp).Row
              
          If Cells(i3) < 0 Then
                  Cells
          (i2) = Cells(i3)
                  
          Cells(i3) = ""
              
          End If
          Next i 
          منتها فقط خونه اول رو جابجا میکنه و دیگه ادامه نمیده
          ستون c من ستونی هست که اعداد مثبت و منفی داخلش هست و ستون b ستونی هست که قراره اعداد منفی داخلش بره و در شروع خالی هست
          من چون زیاد از شرط خاتمه سر در نمیوردم گفتم شاید a100000 باید c100000 بشه اون رو هم انجام دادم درست نشد
          ممنون خط اول رو کامل توضیح بدید
          ضمنا منظور من از رنگ قرمز و ابی این بود که ستون اعداد به جای اینکه منفی و مثبت باشن همه مثبت هستن ولی در رنگ قرمز و ابی هستن و اعداد رنگ قرمز نماینده اعداد منفی هستن (در واقع میخوام تو حلقه if چک کنه اگه قرمز هست جابجا کنه ولی اگه ابی هست هیچ کاری کنه)
          با تشکر

          کامنت

          • Javid Mokhtari
            مدير تالار ويژوال بيسيك

            • 2012/01/16
            • 1212
            • 73.00

            #6
            نوشته اصلی توسط master
            سلام
            اگه میشه توضیح بدید شرط اتمام حلقه for چی هست؟
            من با توجه به فایل خودم کد رو به این شکل تغییر دادم:
            کد PHP:
            For 1 To Sheet1.Range("a100000").End(xlUp).Row
                
            If Cells(i3) < 0 Then
                    Cells
            (i2) = Cells(i3)
                    
            Cells(i3) = ""
                
            End If
            Next i 
            منتها فقط خونه اول رو جابجا میکنه و دیگه ادامه نمیده
            ستون c من ستونی هست که اعداد مثبت و منفی داخلش هست و ستون b ستونی هست که قراره اعداد منفی داخلش بره و در شروع خالی هست
            من چون زیاد از شرط خاتمه سر در نمیوردم گفتم شاید a100000 باید c100000 بشه اون رو هم انجام دادم درست نشد
            ممنون خط اول رو کامل توضیح بدید
            ضمنا منظور من از رنگ قرمز و ابی این بود که ستون اعداد به جای اینکه منفی و مثبت باشن همه مثبت هستن ولی در رنگ قرمز و ابی هستن و اعداد رنگ قرمز نماینده اعداد منفی هستن (در واقع میخوام تو حلقه if چک کنه اگه قرمز هست جابجا کنه ولی اگه ابی هست هیچ کاری کنه)
            با تشکر
            تو Sheet1.Range("a100000") حرف a ستون اعدادی است که اعداد اولیه در ان قرار دارد که در اینجا ستون اعداد اولیه شما c هستش که باید تغییر بدین.
            میشه فایلتون رو بذارین که رو اون کار کنیم.بعد بریم سراغ توضیح کدها.

            برای آشنائی با کدها میتونین به پست زیر مراجعه کنین.
            Last edited by Javid Mokhtari; 2014/08/25, 17:54.
            [FONT=Tahoma][INDENT][CENTER][SIZE=3][FONT=courier new][B][FONT=comic sans ms][SIZE=3][FONT=arial]دوره های آموزش رایگان اکسل از صفر تا پیشرفته بصورت تصویری
            بیش از [COLOR=#008000]60[/COLOR] جلسه آموزش ویدئویی رایگان

            شرکت در دوره:
            [/FONT][/SIZE]
            [SIZE=5] [FONT=Tahoma][FONT=courier new][B][URL]https://javidsoft.ir/courses/[/URL][/B][/FONT][/FONT][/SIZE][/FONT]
            [/B][/FONT][/SIZE]
            [/CENTER]
            [/INDENT]
            [/FONT]

            کامنت

            • master

              • 2010/07/18
              • 118

              #7
              نمیدونم مشکل از چی بود که نوشتن c هم حل نشده فقط اولی رو جابجا میکرد
              من یه کار دیگه کردم نگاه به تعداد سطر ها کردم دیدم نهایت 200 خورده ای هستن منم توی اون خط اول رو اینجوری کردم و مشکل حل شد:
              For i = 1 To 400
              ولی فرصت بشه فایل رو میزارم ببنید مشکل از چی بوده که اون کد اجرا نمیشد
              راستی دستور شرط براساس رنگ رو نگفتید
              با تشکر

              کامنت

              • Javid Mokhtari
                مدير تالار ويژوال بيسيك

                • 2012/01/16
                • 1212
                • 73.00

                #8
                نوشته اصلی توسط master
                نمیدونم مشکل از چی بود که نوشتن c هم حل نشده فقط اولی رو جابجا میکرد
                من یه کار دیگه کردم نگاه به تعداد سطر ها کردم دیدم نهایت 200 خورده ای هستن منم توی اون خط اول رو اینجوری کردم و مشکل حل شد:
                For i = 1 To 400
                ولی فرصت بشه فایل رو میزارم ببنید مشکل از چی بوده که اون کد اجرا نمیشد
                راستی دستور شرط براساس رنگ رو نگفتید
                با تشکر
                به احتمال زیاد نام شیت شما فرق دارد.خط رو به شکل زیر تغییر بدین:
                کد PHP:
                For 1 To ActiveSheet.Range("c100000").End(xlUp).Row 
                رنگ ها بسته به مقدارشون، کدهای متفاوتی دارن.مثلا همین آبی از روشنترین حالت شروع میشه تا ... برا همین شما ابتدا باید یک کد آبی برا خودتون تعیین کنید.
                برای رنگ قرمز :
                کد PHP:
                For 1 To ActiveSheet.Range("c100000").End(xlUp).Row
                    
                If Cells(i3).Interior.Color 255 Then
                        Cells
                (i2) = Cells(i3)
                        
                Cells(i3) = ""
                    
                End If
                Next i 
                فایل های پیوست شده
                Last edited by Javid Mokhtari; 2014/08/26, 02:04.
                [FONT=Tahoma][INDENT][CENTER][SIZE=3][FONT=courier new][B][FONT=comic sans ms][SIZE=3][FONT=arial]دوره های آموزش رایگان اکسل از صفر تا پیشرفته بصورت تصویری
                بیش از [COLOR=#008000]60[/COLOR] جلسه آموزش ویدئویی رایگان

                شرکت در دوره:
                [/FONT][/SIZE]
                [SIZE=5] [FONT=Tahoma][FONT=courier new][B][URL]https://javidsoft.ir/courses/[/URL][/B][/FONT][/FONT][/SIZE][/FONT]
                [/B][/FONT][/SIZE]
                [/CENTER]
                [/INDENT]
                [/FONT]

                کامنت

                • master

                  • 2010/07/18
                  • 118

                  #9
                  اقا ممنون حل شد
                  ظاهرا به خاطر همون اسم بود که الان اینجوری نوشتم درست شد
                  البته من قبلش حدس زدم برا این باشه اسم فایل و شیت رو گذاشتم 0 و کد رو اینجوری نوشتم:
                  For i = 1 To 0.Range("c100000").End(xlUp).Row
                  ولی بازم کار نکرد الان اگه بخوام براساس نام شیت باشه و نام شیت مثلا همین 0 باشه باید کد اولی رو چه تغییری بدم؟(البته الان این کد جدید بهتر هست چون وابسته با نام شیت هم نیست ولی جهت یادگیری این سوال رو میکنم
                  الان با این کد میشه تعداد سطر یه جدول رو بدست اورد درسته؟ چون تایپیک زیر رو زده بودم که الان با این کد فکر کنم بشه جواب گرفت
                  انجمن اکســل ایران
                  راستی اگه میشه خط اول رو قسمت به قسمت بگید چیکار میکنه مخصوصا قسمت End(XlUp) الان به جای End و XlUp چیا میشه نوشت و اونا چه کارایی میکنن؟
                  با تشکر

                  کامنت

                  • Javid Mokhtari
                    مدير تالار ويژوال بيسيك

                    • 2012/01/16
                    • 1212
                    • 73.00

                    #10
                    اگر بر اساس نام شیت می خواین آدرس بدین:
                    به فرض نام شیت شما data هست:
                    کد PHP:
                    Sheets("data").Range("a100000").End(xlUp).Row 
                    لینکی رو که بهتون داده بودم رو خوندین ...!!؟

                    لینک زیر هم که دوست زحمتکشمون آقای فاطمی قرار دادن:


                    بعد از مطالعه ی مطالب لینک فوق ، در خدمتیم.
                    Last edited by Javid Mokhtari; 2014/08/26, 14:41.
                    [FONT=Tahoma][INDENT][CENTER][SIZE=3][FONT=courier new][B][FONT=comic sans ms][SIZE=3][FONT=arial]دوره های آموزش رایگان اکسل از صفر تا پیشرفته بصورت تصویری
                    بیش از [COLOR=#008000]60[/COLOR] جلسه آموزش ویدئویی رایگان

                    شرکت در دوره:
                    [/FONT][/SIZE]
                    [SIZE=5] [FONT=Tahoma][FONT=courier new][B][URL]https://javidsoft.ir/courses/[/URL][/B][/FONT][/FONT][/SIZE][/FONT]
                    [/B][/FONT][/SIZE]
                    [/CENTER]
                    [/INDENT]
                    [/FONT]

                    کامنت

                    • master

                      • 2010/07/18
                      • 118

                      #11
                      ضمن تشکر باید بگم یه نگاه اجملی به اون تایپیک کرده بودم اشنایی مختصر هم دارم من منظورم نوع کار این تابع بود که چیکار میکنه که توی اون تایپیک چیزی در مورد این تابع پیدا نکردم
                      توی گوگل که سرچ کردم خود سایت ماکروسافت توضیح انگلیسی داده بود که بازم زیاد متوجه نشدم:
                      کد PHP:
                      Range.End Property (Excel)
                      Returns a Range object that represents the cell at the end of the region that contains the source rangeEquivalent to pressing END+UP ARROWEND+DOWN ARROWEND+LEFT ARROW, or END+RIGHT ARROWRead-only Range object.

                      .
                      End(Direction)
                      Data TypeXlDirection

                      XlDirection Enumeration 
                      (Excel)
                      Specifies the direction in which to move
                      xlDown    Down
                      .
                      xlToLeft    To left.
                      xlToLeft    To right.
                      xlUp    Up
                      چیزی که من متوجه شدم با این دستور رنچ داده شده پیمایش میشه و با توجه به دستوری که توی پرانتز نوشته شده حرکت میکنه ومثلا توی مثال ما از خونه c100000 شروع میکنه میاد بالا ولی نمیدونم چی رو شمارش میکنه؟ یا مثلا row اخر چه کاری میکنه یا مثلا رنج رو به چه صورتهای دیگه میشه داده
                      اگه فرصت داشتید بهطور کامل این تابع رو تشریح کنید میتونید توی همون ادرسی تایپیکی که دادید توضیحاتش رو بدید که مرتبط تر هست
                      در کل مشکل من الان حل شده ولی بدم نمیاد کامل با این تابع اشنا بشم که کلا کارش چیه چه متغییرهایی میشه بهش داد و ....
                      با تشکر

                      کامنت

                      • Javid Mokhtari
                        مدير تالار ويژوال بيسيك

                        • 2012/01/16
                        • 1212
                        • 73.00

                        #12
                        Sheets("data").Range("a100000").End(xlUp).Row

                        کد فوق در سلول a100000 قرار گرفته سپس به آخرین سلولی که دارای داده است(به سمت بالا) پرش می کند سپس ردیف سلولی که به آن پرش کرده است را بر میگرداند.
                        یعنی اگر محدوده a1:a10 دارای داده باشد و کد فوق را اجرا کنید سلول a10 انتخاب می شود زیرا a10 اخرین سلولی است که دارای داده است.
                        برای درک بهتر به محدوده a1:a10 داده بدین و در سلول مثلا a20 قرار بگیرین حال "جهت رو به بالا + Ctrl" را بفشارید.اتفاقی که می افتد همان کار کد فوق می باشد

                        در حالتهای زیر هم به کار می رود:

                        کد PHP:
                        Sheet1.Range("a20").End(xlToLeft).Select
                        Sheet1
                        .Range("a20").End(xlUp).Select
                        Sheet1
                        .Range("a20").End(xlToRight).Select
                        Sheet1
                        .Range("a20").End(xlDown).Select 
                        Last edited by Javid Mokhtari; 2014/08/26, 21:01.
                        [FONT=Tahoma][INDENT][CENTER][SIZE=3][FONT=courier new][B][FONT=comic sans ms][SIZE=3][FONT=arial]دوره های آموزش رایگان اکسل از صفر تا پیشرفته بصورت تصویری
                        بیش از [COLOR=#008000]60[/COLOR] جلسه آموزش ویدئویی رایگان

                        شرکت در دوره:
                        [/FONT][/SIZE]
                        [SIZE=5] [FONT=Tahoma][FONT=courier new][B][URL]https://javidsoft.ir/courses/[/URL][/B][/FONT][/FONT][/SIZE][/FONT]
                        [/B][/FONT][/SIZE]
                        [/CENTER]
                        [/INDENT]
                        [/FONT]

                        کامنت

                        • master

                          • 2010/07/18
                          • 118

                          #13
                          ممنون دقیقا همین توضیح رو میخواستم الان متوجه شدم
                          خوب نمیشه فرمول رو تغییر داد بعد a1*رو بهش بدیم پرش کنه به اخرین خونه دارای داده یا اولین خونه خالی؟
                          بعد توی اون حالتی که شما توضیح دادید اگه a1 تا a10 پر بود بعد a11 تا a19 خالی باشه بعد a20 پر باشه و ما رنج رو a100000 داده باشیم a20 رو بر میگردونه یا a10 (طبق توضیح شما باید a20 بده چون کاری نداره دیگه بعدش خونه خالی هست یا نه حالا اگه معکوس بریم یعنی اون چیزی که من گفتم البته اگه تابعی داشته باشه باید a10 بده درسته؟ یا a11*بده اگه کد به صورتی باشه که اولین خونه خالی رو بخواهد برگردونه)
                          ضمنا میشه محدوده رو به صورت جدولی داد؟البته نمیدونم کاربردی داره توی این فرمول یا نه
                          با تشکر

                          کامنت

                          • Javid Mokhtari
                            مدير تالار ويژوال بيسيك

                            • 2012/01/16
                            • 1212
                            • 73.00

                            #14
                            نوشته اصلی توسط master
                            ممنون دقیقا همین توضیح رو میخواستم الان متوجه شدم
                            خوب نمیشه فرمول رو تغییر داد بعد a1*رو بهش بدیم پرش کنه به اخرین خونه دارای داده یا اولین خونه خالی؟
                            بعد توی اون حالتی که شما توضیح دادید اگه a1 تا a10 پر بود بعد a11 تا a19 خالی باشه بعد a20 پر باشه و ما رنج رو a100000 داده باشیم a20 رو بر میگردونه یا a10 (طبق توضیح شما باید a20 بده چون کاری نداره دیگه بعدش خونه خالی هست یا نه حالا اگه معکوس بریم یعنی اون چیزی که من گفتم البته اگه تابعی داشته باشه باید a10 بده درسته؟ یا a11*بده اگه کد به صورتی باشه که اولین خونه خالی رو بخواهد برگردونه)
                            ضمنا میشه محدوده رو به صورت جدولی داد؟البته نمیدونم کاربردی داره توی این فرمول یا نه
                            با تشکر
                            استفاده از End میتونه ابتکاری و بسته به نیاز شما باشه.گفته های شما صحیح است من به این خاطر مثلا از s100000 شروع کردم چون اگر بین داده ها سلول خالی باشد همانجا متوقف می شود.همین محدوده a1:a10 اگر سلولی خالی باشد مثل a5 و اگر از کد Sheet1.Range("a1").End(xlDown).Select استفاده کنیم سلول a4 انتخاب خواهد شد.
                            همه چیز به نیاز شما بستگی دارد.
                            [FONT=Tahoma][INDENT][CENTER][SIZE=3][FONT=courier new][B][FONT=comic sans ms][SIZE=3][FONT=arial]دوره های آموزش رایگان اکسل از صفر تا پیشرفته بصورت تصویری
                            بیش از [COLOR=#008000]60[/COLOR] جلسه آموزش ویدئویی رایگان

                            شرکت در دوره:
                            [/FONT][/SIZE]
                            [SIZE=5] [FONT=Tahoma][FONT=courier new][B][URL]https://javidsoft.ir/courses/[/URL][/B][/FONT][/FONT][/SIZE][/FONT]
                            [/B][/FONT][/SIZE]
                            [/CENTER]
                            [/INDENT]
                            [/FONT]

                            کامنت

                            چند لحظه..