مشکل در اجرا نشدن Workbook_BeforePrint

Collapse
این تاپیک قفل است.
X
X
 
  • زمان
  • نمایش
حذف همه
new posts
  • savior144

    • 2014/05/15
    • 11

    [حل شده] مشکل در اجرا نشدن Workbook_BeforePrint

    سلام
    من یه مشکلی دارم. از مدیران و متخصصان انجمن تقاضا دارم کمکم کنن:
    از اکسل 2010 استفاده میکنم.
    توی قسمت Workbook_BeforePrint یکسری تنظیمات مربوط به هدر و فوتر رو اعمال کردم.(مثل RightFooter و LeftHeader)
    وقتی ازطریق خود اکسل پرینت میگیرم، هدر و فوتر اعمال میشن، ولی وقتی ازطریق فشاردادن یک دگمه و تابع PrintOut میخوام پرینت بگیرم، هیچکدوم از تنظیمات هدر و فوتر اعمال نمیشن.
    خیلی تلاش کردم ولی جواب نمیده. آیا راهی داره ؟یا کلاً خصوصیتش به اینصورته و نمیشه کاریش کرد؟
    دوستان اگر کمک کنن ممنون میشم.
    Last edited by savior144; 2015/09/10, 02:45.
  • iranweld

    • 2015/03/29
    • 3341

    #2
    با سلام

    فایل نمونه را ضمیمه و ارسال بفرمایید

    کامنت

    • savior144

      • 2014/05/15
      • 11

      #3
      سلام
      فایل نمونه پیوست شد.
      همونطور که گفتم وقتی ازطریق فشردن دگمه و تابع PrintOut پرینت میگیرم، تنظیمات هدر و فوتر در Workbook_BeforePrint اعمال نمیشه. ولی از طریق خود اکسل پرینت میگیرم، اعمال میشه.
      ممنونم
      فایل های پیوست شده

      کامنت

      • iranweld

        • 2015/03/29
        • 3341

        #4
        با سلام
        در فایل شما هیچ هدر یا فوتری وجود ندارد که نمایش داده شود
        در فایل پیوست هدر اضافه گردیده و در هر دو حالت نمایش داده شده و در پرینت هم چاپ میشود
        فایل های پیوست شده

        کامنت

        • savior144

          • 2014/05/15
          • 11

          #5
          نوشته اصلی توسط iranweld
          با سلام
          در فایل شما هیچ هدر یا فوتری وجود ندارد که نمایش داده شود
          در فایل پیوست هدر اضافه گردیده و در هر دو حالت نمایش داده شده و در پرینت هم چاپ میشود
          ممنون از وقتی که گذاشتید.
          من شاید نمیتونم منظورم رو واضح بگم. فکر میکنم شما به کدهای اکسل نگاه ننداختید و فقط ظاهرش رو ملاحظه فرمودید.
          ببینید: در فایلی که من تو پست اولم گذاشتم، یه Button وجود داره که درصورت کلیک کد زیر اجرا میشه:
          Sheet1.PrintOut preview:=True
          در قسمت Workbook_BeforePrint هم کد زیر رو گذاشتم:
          Sheet1.PageSetup.LeftHeader = "Left Header"
          Sheet1.PageSetup.LeftFooter = "Left Footer"

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

          کامنت

          • iranweld

            • 2015/03/29
            • 3341

            #6
            نوشته اصلی توسط savior144
            ممنون از وقتی که گذاشتید.
            من شاید نمیتونم منظورم رو واضح بگم. فکر میکنم شما به کدهای اکسل نگاه ننداختید و فقط ظاهرش رو ملاحظه فرمودید.
            ببینید: در فایلی که من تو پست اولم گذاشتم، یه Button وجود داره که درصورت کلیک کد زیر اجرا میشه:
            Sheet1.PrintOut preview:=True
            در قسمت Workbook_BeforePrint هم کد زیر رو گذاشتم:
            Sheet1.PageSetup.LeftHeader = "Left Header"
            Sheet1.PageSetup.LeftFooter = "Left Footer"

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

            کدها را به داخل ماکرو منتقل کنید

            کد PHP:
            Sub Button1_Click()
            Sheet1.PageSetup.LeftHeader "Left Header"
            Sheet1.PageSetup.LeftFooter "Left Footer"
            Sheet1.PrintOut preview:=True
            'Sheet1.PrintPreview
            End Sub 

            کامنت

            • savior144

              • 2014/05/15
              • 11

              #7
              نوشته اصلی توسط iranweld
              با سلام

              کدها را به داخل ماکرو منتقل کنید

              کد PHP:
              Sub Button1_Click()
              Sheet1.PageSetup.LeftHeader "Left Header"
              Sheet1.PageSetup.LeftFooter "Left Footer"
              Sheet1.PrintOut preview:=True
              'Sheet1.PrintPreview
              End Sub 
              مرسی از توجهتون
              ببینید استاد گرامی: من میدونم این کدی رو که جنابعالی نوشتید اگر بذارید داخل قسمت Button1_click عملا میکنه. ولی من میخوام ببینم چرا همین کد تو قسمت BeforePrint عمل نمیکنه؟ درواقع من احتیاج دارم این کد تو قسمت BeforePrint عمل کنه. سوالم اینه چرا اینجوریه؟ راهی داره؟ و آیا این ایراد اکسله؟!!...
              فکر کنم اینبار دیگه واضح مشکل و سوالمو بیان کردم.
              سپاس

              کامنت

              • majid_mx4

                • 2012/06/25
                • 699

                #8
                با سلام
                ضمن تشکر از دوست عزیزم جناب آقای Iranweld و پاسخ صحیح ایشان

                دوست عزیز

                شما دستور خود را در ThisWorkbook نوشته اید و بخصوص از خاصیت BeforePrint استفاده کرده اید و این دو باعث این پیامد شده است .

                توضیح بیشتر : و قتی که شما در ThisWorkbook دستوری نوشته اید هیچ اتفاقی تا زمانی که آن دستور طبق خواسته شما BeforePrint انجام نگیرد نمی افتد یعنی شما دستور داده اید که در زمانی قبل از پرینت هدر و فوتر اضافه شوند خوب این عمل زمانی انجام می گیرد که شما از پرینت استفاده کنید .
                حال در دستور دکمه خود پرینت پری ویو گذاشتید که هیچ ربطی به هدر و فوتر ندارد و فقط پیش نمایش فایل را نشان می دهد .
                اگر میخواهید هرد دو کار کند یا از دستور جناب آقای Iranweld استفاده کنید یا دستور زیر را به ThisWorkbook اضافه کنید.



                کد:
                Private Sub Workbook_Open()
                Sheet1.PageSetup.LeftHeader = "Left Header"
                Sheet1.PageSetup.LeftFooter = "Left Footer"
                End Sub
                ویا بهتر است BeforePrint را در خط اول دستوراتان Call کنید .
                برای تایید حرفهای بالا : دکمه روی صفحه را فشار دهید می بینید که هیچ اتفاقی نمی افتد ، حال یکبار پرینت بگیرید( یا حالت پرینت و حتما نیازی به پرینت گرفتن نیست میتوانید آنر ا کنسل کنید ) و حالا دکمه روی صفحه را فشار دهید . می بیند دستورات اعمال شده در واقع دستورات در Thsiworkbook عمل کرده نه دکمه شما .

                امیدوارم کمکی کرده باشم

                با تشکر میر

                کامنت

                • savior144

                  • 2014/05/15
                  • 11

                  #9
                  نوشته اصلی توسط majid_mx4
                  با سلام
                  ضمن تشکر از دوست عزیزم جناب آقای Iranweld و پاسخ صحیح ایشان

                  دوست عزیز

                  شما دستور خود را در ThisWorkbook نوشته اید و بخصوص از خاصیت BeforePrint استفاده کرده اید و این دو باعث این پیامد شده است .

                  توضیح بیشتر : و قتی که شما در ThisWorkbook دستوری نوشته اید هیچ اتفاقی تا زمانی که آن دستور طبق خواسته شما BeforePrint انجام نگیرد نمی افتد یعنی شما دستور داده اید که در زمانی قبل از پرینت هدر و فوتر اضافه شوند خوب این عمل زمانی انجام می گیرد که شما از پرینت استفاده کنید .
                  حال در دستور دکمه خود پرینت پری ویو گذاشتید که هیچ ربطی به هدر و فوتر ندارد و فقط پیش نمایش فایل را نشان می دهد .
                  اگر میخواهید هرد دو کار کند یا از دستور جناب آقای Iranweld استفاده کنید یا دستور زیر را به ThisWorkbook اضافه کنید.



                  کد:
                  Private Sub Workbook_Open()
                  Sheet1.PageSetup.LeftHeader = "Left Header"
                  Sheet1.PageSetup.LeftFooter = "Left Footer"
                  End Sub
                  ویا بهتر است BeforePrint را در خط اول دستوراتان Call کنید .
                  برای تایید حرفهای بالا : دکمه روی صفحه را فشار دهید می بینید که هیچ اتفاقی نمی افتد ، حال یکبار پرینت بگیرید( یا حالت پرینت و حتما نیازی به پرینت گرفتن نیست میتوانید آنر ا کنسل کنید ) و حالا دکمه روی صفحه را فشار دهید . می بیند دستورات اعمال شده در واقع دستورات در Thsiworkbook عمل کرده نه دکمه شما .

                  امیدوارم کمکی کرده باشم

                  با تشکر میر
                  سلام و ممنون از توضیحات جنابعالی
                  تمامی فرمایشات شما تایید میشه.
                  من از پرینت پریویو استفاده نکردم...خب حالا اگر شما حتی از تابع printout خالی هم استفاده کنید باز جواب نمیده.
                  مگه BeforePrint وظیفش این نیست که قبل از انجام پرینت کدهای نوشته شده رو اجرا کنه؟ حالا نباید فرقی کنه که از طریق اکسل مستقیماً پرینت بگیرید و یا از طریق تابع PrintOut و از جای دیگه دستور پرینت رو بدید.
                  من برای رویداد کلیک دگمه Button1، کد Sheet1.PrintOut رو نوشتم.
                  حالا منطقی اینه که قبل از گرفتن پرینت، اکسل بیاد و کدهای نوشته شده در BeforePrint رو اجرا کنه و سپس پرینت بگیره! خب دگمه منم دستور پرینت میده دیگه! ولی در کمال تعجب بعد از گرفتن پرینت میبینم که هدر و فوترو اعمال نکرده.
                  حالا اگر مستقیما از طریق خود اکسل پرینت بگیریم، تنظیمات هدر و فوتر قید شده در BeforePrint اعمال میشه و در فایل ذخیره میشه، وخب طبیعتا دفعه بعد که من بخوام از دگمه خودم استفاده کنم، میبینم که اونا اعمال شدن.
                  مرسی از توجه شما

                  کامنت

                  • majid_mx4

                    • 2012/06/25
                    • 699

                    #10
                    با سلام

                    خیر دوست عزیز

                    وقتی فایل شما برای اولین بار باز میشود هیج هدر و فوتری اعمال نشده است . پس هر دستوری برای پرینت (به غیراز استفاده از پرینت خود اکسل ) هدر و فوتر شما را فعال نمیکند در اصل اکسل اصلا هر انچه که در فایل اعمال شده را printout میکند نه انچه اعمال نشده .

                    برای تست یکبار با خود اکسل پرینت بگیرید مانند پست قبلی ( میتوانید کنسل کنید ) حال printout را استفاده نمایید.

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

                    خلاصه مطلب اینکه چون فایل شما در ابتدا (باز شدن فایل ) هیچ تغییری در هدر و فوتر نمی دهد دیگر دستورات که فرمودید فقط آنچه که اعمال شده است را نمایش می دهند و تا زمانی که هدر و فوتر به فایل اعمال نشود دیگر دستورات توانایی شناسایی آن را نخواهند داشت در واقع چیزی نیست که بخواهند نمایش بدهند. بعد از اولین اعمال همه این دستورات نیز هدر و فوتر را شناسایی کرده و نمایش می دهند.( در واقع شما باید با باز شدن فایل برای اولین بار دستورات هدر و فوتر را اعمال و یا در خط اول قبل از pritnout این دستورات را اضافه کنید )


                    با تشکر میر

                    کامنت

                    • savior144

                      • 2014/05/15
                      • 11

                      #11
                      نوشته اصلی توسط majid_mx4
                      با سلام

                      خیر دوست عزیز

                      وقتی فایل شما برای اولین بار باز میشود هیج هدر و فوتری اعمال نشده است . پس هر دستوری برای پرینت (به غیراز استفاده از پرینت خود اکسل ) هدر و فوتر شما را فعال نمیکند در اصل اکسل اصلا هر انچه که در فایل اعمال شده را printout میکند نه انچه اعمال نشده .

                      برای تست یکبار با خود اکسل پرینت بگیرید مانند پست قبلی ( میتوانید کنسل کنید ) حال printout را استفاده نمایید.

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

                      خلاصه مطلب اینکه چون فایل شما در ابتدا (باز شدن فایل ) هیچ تغییری در هدر و فوتر نمی دهد دیگر دستورات که فرمودید فقط آنچه که اعمال شده است را نمایش می دهند و تا زمانی که هدر و فوتر به فایل اعمال نشود دیگر دستورات توانایی شناسایی آن را نخواهند داشت در واقع چیزی نیست که بخواهند نمایش بدهند. بعد از اولین اعمال همه این دستورات نیز هدر و فوتر را شناسایی کرده و نمایش می دهند.( در واقع شما باید با باز شدن فایل برای اولین بار دستورات هدر و فوتر را اعمال و یا در خط اول قبل از pritnout این دستورات را اضافه کنید )


                      با تشکر میر
                      با تشکر
                      خب پس نتیجه مشخص شد:
                      اگر دستور پرینت یک شیت رو بخواهیم از جای دیگه ای بجز خود اکسل توسط تابع PrintOut صادر کنیم، اکسل تمامی دستورات گروه PageSetup رو که در قسمت BeforePrint نوشته میشن رو نادیده میگیره و اصلاً به فایل اعمال نمیکنه!
                      منم با تست های زیاد به این نتیجه رسیده بودم، کدهای مختلفی رو تو BeforePrint مینوشتم و دستور PrintOut رو اجرا میکردم و اجرا میشدن، ولی دستورات گروه PageSetup اجرا نمیشدند.
                      فکر کردم شاید راه بخصوصی داشته باشه و من بلد نباشم و خواستم از اساتید کمک بگیرم. اگر نتیجه گیری من درست هست، بفرمایید تا وضعیت این موضوع رو به "حل شده" تغییر بدم.
                      از اساتید محترم گروه هم ممنونم که کمک کردند.

                      کامنت

                      • majid_mx4

                        • 2012/06/25
                        • 699

                        #12
                        با سلام

                        تقریبا درسته

                        دوست عزیز

                        نوشتن دستورات (ماکرو در هر قسمتی چه beforprint ویا .... ) کافی نیست بلکه باید ان دستور را فعال کرد (call یا Run ، احرا کرد )و صرف نوشتن دستورات دلیلی برا اجرای آن نمی شود در واقغ وقتی به وسیله خود اکسل پرینت میگرید طبق خاصیت خود اکسل تمامی دستورات احتمالی در vba را چک کرده و سپس printout میکنه پس قبل از پرینت بنا به خاصیت این دستور ماکروی beforprint را اجرا (run )و سپس دستور printout را می دهد .

                        در صورتیکه pritout طبق خاصیت خودش عمل میکند و فقط پرینت با تنظیم های اعمال شده و یا نشده پرینت میگرد.و موضوع نادیده گرفتن دستورات گروه pagesetup نیست موضوع اینه که اصلا دستوری اجرا نشده یعنی Beforprint فعال نشده است .

                        دستور Beforprint : اجرایی کردن تغییرات قبل از پرینت ( هدر ،فوتر، تنظیمات حاشیه ها و ....البته با دستورات خاص خودشان)

                        دستور printout : پرینت تغییرات اعمال شده (نه اعمال تغییرات )

                        یک مثال می زنم : کار شما دقیقا ( با یک کم تغییر ) مثل این میمونه
                        اگه شما در شیت اکسل ( در خانه های آن ) چیزی ننویسید در پرینت هیچی نخواهید داشت حال اگر در خانه ای چیزی بنویسید هنگام پرینت عین نوشته های شما پرینت میشود ایا میتوان توقع داشت دستور پرینت شما اصلاعات داخل شیت شما را تغییر دهد دستور printout شما هیچ دخل و تصرفی در نوشته های شما نداشته و نباید هم داشته باشد.


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

                        اگر به پاسخ خود رسیدید لطفا حل شده را بزنید
                        با تشکر میر
                        Last edited by majid_mx4; 2015/09/11, 00:46.

                        کامنت

                        • savior144

                          • 2014/05/15
                          • 11

                          #13
                          نوشته اصلی توسط majid_mx4
                          با سلام

                          تقریبا درسته

                          دوست عزیز

                          نوشتن دستورات (ماکرو در هر قسمتی چه beforprint ویا .... ) کافی نیست بلکه باید ان دستور را فعال کرد (call یا Run ، احرا کرد )و صرف نوشتن دستورات دلیلی برا اجرای آن نمی شود در واقغ وقتی به وسیله خود اکسل پرینت میگرید طبق خاصیت خود اکسل تمامی دستورات احتمالی در vba را چک کرده و سپس printout میکنه پس قبل از پرینت بنا به خاصیت این دستور ماکروی beforprint را اجرا (run )و سپس دستور printout را می دهد .

                          در صورتیکه pritout طبق خاصیت خودش عمل میکند و فقط پرینت با تنظیم های اعمال شده و یا نشده پرینت میگرد.و موضوع نادیده گرفتن دستورات گروه pagesetup نیست موضوع اینه که اصلا دستوری اجرا نشده یعنی Beforprint فعال نشده است .

                          دستور Beforprint : اجرایی کردن تغییرات قبل از پرینت ( هدر ،فوتر، تنظیمات حاشیه ها و ....البته با دستورات خاص خودشان)

                          دستور printout : پرینت تغییرات اعمال شده (نه اعمال تغییرات )

                          یک مثال می زنم : کار شما دقیقا ( با یک کم تغییر ) مثل این میمونه
                          اگه شما در شیت اکسل ( در خانه های آن ) چیزی ننویسید در پرینت هیچی نخواهید داشت حال اگر در خانه ای چیزی بنویسید هنگام پرینت عین نوشته های شما پرینت میشود ایا میتوان توقع داشت دستور پرینت شما اصلاعات داخل شیت شما را تغییر دهد دستور printout شما هیچ دخل و تصرفی در نوشته های شما نداشته و نباید هم داشته باشد.


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

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

                          کامنت

                          چند لحظه..