کمک برای نوشتن ماکرو

Collapse
X
 
  • زمان
  • نمایش
حذف همه
new posts
  • mohsen amin
    • 2011/08/03
    • 3

    کمک برای نوشتن ماکرو

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

  • m_d6712

    • 2010/05/22
    • 174

    #2
    RE: کمک برای نوشتن ماکرو

    شما برای این کار نیاز به ماکرو ندارید دوست عزیز: با فرمول های اکسل به راحتی می توانید این کار را انجام دهید!
    شما باید از تابع SUM در شیت دوم برای جمع زدن اعداد داخل شیت اول استفاده کنید.
    -------
    [url=http://md6712.com]http://md6712.com[/url]
    جامعه ایده پردازان: http://idekadeh.com

    کامنت

    • komeilex

      #3
      RE: کمک برای نوشتن ماکرو

      سلام به تو. راستش منم تو این کار زیاد حرفه ای نیستم ولی کاری رو که خواستی برات انجام دادم و امیدوارم راهنمایی من کمکت کنه.
      آقا به طور کلی ماکرو در حد ابتدایی چیزی جز ضبت کردن انجام یه کار و اجرای کل اون کار با یک کلید میان بر نیست!برای این کار بعد از فعال کردن تب developer از منوی اکسل آپشن گزینه ضبت ماکرو رو از گوشه پایینی سمت چپ صفحه انتخاب می کنی و بعد از وارد کردن نام ماکرو و کلید میان بر ok می کنی. از این به بعد هر کاری کنی به عنوان ماکروی مورد نظر ذخیره میشه. برای پایان ذخیره همون دکمه پایین گوشه سمت چپ رو انتخاب کن.
      واما برای سوال تو.
      بعد از وارد کردن اسامی و نمرات، محدوده اسامی رو انتخاب کن و اونهارو تو شیت 2 کپی کن. از تب data گزینه remove duplicate رو انتخاب کن تا اسامی تکراری حذف بشن. بعد با ابزار considolate از همون تب data کاری که میخوای رو انجام بده. یادت باشه تو تمام این مراحل داری کارتو با ماکرو ضبت می کنی تا بعد از اتمام نیاز نداشته باشی برای داده های جدید تمام این مراحل رو انجام بدی و کلید میانبری که تعریف کردی کل کارو برات انجام بده. موفق باشی

      کامنت

      • khakzad

        • 2010/03/17
        • 2034
        • 85.00

        #4
        RE: کمک برای نوشتن ماکرو

        سلام
        شما میتونید اول فیلتر کنید و در advanced filter گزینه uniqe records رو بزنید.به این ترتیب از هر مورد یکی برای شما فیلتر میشود.به این ترتیب لیست شما آماده هست.
        بعد با استفاده از فرمول sumif این کار رو انجام میدید.که range و sumrange رو از لیست اولیه و criteria رو از لیست ثانویه انتخاب میکنید
        فایل نمونه رو براتون گذاشتم
        سوالی بود در خدمتم[hr]
        در مورد سوال دوم هم همونطور که فرمودند ماکرو رو ضبط می کنید.
        هم میتونید برای هربار اجرا شدن، ماکرو رو run کنید.هم اینکه کدی هست که ماکروها را در زمان های خاص بصورت خودکار و بدون نیاز به run کردن ماکرو اجرا میکنه.
        اگر مایل بودبد کد رو میگم[hr]
        موقع ضبط ماکرو به آدرس دهی در فرمول ها دقت کنید که بعدا در صورت افزایش تعداد رکوردها مشکلی پیش نیاد
        موفق باشید
        فایل های پیوست شده
        [CENTER][B][COLOR=#008000][SIZE=3]محصولات و جزوات آموزش تخصصی [URL="https://excelpedia.net/"]اکسل[/URL] در:

        [URL="https://excelpedia.net/category/excel-functions/"]برترین مرجع تخصصی پارسی اکسل[/URL]
        [URL="http://www.exceliran.com/shop/"]جامعه اكسل ايرانيان: فروشگاه[/URL][/SIZE][/COLOR][/B]
        :wcom:

        [B][URL="https://excelpedia.net/"]آموزش اکسل تخصصی[/URL] و [URL="https://excelpedia.net/excel-ninja/"]پیشرفته[/URL] - [URL="https://excelpedia.net/"]تهران[/URL][/B]
        [EMAIL="h.khakzad@yahoo.com"]h.khakzad@yahoo.com[/EMAIL]
        [/CENTER]

        کامنت

        • victoria_1370

          • 2014/07/20
          • 25

          #5
          سلام
          من ی ماکرو نوشتم در مورد اینکه دوتا ستون رو با هم مقایسه کنه ..مثلا در اینجا A رو با G مقایسه کنه و بعد اگر مثلا اولین کد خونه G در A وجود داشت در ستون کنار G درست در مقابل همون کد که مقایسش کرد بنویسه T و اگر نبود هم بنویسهF
          اما اجرا نمیشه نمیدونم چرا میشه بگین کد درسته؟اروری که میده در مورد اینه که ماکرو غیرفعاله چجوری باید فعالش کنم؟
          Sub samp()
          Dim i As Integer
          Dim j As Integer
          For i = 2 To 12952
          For j = 2 To 11498
          If Cells(7, i).Value = Cells(1, j).Value Then
          Cells(8, i).Value = "T"
          Else
          Cells(8, i).Value = "f"
          End If
          Next j
          Next i

          End Sub

          کامنت

          • ali.b

            • 2014/01/12
            • 798

            #6
            ورژن افیس شما چنده؟
            فایل رو باید با پسوند xlsm ذخیره کنید که با save as امکان پذیره
            برای افیس 2007 باید تو تنظیمات ماکرو رو فعال کنی
            [CENTER]
            [/CENTER]

            کامنت

            • victoria_1370

              • 2014/07/20
              • 25

              #7
              بله ممنونم فعالش کردم اما وقتی اجراش میکنم انگار تو لوپ میفته اصلا هیچ کاری نمیکنه میشه ی نگاهی به کدی که نوشتم بندازین؟جاییش اشتباهه؟
              ممنون

              کامنت

              • K1P

                • 2014/07/10
                • 20

                #8
                سلام،
                اولا" که اگر براي ستون A و G مي خواهيد عمل شود سطر و ستونها را جابجا نوشته ايد، بعدش هم شايد چون حدود 11 تا 12 هزارتا خانه مد نظرتون است هنگ مي کند! ولي فکر کنم کلا" کدنويسيتون غلط باشد.
                به نظر من اصلا" دو تا متغيير نبايد تعريف کنيد (البته تا اونجا که من از توضيحاتتان درک کردم) من يک کد براي بيست رديف ستون A با يک متغيير نوشتم بينيد به درد مي خورد:
                کد:
                Sub Macro1()Dim i As Integer
                For i = 2 To 20
                If Application.WorksheetFunction.CountIf(Range("a1:a20"), Cells(i, 7).Value) > 0 Then
                Cells(i, 8).Value = "T"
                Else
                Cells(i, 8).Value = "f"
                End If
                Next i
                End Sub
                بعد شما بايد 20 را به 11498 تغيير دهيد
                البته گفتم که: اگر سوالتان را درست فهميده باشم!
                من فرض را بر اين گرفته ام که هر خانه از G2 تا G12952 را مي آيد در ستون A در محدوده A2 تا A11498 مي گردد، اگر مشابه داشت T وگرنه F را در خانه بغلي مي نويسد.
                يعني A2 تا A11498 ثابت است و ديگر احتياج به تعريف متغيير براي آن نيست.
                Last edited by K1P; 2014/07/28, 17:15.

                کامنت

                • Juliet

                  • 2014/06/17
                  • 47
                  • 61.00

                  #9
                  نوشته اصلی توسط victoria_1370
                  سلام
                  من ی ماکرو نوشتم در مورد اینکه دوتا ستون رو با هم مقایسه کنه ..مثلا در اینجا A رو با G مقایسه کنه و بعد اگر مثلا اولین کد خونه G در A وجود داشت در ستون کنار G درست در مقابل همون کد که مقایسش کرد بنویسه T و اگر نبود هم بنویسهF
                  اما اجرا نمیشه نمیدونم چرا میشه بگین کد درسته؟اروری که میده در مورد اینه که ماکرو غیرفعاله چجوری باید فعالش کنم؟
                  Sub samp()
                  Dim i As Integer
                  Dim j As Integer
                  For i = 2 To 12952
                  For j = 2 To 11498
                  If Cells(7, i).Value = Cells(1, j).Value Then
                  Cells(8, i).Value = "T"
                  Else
                  Cells(8, i).Value = "f"
                  End If
                  Next j
                  Next i

                  End Sub
                  درود دوست عزیز

                  اینطور که من متوجه شدم شما در ستونی مثلاً B مقادیری دارین که میخواهین چک کنین ببینین هر کدام از سلول های این ستون برابر با یکی از سلول های ستون دیگه مثلاً A هست یا نه. اگر این رو بخواهین یه اشتباه دارین تو کدتون
                  وقتی از تابع Cells استفاده میکنین، آرگومان اول شماره سطر و آرگومان دوم شماره ستون هست، درحالیکه شما شماره سطر ها رو ثابت و شماره ستون ها رو متغیر در نظر گرفتین (شمارنده حلقه)

                  فایل نمونه ای گه براتون گزاشتم مقادیر 10 سطر اول ستون های A و B رو قیاس میکنه، میتونین محدوده رو به هر جا که دلتون میخواد تغییر بدین، کافیه اعداد ثابت جایگزین شن. به این صورت که محدوده سطر هاتون سقف حلقه ها میشن و شماره ستون نمایش نتیجه هم جای عدد سه میاد، 2 و 1 هم ستون هایی که با هم قیاس میشن. متغیر ها رو تغییر ندین.
                  کد:
                  Private Sub cmd_Click()
                  
                      Dim i, j As Integer
                  
                      For i = 1 To 10
                          For j = 1 To 10
                  
                              If Cells(i, 2).Value = Cells(j, 1).Value Then
                                  Cells(i, 3).Value = "TRUE"
                                  Exit For
                              Else
                                  Cells(i, 3).Value = "FALSE"
                              End If
                  
                          Next j
                      Next i
                  
                  End Sub
                  به اضافه اینکه وقتی فایل xlsm یعنی فایل اکسلی که کد VBA داره رو باز میکنین، اکسل پیغامی در یک کادر زرد رنگ بهتون میده با عنوان Security Warning اون رو با دکمه Enable Content فعال کنین، ضمناً قبل از این دکمه هم فایل رو که باز میکنین ممکنه لازم باشه دکمه Enable Editing رو هم بزنین.

                  ====================

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

                  امیدوارم این کد به دردتون بخوره
                  موفق باشین
                  فایل های پیوست شده
                  Last edited by Juliet; 2014/07/28, 19:47. دلیل: تکمیل توضیحات
                  [CENTER][COLOR=#006400]«زمانيکه با زمانه خويش نساختي و با [/COLOR][COLOR=#b22222][B]مسندنشينان[/B][/COLOR][COLOR=#006400] و [/COLOR][B][COLOR=#b22222]امربران[/COLOR][/B][COLOR=#006400] ايشان کنار نيامدي
                  و آنچه را [/COLOR][B][COLOR=#b22222]جاهلان [/COLOR][/B][COLOR=#006400]ميگويند، جاهلانه باز نگفتي،
                  لاجرم به تبعيد ابدي گرفتار خواهي شد!
                  حتي اگر جسمت در کنج منزلي در شهري ساکن باشد؛
                  و اگر بر نپذيرفتن، پاي فشردي،

                  [/COLOR][COLOR=#3366cc][B]آواره ات خواهند کرد،
                  [/B][/COLOR][COLOR=#3333cc][B]به زندانت خواهند افکند
                  [/B][/COLOR][COLOR=#333366][B] و به دارت خواهند کشيد ...»[/B][/COLOR][COLOR=#006400]
                  [/COLOR][/CENTER]

                  کامنت

                  • K1P

                    • 2014/07/10
                    • 20

                    #10
                    البته اگر مي خواهيد هر خانه با خانه متناظرش مقايسه شود (مثلا" G2 با A2 و G3 با A3 )اون موقع کدتان اينجوري مي شود:
                    (البته در اين صورت تو کد اولتون حداقل بايد 12952 با 11498 برابر مي بود! براي همين آدم شک مي کند که منظورتون دقيقا" چيست!)
                    کد:
                    Sub Macro1()
                    Dim i As Integer
                    For i = 2 To 20
                    If Cells(i, 7).Value = Cells(i, 7).Offset(0, -6).Value Then
                    Cells(i, 8).Value = "T"
                    Else
                    Cells(i, 8).Value = "f"
                    End If
                    Next i
                    End Sub

                    کامنت

                    • victoria_1370

                      • 2014/07/20
                      • 25

                      #11
                      نوشته اصلی توسط K1P
                      سلام،
                      اولا" که اگر براي ستون A و G مي خواهيد عمل شود سطر و ستونها را جابجا نوشته ايد، بعدش هم شايد چون حدود 11 تا 12 هزارتا خانه مد نظرتون است هنگ مي کند! ولي فکر کنم کلا" کدنويسيتون غلط باشد.
                      به نظر من اصلا" دو تا متغيير نبايد تعريف کنيد (البته تا اونجا که من از توضيحاتتان درک کردم) من يک کد براي بيست رديف ستون A با يک متغيير نوشتم بينيد به درد مي خورد:
                      کد:
                      Sub Macro1()Dim i As Integer
                      For i = 2 To 20
                      If Application.WorksheetFunction.CountIf(Range("a1:a20"), Cells(i, 7).Value) > 0 Then
                      Cells(i, 8).Value = "T"
                      Else
                      Cells(i, 8).Value = "f"
                      End If
                      Next i
                      End Sub
                      بعد شما بايد 20 را به 11498 تغيير دهيد
                      البته گفتم که: اگر سوالتان را درست فهميده باشم!
                      من فرض را بر اين گرفته ام که هر خانه از G2 تا G12952 را مي آيد در ستون A در محدوده A2 تا A11498 مي گردد، اگر مشابه داشت T وگرنه F را در خانه بغلي مي نويسد.
                      يعني A2 تا A11498 ثابت است و ديگر احتياج به تعريف متغيير براي آن نيست.
                      واقعا لطف کردین ی دنیا ممنون
                      مشکل حل شد

                      کامنت

                      • victoria_1370

                        • 2014/07/20
                        • 25

                        #12
                        نوشته اصلی توسط Juliet
                        درود دوست عزیز

                        اینطور که من متوجه شدم شما در ستونی مثلاً B مقادیری دارین که میخواهین چک کنین ببینین هر کدام از سلول های این ستون برابر با یکی از سلول های ستون دیگه مثلاً A هست یا نه. اگر این رو بخواهین یه اشتباه دارین تو کدتون
                        وقتی از تابع Cells استفاده میکنین، آرگومان اول شماره سطر و آرگومان دوم شماره ستون هست، درحالیکه شما شماره سطر ها رو ثابت و شماره ستون ها رو متغیر در نظر گرفتین (شمارنده حلقه)

                        فایل نمونه ای گه براتون گزاشتم مقادیر 10 سطر اول ستون های A و B رو قیاس میکنه، میتونین محدوده رو به هر جا که دلتون میخواد تغییر بدین، کافیه اعداد ثابت جایگزین شن. به این صورت که محدوده سطر هاتون سقف حلقه ها میشن و شماره ستون نمایش نتیجه هم جای عدد سه میاد، 2 و 1 هم ستون هایی که با هم قیاس میشن. متغیر ها رو تغییر ندین.
                        کد:
                        Private Sub cmd_Click()
                        
                            Dim i, j As Integer
                        
                            For i = 1 To 10
                                For j = 1 To 10
                        
                                    If Cells(i, 2).Value = Cells(j, 1).Value Then
                                        Cells(i, 3).Value = "TRUE"
                                        Exit For
                                    Else
                                        Cells(i, 3).Value = "FALSE"
                                    End If
                        
                                Next j
                            Next i
                        
                        End Sub
                        به اضافه اینکه وقتی فایل xlsm یعنی فایل اکسلی که کد VBA داره رو باز میکنین، اکسل پیغامی در یک کادر زرد رنگ بهتون میده با عنوان Security Warning اون رو با دکمه Enable Content فعال کنین، ضمناً قبل از این دکمه هم فایل رو که باز میکنین ممکنه لازم باشه دکمه Enable Editing رو هم بزنین.

                        ====================

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

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

                        کامنت

                        • Juliet

                          • 2014/06/17
                          • 47
                          • 61.00

                          #13
                          نوشته اصلی توسط victoria_1370
                          از اینکه وقتتون رو در اختیارم گذاشتین ی دنیا ممنون
                          در مورد پیشنهاد ایجاد سوال جدید باید بگم من دفعه قبل همین کارو کردم اما متاسفانه اخطار خوردم که از پیشینه سایت استفاده کنم ...متاسفانه در این مورد من هیچی نمیدونم چون قوانین سایت برام مبهمه ...مجبور شدم از این تاپیک قدیمی استفاده کنم
                          بازم از لطفتون ممنون
                          خواهش میکنم، اگر تونسته باشم در حل مشکلتون کمکی کرده باشم باعث مسرته
                          پیروز باشید
                          [CENTER][COLOR=#006400]«زمانيکه با زمانه خويش نساختي و با [/COLOR][COLOR=#b22222][B]مسندنشينان[/B][/COLOR][COLOR=#006400] و [/COLOR][B][COLOR=#b22222]امربران[/COLOR][/B][COLOR=#006400] ايشان کنار نيامدي
                          و آنچه را [/COLOR][B][COLOR=#b22222]جاهلان [/COLOR][/B][COLOR=#006400]ميگويند، جاهلانه باز نگفتي،
                          لاجرم به تبعيد ابدي گرفتار خواهي شد!
                          حتي اگر جسمت در کنج منزلي در شهري ساکن باشد؛
                          و اگر بر نپذيرفتن، پاي فشردي،

                          [/COLOR][COLOR=#3366cc][B]آواره ات خواهند کرد،
                          [/B][/COLOR][COLOR=#3333cc][B]به زندانت خواهند افکند
                          [/B][/COLOR][COLOR=#333366][B] و به دارت خواهند کشيد ...»[/B][/COLOR][COLOR=#006400]
                          [/COLOR][/CENTER]

                          کامنت

                          • victoria_1370

                            • 2014/07/20
                            • 25

                            #14
                            سلام من ی ماکرو نوشتم و زمان اجرای اون خیلی طولانی شده
                            میخوام بدونم راهی هست که بتونم در حین اجرا اونو متوقف کنم و بتونم نتیجه رو ببینم و دوباره ران کنم تا ادامه بده؟
                            ممنون

                            کامنت

                            • khakzad

                              • 2010/03/17
                              • 2034
                              • 85.00

                              #15
                              چند راه متنوع وجود داره:
                              1) با کلید F8 کدهای خودتون رو خط به خط اجرا کنید
                              2) داخل کدتون ی نقطه انفصال بذارید که فقط تا اون شرط ران کنه و ج رو داخل مسیج باکس ببینید (در این حالت نمی تونید اجرای کد رو از اون مرحله ادامه بدید)
                              3) وقتی نقطه انفصال م یذارید، مثلا میگید حلقه به دور دهم که رسید، msgbox بذارید. در اینجا نتیجه رو بهتون نشون میده و وقتی که مسیج باکس رو مبندید ادامه کد ران میشه.

                              4) با موس کنار خط کدی که می خواید تا اونجا وایسته کلیک کنید تا قرمز بشه و دایره قرمز بیاد کنارش.اینطوری می گید که کد رو از اول اجرا کن تا این خط
                              [CENTER][B][COLOR=#008000][SIZE=3]محصولات و جزوات آموزش تخصصی [URL="https://excelpedia.net/"]اکسل[/URL] در:

                              [URL="https://excelpedia.net/category/excel-functions/"]برترین مرجع تخصصی پارسی اکسل[/URL]
                              [URL="http://www.exceliran.com/shop/"]جامعه اكسل ايرانيان: فروشگاه[/URL][/SIZE][/COLOR][/B]
                              :wcom:

                              [B][URL="https://excelpedia.net/"]آموزش اکسل تخصصی[/URL] و [URL="https://excelpedia.net/excel-ninja/"]پیشرفته[/URL] - [URL="https://excelpedia.net/"]تهران[/URL][/B]
                              [EMAIL="h.khakzad@yahoo.com"]h.khakzad@yahoo.com[/EMAIL]
                              [/CENTER]

                              کامنت

                              چند لحظه..