چگونه در vba به كنترل جاري اشاره كنم

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

    • 2011/09/08
    • 159

    چگونه در vba به كنترل جاري اشاره كنم

    حضور دوستان عزيز سلام عرض مي كنم

    سوال اينست : چگونه در كد نويسي رويداد كليك يك كنترل ، مثلاً label ، ميتوان به كنترل جاري اشاره كرد مثل عبارت me كه به userform جاري اشاره مي كند ايا عبارتي هم وجود دارد كه به كنترل جاري اشاره كند
    جهت اطلاع دوستان ، پروژه هم يه چيزي مثل اينست كه تعداد زيادي (براي حدود 100 ليبل) ميخواهم كد بنويسم كه با كليك روي هركدام ، caption آن كنترل به ساعت جاري سيستم تبديل شود
    از اين رو اگر براي هر كدام بخواهم نام همان ليبل را در رويداد مربوطه بنويسم فكر نميكنم زياد جالب باشد
  • mahsa shayesteh

    • 2011/12/07
    • 272

    #2
    RE: چگونه در vba به كنترل جاري اشاره كنم

    اگه اشتباه نکنم با همون me میشه کافیه بعد از me کنترل مربوطه بیاد مثلا
    [align=left]
    کد PHP:
    me.textbox1 
    [/align]
    در روزگاری که لبخند ادمها بخاطر شکست توست برخیز تا بگریند

    کامنت

    • alisabet

      • 2011/09/08
      • 159

      #3
      RE: چگونه در vba به كنترل جاري اشاره كنم

      نوشته اصلی توسط mahasa shayesteh
      اگه اشتباه نکنم با همون me میشه کافیه بعد از me کنترل مربوطه بیاد مثلا
      [align=left]
      کد PHP:
      me.textbox1 
      [/align]
      me هميشه به userform جاري اشاره ميكند

      کامنت

      • m_d6712

        • 2010/05/22
        • 174

        #4
        RE: چگونه در vba به كنترل جاري اشاره كنم

        سلام دوست عزیز.

        برای اینکه به کنترل جاری اشاره کنید دستوری به این نام وجود دارد: Me.ActiveControl

        برای اینکه اندیس تب این کنترل رو متوجه شوید از این دستور: Me.ActiveControl.TabIndex

        اما اگر می خواهید caption یک کنترل جاری را مورد بازیابی قرار دهید. دچار مشکلی می شوید به نام دگرریختی یا polymorphism . اصولا چون Label کلاس زیر مجموعه Control هست و caption متعلق به Label هست و نه Control شما نمی توانید آن را مستقیم مورد بازیابی قرار دهید. به عبارتی دیگر همه کنترل ها caption ندارند. برای اینکار باید شما. ریخت و قیافه control خود را به اصطلاح عوض کنید. برای این کار از یک شی کمکی استفاده می کنیم به این صورت.

        Dim AltLbl As Label
        Set AltLbl = Me.ActiveControl
        MsgBox AltLbl.Caption

        پیروز و موفق باشید.
        -------
        http://md6712.com
        جامعه ایده پردازان: http://idekadeh.com

        کامنت

        • mokaram
          مدير تالار اکسل و بانک اطلاعاتی

          • 2011/02/06
          • 1805

          #5
          RE: چگونه در vba به كنترل جاري اشاره كنم

          مثل همیشه جامع و سلیس و کاربردی
          ممنون استاد داوری

          کامنت

          • mahsa shayesteh

            • 2011/12/07
            • 272

            #6
            RE: چگونه در vba به كنترل جاري اشاره كنم

            نوشته اصلی توسط m_d6712
            سلام دوست عزیز.

            برای اینکه به کنترل جاری اشاره کنید دستوری به این نام وجود دارد: Me.ActiveControl

            برای اینکه اندیس تب این کنترل رو متوجه شوید از این دستور: Me.ActiveControl.TabIndex

            اما اگر می خواهید caption یک کنترل جاری را مورد بازیابی قرار دهید. دچار مشکلی می شوید به نام دگرریختی یا polymorphism . اصولا چون Label کلاس زیر مجموعه Control هست و caption متعلق به Label هست و نه Control شما نمی توانید آن را مستقیم مورد بازیابی قرار دهید. به عبارتی دیگر همه کنترل ها caption ندارند. برای اینکار باید شما. ریخت و قیافه control خود را به اصطلاح عوض کنید. برای این کار از یک شی کمکی استفاده می کنیم به این صورت.

            Dim AltLbl As Label
            Set AltLbl = Me.ActiveControl
            MsgBox AltLbl.Caption

            پیروز و موفق باشید.
            حالا مثلا از me استفاده کنیم چه فرقی میکنه استفاده از خود کنترل چه اشکالی داره؟

            در روزگاری که لبخند ادمها بخاطر شکست توست برخیز تا بگریند

            کامنت

            • m_d6712

              • 2010/05/22
              • 174

              #7
              RE: چگونه در vba به كنترل جاري اشاره كنم

              نوشته اصلی توسط mahasa shayesteh
              نوشته اصلی توسط m_d6712
              سلام دوست عزیز.

              برای اینکه به کنترل جاری اشاره کنید دستوری به این نام وجود دارد: Me.ActiveControl

              برای اینکه اندیس تب این کنترل رو متوجه شوید از این دستور: Me.ActiveControl.TabIndex

              اما اگر می خواهید caption یک کنترل جاری را مورد بازیابی قرار دهید. دچار مشکلی می شوید به نام دگرریختی یا polymorphism . اصولا چون Label کلاس زیر مجموعه Control هست و caption متعلق به Label هست و نه Control شما نمی توانید آن را مستقیم مورد بازیابی قرار دهید. به عبارتی دیگر همه کنترل ها caption ندارند. برای اینکار باید شما. ریخت و قیافه control خود را به اصطلاح عوض کنید. برای این کار از یک شی کمکی استفاده می کنیم به این صورت.

              Dim AltLbl As Label
              Set AltLbl = Me.ActiveControl
              MsgBox AltLbl.Caption

              پیروز و موفق باشید.
              حالا مثلا از me استفاده کنیم چه فرقی میکنه استفاده از خود کنترل چه اشکالی داره؟

              خیلی ساده بگم. Me.activeControl به کنترل جاری اشاره می کند. ولی مفسر و ادیتور هنوز نمی دونند که این کنترل یک Label هست. به همین دلیل ما با فرمان
              Dim AltLbl As Label
              Set AltLbl = Me.ActiveControl
              به مفسر و ادیتور می گوییم که این کنترل یک label هست. وقتی آنها از هویت کنترل با اطلاع شوند ما می توانیم از خاصییت caption اون کنترل با استفاده کنیم. به این نکته توجه کنید که خیلی از کنترل ها اصلا caption ندارند.





              -------
              http://md6712.com
              جامعه ایده پردازان: http://idekadeh.com

              کامنت

              • mahsa shayesteh

                • 2011/12/07
                • 272

                #8
                RE: چگونه در vba به كنترل جاري اشاره كنم

                ولی تو قسمت properties کنترل ها کپشن دارن چه لزومی داره به این شیوه از کپشن استفاده بشه؟
                در روزگاری که لبخند ادمها بخاطر شکست توست برخیز تا بگریند

                کامنت

                • m_d6712

                  • 2010/05/22
                  • 174

                  #9
                  RE: چگونه در vba به كنترل جاري اشاره كنم

                  نوشته اصلی توسط mahasa shayesteh
                  ولی تو قسمت properties کنترل ها کپشن دارن چه لزومی داره به این شیوه از کپشن استفاده بشه؟
                  ببینید مثلا combo box مشخصه ای به نام caption ندارد. اصولا در شی گرایی همه کلاس های فرزند همه ی مشخصات کلاس والد را (که کلاس control باشد) به ارث می برند. به این دلیل اگر caption جزوی از مشخصات کلاس والد باشد باید همه فرزندان هم داشته باشند. در شی گرایی سعی بر این است که حداکثر بهره وری ایجاد بشه. پس لزومی نداره که برای control مشخصه ای به نام caption تعریف بشه.

                  حال مفسر می داند که یکی از فرزندان control انتخاب شده. اما نمی داند کدام یک.
                  در صورتی که از مشخصات مشترک این فرزندان می خواستید استفاده کنید. نیازی به دگر ریختی نبود. ولی حالا که از یک مشخصه خاص دارید استفاده می کنید. به دگر ریختی نیاز دارید.

                  F2 را فشار دهید. Control را جستجو کنید. از منوی نتایج active control userform را انتخاب کنید. تمام مشخصات این شی برای شما آورده می شود. و در زیر آن
                  Property ActiveControl As Control
                  read-only
                  Member of MSForms.UserForm
                  را می بینید. به این معنی که active control یک control هست.
                  در لیست مشخصات آن هم caption وجود ندارد. اما back color وجود دارد.

                  اگر می خواستید که از back color استفاده کنید نیازی به تغییر ریخت شی وجود نداشت.
                  اما وقتی می خواهید از caption استفاده کنید. باید تغییر ریخت بدهید.

                  نکته: اگر بر روی label کلیک کرده باشید، ActiveControl قطعا Label خواهد بود. اما تا زمانی که به مفسر نگویید که این label هست هنوز نگاه کلی به آن دارد و فقط از ویژگی control آن می توانید استفاده کنید.

                  مثلا یک بچه رو در نظر بگیر. به لقمه میدی به دستش، اما اون نمی دونه باید چه کار کنه باهاش تا زمانی که بهش بگین این لقمه خوردنی هست. اما دونستن و ندوستن اون بچه خوردنی بودن اون لقمه رو زیر سوال نمی برد.


                  امیدوارم واضح گفته باشم.

                  دوباره Labe
                  -------
                  http://md6712.com
                  جامعه ایده پردازان: http://idekadeh.com

                  کامنت

                  • mahsa shayesteh

                    • 2011/12/07
                    • 272

                    #10
                    RE: چگونه در vba به كنترل جاري اشاره كنم

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

                    کامنت

                    • m_d6712

                      • 2010/05/22
                      • 174

                      #11
                      RE: چگونه در vba به كنترل جاري اشاره كنم

                      نوشته اصلی توسط mahasa shayesteh
                      مرسی از توضیحات میشه لطفا برای همین کمبوباکس یه نمونه بذارید ببینم چه اتفاقی میفته ببخشیدا زیاد سوال میپرسم
                      نه اتفاقا سوال بجایی بود. البته من متوجه شدم که label اصلا نمی تواند active شود.
                      متاسفانه این ایراد از من بود. خیلی با قوانین VBA آشنا نیستم. گاهی وقتا رکب می خورم.

                      اما در صورتی که از textbox استفاده می کنید می توانید از این روش استفاده کنید.
                      در برخی مواقع خود مفسر قادر به تشخیص دگر شکل های یک شی می باشد. که معمولا در اکسل این طور هست. (خیلی وقتا خودتون تجربه کردید همه چیزو میشه تبدیل کنین به چیزای دیگه). اما گاهی وقتا این اتفاق نمی افتد و ارور خواهید دید. حداقل واسه اون موقع ها اطلاعاتی کسب کردید.


                      اما در این مورد خاص اکسل دگرشکل رو تشخیص میده. خوب یک مقدار بد هست!!!! از لحاظ برنامه نویسی خطای منطقی برنامه شما رو خیلی بالا می برد. بهتر است اصولی کار کنید و از دگرریختی همون طور که توضیح دادم استفاده کنید.

                      همان طور که شما فرمودید MsgBox Me.ActiveControl.Text جواب می دهد و مشکلی ندارد.
                      اما text از مشخصه های پیش فرض نیست و ممکن است نابجا استفاده بشه و خطا ایجاد کنه.

                      از آنجایی که VBA با نسخه VB6 هماهنگ شده این اتفاقات خیلی زیاد رخ میدهد.
                      اما در نسخه های بعدی ویژوال بیسیک 2003-2010 این فرآیند تصحیح شده و امکان پذیر نیست.

                      ممنون خانم شایسته، اصرار شما باعث شد اشتباه خودم رو اصلاح کنم.

                      موفق باشید.
                      -------
                      http://md6712.com
                      جامعه ایده پردازان: http://idekadeh.com

                      کامنت

                      • alisabet

                        • 2011/09/08
                        • 159

                        #12
                        RE: چگونه در vba به كنترل جاري اشاره كنم

                        با عرض تشكر از جناب داروي

                        با در نظر گرفتن فرمايشات شما و با توجه به سوال من در پست 1 نميتوانم از تغيير كپشن ليبل استفاده كنم چون ليبل دستور اكتيو را نمي پذيرد
                        خوب حالا ايا من ميتوانم بجاي ليبل از commandbutton استفاده كنم ؟
                        اگه امكان داره شكل صحيح كد زير بنويسيد


                        Private Sub CommandButton1_Click()
                        Me.ActiveControl.Caption = Application.WorksheetFunction.Now()
                        End Sub

                        کامنت

                        • m_d6712

                          • 2010/05/22
                          • 174

                          #13
                          RE: چگونه در vba به كنترل جاري اشاره كنم

                          نوشته اصلی توسط alisabet
                          با عرض تشكر از جناب داروي

                          با در نظر گرفتن فرمايشات شما و با توجه به سوال من در پست 1 نميتوانم از تغيير كپشن ليبل استفاده كنم چون ليبل دستور اكتيو را نمي پذيرد
                          خوب حالا ايا من ميتوانم بجاي ليبل از commandbutton استفاده كنم ؟
                          اگه امكان داره شكل صحيح كد زير بنويسيد


                          Private Sub CommandButton1_Click()
                          Me.ActiveControl.Caption = Application.WorksheetFunction.Now()
                          End Sub
                          سلام من کد زیر را امتحان کردم پاسخ مورد نظر رو گرفتم.:

                          Private Sub CommandButton1_Click()
                          Me.ActiveControl.Caption = Now()
                          End Sub

                          Private Sub CommandButton2_Click()
                          Me.ActiveControl.Caption = Now()
                          End Sub

                          Private Sub CommandButton3_Click()
                          Me.ActiveControl.Caption = Now()
                          End Sub

                          اگر بد متوجه شدم منظور شمارو لطفا بفرمایید.
                          -------
                          http://md6712.com
                          جامعه ایده پردازان: http://idekadeh.com

                          کامنت

                          • alisabet

                            • 2011/09/08
                            • 159

                            #14
                            RE: چگونه در vba به كنترل جاري اشاره كنم

                            كاملاً درسته كد شما درسته اوني كه من نوشته بودم غلط بود خيلي ممنون

                            کامنت

                            • MEYTI

                              • 2010/11/11
                              • 362

                              #15
                              RE: چگونه در vba به كنترل جاري اشاره كنم

                              با تشکر و کسب اجازه از جناب داوری
                              شما میتونی همین کدو به صورت زیر توی ماکرو بنویسی بعد در رویداد کلیک همه commandbutton ها این ماکرو رو صدا بزنی
                              کد PHP:
                              Sub MMM()
                              UserForm1.ActiveControl.Caption Now()
                              End Sub 
                              مهدی کریمی

                              کامنت

                              Working...