2016-04-25 5 views
8

मुझे एक्सेल से पावरपॉइंट, स्लाइड प्रति एक पृष्ठ से कुछ बड़ी डेटा श्रेणियां निर्यात करना है, और निश्चित रूप से मुझे "अनाथ" पंक्तियों या स्तंभों से बचने के लिए पेज ब्रेक का इलाज करना चाहिए।एक्सेल को पृष्ठ ब्रेक को सही तरीके से गिनने के लिए "मजबूर" कैसे कर सकता हूं?

मैं,,, कितने पृष्ठों मैं होता जाँच करने के लिए कोशिश कर रहा हूँ अनुलंब और क्षैतिज किसी दिए गए ज़ूम के साथ HPageBreaks.Count और VPageBreaks.Count पढ़कर, और फिर मैन्युअल रूप से प्रत्येक को तोड़ने की स्थिति को परिभाषित। विचार प्रत्येक पृष्ठ पर लगभग समान चौड़ाई और ऊंचाई होना है।

जब मैं अपना कोड चरण-दर-चरण डीबग करता हूं, तो यह अच्छी तरह से चलता है, और तर्क ठीक लगता है, लेकिन अगर मैं इसे "स्वतंत्र रूप से" चलाता हूं, तो पेज ब्रेक पूरी तरह से बंद हो जाता है। कुछ MsgBox निर्देश जोड़ना, मैं देख सकता हूं कि जब मैं HPageBreaks.Count (या लंबवत) पढ़ता हूं तो मुझे गलत मान मिलते हैं। (यदि मैं मैन्युअल रूप से कोड करता हूं तो मैं सही लोगों की जांच कर सकता हूं)।

कई सारे मंचों पर खोज, मुझे पेपरसाइज (ws.PageSetup.PaperSize = ws.PageSetup.PaperSize) के रीसेट को मजबूर करने जैसे कुछ बदसूरत कामकाज दिखाई देते हैं। उनमें से कुछ की कोशिश करने के बाद, थोड़ा बेहतर काम करना प्रतीत होता था कि पेजसेटअप में बदलाव से पहले प्रिंट कम्यूनिकेशन को बंद करना था, और फिर इसे चालू करना था। यह मेरा चादरों से ज्यादातर पर अच्छी तरह से काम किया, लेकिन वास्तव में बड़े लोगों पर (~ 750 पंक्तियों x 80 कॉलम, सूत्रों के साथ लगभग सभी कोशिकाओं), यह बस नहीं करता है।

यहाँ कोड के एक उद्धरण:

'Reset page breaks 
    .ResetAllPageBreaks 

    'Set minimum acceptable zoom factor 
    Application.PrintCommunication = False 'This is the ugly workaround 
    .PageSetup.Zoom = 60 
    Application.PrintCommunication = True 

    MsgBox "Zoom = " & .PageSetup.Zoom 'Only for debugging 

    'Calculate the number of pages in width 
    Application.PrintCommunication = False 
    NPagesWide = .VPageBreaks.Count + 1 
    Application.PrintCommunication = True 

    MsgBox "NPagesWide = " & NPagesWide 

    'Find the higher zoom factor that can fit that number of pages 
    Application.PrintCommunication = False 
    .PageSetup.Zoom = 100 
    Application.PrintCommunication = True 
    Do While .VPageBreaks.Count > NPagesWide - 1 
     Application.PrintCommunication = False 
     .PageSetup.Zoom = .PageSetup.Zoom - 5 
     Application.PrintCommunication = True 
    Loop 

    MsgBox "Zoom = " & .PageSetup.Zoom 

    'Set average width per page and initialize column pointer 
    If HasTitleColumns Then  'Defined earlier 
     PageWidth = (PrintArea.Width + TitleColumns.Width * (NPagesWide - 1))/NPagesWide 
     j = TitleColumns.Columns(TitleColumns.Columns.Count).Column + 1 
    Else 
     PageWidth = PrintArea.Width/NPagesWide 
     j = 1 
    End If 

    'Cycle vertical page breaks 
    For i = 1 To NPagesWide - 1 
     'Set width of TitleColumns 
     If HasTitleColumns Then 
      CumulWidth = TitleColumns.Width 
     Else 
      CumulWidth = 0 
     End If 
     'Cumulate columns width until the available page width 
     Do While CumulWidth + .Columns(j).Width <= PageWidth 
      CumulWidth = CumulWidth + .Columns(j).Width 
      j = j + 1 
     Loop 
     'Add the break 
     .VPageBreaks.Add .Columns(j + 1) 
    Next i 

कोई भी विचार क्यों ऐसा होता है, और मैं इसे कैसे हल कर सकते हैं?

धन्यवाद,

+0

कोई विचार? किसी भी आलोचना की सराहना की जाएगी! – Edgard

+0

क्या आपने उस लाइन के बाद 'DoEvents' जोड़ने का प्रयास किया था जहां आप ज़ूम बदलते हैं? आम तौर पर मैं इसकी अनुशंसा नहीं करता हूं, लेकिन इन मामलों में ऐसा लगता है कि अगली कमांड लेने से पहले कार्रवाई पूरी नहीं हुई है, इससे मुझे कुछ असफल रहस्यों से बाहर खींच लिया गया। अगर यह काम करता है तो मैं इसे एक उत्तर में बना सकता हूं। – ib11

उत्तर

2

मैं इस मुद्दे जब VBA कोड ठीक काम करता है, जबकि डिबग मोड में F8 मार करने के लिए सामान्य सलाह का प्रस्ताव है, लेकिन यह पूरी मैक्रो को चलाने के लिए F5 से टकराने के बाद काम नहीं नहीं है।

संकेत 1. उचित शीट का संदर्भ देने के लिए ActiveWorkbook.ActiveSheet के बजाय ThisWorkbook.ActiveSheet का उपयोग करें। के बजाय ThisWorkbook.Application का उपयोग करें यह हो सकता है कि आपके पास पृष्ठभूमि में काम करने वाला एक और एडिन प्रोग्राम हो, ActiveSheet को किसी और चीज पर स्विच करना जो आपको पता न हो। अन्य मैक्रोज़ सक्षम करें और किसी भी चीज से छुटकारा पाएं जिसका आप उपयोग नहीं करते हैं। तो कुछ भी अपने कोड में महत्वपूर्ण है इससे पहले, ThisWorkbook.Activate के साथ अपने पत्रक के लिए ध्यान केंद्रित करने की कोशिश। अलग तरह से तो DoEvents में प्रतीक्षा करने के लिए http://analystcave.com/vba-tip-day-activeworkbook-vs-thisworkbook/

सुझाव 2. फोर्स एक्सेल: उस पृष्ठ पर ग्राफ देखें।

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'Place this line of code at the very top of module 
Sleep 1 'This will pause execution of your program for 1 ms 

https://stackoverflow.com/a/3891017/1903793 https://www.fmsinc.com/microsoftaccess/modules/examples/AvoidDoEvents.asp

या वैकल्पिक रूप से:

Application.Calculate 
If Not Application.CalculationState = xlDone Then 
    DoEvents 
End If 

https://stackoverflow.com/a/11277152/1903793

सुझाव 3. ऊपर अभी भी ताज़ा उपयोग के लिए काम नहीं करता है:

ThisWorkbook.Connections("ConectionName").Refresh 
ThisWorkbook.Application.CalculateUntilAsyncQueriesDone 

https://stackoverflow.com/a/26780134/1903793

संबंधित मुद्दे

 संबंधित मुद्दे