2017-06-19 7 views
5

आप निम्नलिखित कोड आप काफी एक दिलचस्प परिणाम प्राप्त (केवल PowerPoint चल साथ, चल रहा से पहले Excel के पास सभी उदाहरणों) चलाते हैं:पावरपोइंट VBA - एंबेडेड एक्सेल OLE ऑब्जेक्ट में टेबल की editting स्तंभ नाम

'Optional - Include the "Microsoft Excel 16.0 Object Library" 
Option Explicit 

Public Sub test()  
    Dim oslide As slide 
    Set oslide = ActivePresentation.Slides.add(1, ppLayoutBlank) 

    Dim oshape As Shape 
    Set oshape = oslide.Shapes.AddOLEObject(30, 30, 50, 50, "Excel.Sheet") 

    oshape.OLEFormat.Object.Sheets(1).ListObjects.add(1) 'xlSrcRange 
    oshape.OLEFormat.Object.Sheets(1).Cells(1, 1) = "fewewq" 

    oshape.OLEFormat.Object.Close 
End Sub 

एम्बेडेड ऑब्जेक्ट सफलतापूर्वक बनाया गया है और निर्दिष्ट डेटा के साथ तालिका मौजूद है। हालांकि, जब आप एम्बेडेड वस्तु आपको निम्न त्रुटि प्राप्त पर क्लिक करें:

enter image description here

There isn't enough memory available to read Worksheet.

इस वस्तु नहीं रह किसी अन्य तरीके से पहुँचा जा सकता है, और वस्तु की भ्रष्ट प्रकृति पर करीब/खुला बनी रहती है दस्तावेज़ और पुनरारंभ करें। मैंने सत्यापित किया है कि यह समस्या सभी पर होती है लेकिन एक सिस्टम जिसे मैंने परीक्षण किया है (पावरपॉइंट/एक्सेल 2016, विंडोज 7 एक्स 64)।

प्रश्न

तो मेरे सवाल का, किसी और को इस पुन: पेश कर सकते हैं, और यदि हां क्यों हो रहा है? आप लाइन को बदलते हैं "कोशिकाओं (1, 1)" को "कोशिकाओं (2, 1)" वहाँ कोई समस्या नहीं है, ऐसा लगता है जैसे कि संपादन तालिका के सिर कि पंक्तियों या संपादन से अलग है विशेष व्यवहार के कुछ प्रकार का कारण बनता है अन्य कोशिकाएं

रिसर्च

  • वहाँ वास्तव में इस बारे में लिखा आवंटित नहीं है, सामान के सबसे इस विशेष मुद्दे से संबंधित नहीं है।

  • This post दावा करता है कि यह बहुत सारे फ़ॉन्ट के स्थापित (> 600) के साथ एक मुद्दा है। मैं इस परीक्षण किया है, मैं केवल 241 स्थापित ...

  • कोई जवाब (this, this, this, और this) के साथ पदों की एक पूरी बहुत सारे है वहाँ पर जाने के लिए आवंटित नहीं।

  • some posts हैं जो पूरी तरह से असंबंधित हैं, फिर पर जाने के लिए आवंटित नहीं हैं।

  • मैं एमएस वर्ड में एक ही कोड परीक्षण किया है, ठीक से काम करने लगता है, इस मुद्दे को लगता है PowerPoint

  • के लिए अलग मैं कोड (टूटी हुई वस्तु) में एक संस्करण कर की कोशिश की है, और एक अन्य हाथ से (काम करने वाली वस्तु), उन्हें बचाने और बाइनरी आउटपुट की तुलना (of only the embedded objects)। यह अच्छा लगता है, लेकिन यह मुझे कोई और अंतर्दृष्टि प्रदान नहीं करता है। मैं Excel के साथ एम्बेडेड ऑब्जेक्ट्स को अलग से नहीं खोल सकता क्योंकि ऑब्जेक्ट proprietary format में संग्रहीत किए जाते हैं। बाइनरी का केंद्रीय क्षेत्र अलग दिखाई देता है, लेकिन मुझे यकीन नहीं है कि कैसे या क्यों। अब तक मैंने इसे मानव पठनीय जानकारी में डीकोड करने का कोई तरीका नहीं खोजा है।

  • After a significant delay and with proper attribution, मैंने इसे the Microsoft forums पर पोस्ट किया है। शायद किसी के पास कुछ अंतर्दृष्टि है। मैं सक्रिय रूप से दोनों पदों को बनाए रखूंगा। अगर मैं 100% आश्वस्त था तो यह एक बग था, मैं opening an issue here पर भी विचार कर सकता हूं।

  • आप पूरी तरह से कभी OLEObject बंद करने नहीं द्वारा इस समस्या से बचने कर सकते हैं, इस वर्ष 2010 में समस्याओं का कारण बनता है, खासकर जब जुड़े चार्ट व्यवहार के साथ संयुक्त, आप अनाथ हो एक्सेल खिड़कियों का प्रदर्शन किया। एक अच्छा उपयोगकर्ता अनुभव नहीं है।मुझे लगता है कि मैं पृष्ठभूमि में एक छिपी हुई एक्सेल विंडो खोल सकता हूं और फिर जब मैं एम्बेडेड चीजों पर काम कर रहा हूं तो समाप्त हो जाता है ...

  • मैं संस्करण चला रहा हूं: माइक्रोसॉफ़्ट ऑफिस 365 प्रोप्लस: संस्करण 1705 (बिल्ड 8201.3103 क्लिक-टू -रुन), लेकिन मैंने माइक्रोसॉफ्ट ऑफिस स्टैंडर्ड 2010, संस्करण 14.0.7015.1000 (32-बिट) पर भी समस्या देखी है। तालिका के साथ समस्या कार्यालय के हर दूसरे संस्करण पर समान प्रतीत होती है, हालांकि मुझे आश्चर्य है कि क्या यह कार्यालय के 2010 के पूर्व संस्करणों को प्रभावित करता है?

    'Include the "Microsoft Excel 16.0 Object Library" 
    Option Explicit 
    
    Sub test() 
        Dim sld As slide 
        Dim shp As Shape 
        Dim pptWorkbook As Workbook 
    
        Set sld = ActivePresentation.Slides.Add(1, ppLayoutBlank) 
        Set shp = sld.Shapes.AddChart 
        Set pptWorkbook = shp.Chart.ChartData.Workbook 
        pptWorkbook.Close SaveChanges:=True 
    
        Set pptWorkbook = shp.Chart.ChartData.Workbook 
        pptWorkbook.Sheets(1).Cells(1, 2) = "fewewq" 
    
        Application.ActivePresentation.Save 
        pptWorkbook.Close SaveChanges:=True 
    End Sub 
    

    आप शीर्ष लेख पंक्ति मूल्य बदलते हैं तो आपको नहीं रह गया है ("कोशिकाओं (1, 2 एम्बेडेड वस्तु का उपयोग कर सकते हैं:

अद्यतन 1

मैं चार्ट के साथ एक ही बात करने की कोशिश की) "), यदि आप एक और मूल्य बदलते हैं (" सेल (2, 1) ") यह ठीक चलता है। मुझे लगता है कि यह वही समस्या है, इस कोड को चलाने के बाद मैं चार्ट डेटा नहीं खोल सकता। अगर मैं यह तक पहुँचने का प्रयास प्रोग्राम के रूप में मैं निम्नलिखित त्रुटि मिलती है: 2016 पर

Run-time error '-2147467259 (80004005)':

Method 'Workbook' of object 'ChartData' failed

केवल एक मुद्दा है, हालांकि, मैं कुछ 2010 के लिए थोड़ा अलग करने की कोशिश की और किसी भी मुद्दे को नहीं देखा।

अद्यतन 2

मैं अंत में पता लगा कि मैं क्यों एक और सिस्टम पर इस मुद्दे को पुन: पेश नहीं कर सका। यह समस्या केवल तभी दिखाई देती है जब परिवर्तन के बाद एक्सेल के सभी उदाहरण बंद हो जाते हैं। इसका मतलब है कि यदि आप इस कोड को चलाते हैं तो आपके पास एक अलग (असंबंधित) एक्सेल विंडो खुलती है, तो आपको समस्या दिखाई नहीं देगी।

यह समस्या केवल जब PowerPoint अकेले चल रहा है reproduced किया जा सकता है, किसी भी अन्य एक्सेल स्प्रेडशीट खुला बिना।

+1

आशा है कि मैं आप पहले से ही आवेदन उत्कृष्टता प्राप्त करने संदर्भित किया है मान लेते हैं? किसी अन्य चीज़ पर listobject का नाम बदलने का प्रयास करें। 'मंद लो listobject' – Ibo

+0

@Ibo के रूप में, उन उत्कृष्ट सुझाव दिए गए हैं, मैं अपने प्रश्न संपादित किया है स्पष्ट होना करने के लिए और एक टिप्पणी में संदर्भ शामिल है, मैं" listObject "चर सभी को एक साथ हटा दें। –

+0

आपका कोड इस एमएसडीएन आलेख के समान है: [नया चार्ट ऑब्जेक्ट मॉडल के साथ पावरपॉइंट 2010 चार्ट बनाएं] (https://msdn.microsoft.com/en-us/library/office/ff973127 (v = office.14)। एएसपीएक्स) सिवाय इसके कि आप 'शीट्स' का उपयोग कर रहे हैं और 'वर्कशीट्स' नहीं। – PatricK

उत्तर

1

मैं Windows10-64/Excel2013-64 पर लगातार आपकी समस्या को पुनः सकता है। यह एक बग है, हम केवल यह जांचने का प्रयास कर सकते हैं कि वास्तव में क्या गलत हो रहा है।

जब VBA के माध्यम से तालिका के हेडर को बदलने, ListColumn हठपूर्वक कि इसके नाम का अद्यतन करने के लिए मना कर दिया। यह तब होता है जब आप हेडर सेल या स्पष्ट रूप से ListColumn के नाम को बदलते हैं!

Public Sub Test() 
    Dim oslide As Slide 
    Set oslide = ActivePresentation.Slides.Add(1, ppLayoutBlank) 

    Dim oshape As Shape 
    Set oshape = oslide.Shapes.AddOLEObject(30, 30, 250, 250, "Excel.Sheet") 

    With oshape.OLEFormat.Object 
     .Sheets(1).ListObjects.Add 1, .Sheets(1).Range("B2:D5") ' <-- put it anywhere 


     .Sheets(1).ListObjects(1).ListColumns(1).Name = "fewewq" ' <-- whether like this 
     '.Sheets(1).Range("B2").Value = "fewewq"     ' <-- or like this 

     Debug.Print .Sheets(1).ListObjects(1).ListColumns(1).Range.Cells(1).Value 'fewewq 

     Debug.Print .Sheets(1).ListObjects(1).ListColumns(1).Name 
     ''''''''''''''' Still prints Column1 ! '''''''''''''''''' 

     .Close 
    End With 
End Sub 

परिणाम स्पष्ट है:: यह केवल यदि आप VBA से वर्कबुक को संपादित करने और हाथ से सेल को बदलने, लेकिन नहीं अद्यतन करता है, ListObject तालिका दूषित हो जाता है, क्योंकि यह आंतरिक रूप से स्तंभ नाम बचाया है (अर्थातColumn1) यह (हेडर fewewq है) शीर्षक में नहीं मिल रहा है कि। इससे मनाई गई बग की ओर जाता है, दुर्भाग्य से प्रदर्शित त्रुटि संदेश हमेशा सटीक नहीं होते हैं।

जब कोई एक्सेल इंस्टेंस पहले से चल रहा है, व्यवहार बदलता है और ListColumn का नाम अद्यतन करता है। ऐसा लगता है कि "घटक" जो हेडर हेडर संपादित होने पर तालिका के आंतरिक डेटा को अद्यतन करता है, PowerPoint VBA के अंदर संपादन करते समय "लोड नहीं किया गया" है। केवल जब या तो:

  • आप हाथ

  • द्वारा यथा-स्थान पीपीटी, में कार्यपुस्तिका संपादित आप एक एक्सेल उदाहरण चल रहा है

आम कारक वहाँ कुछ है कि है संपादक घटक लोड किया गया है, और यह संपादक वह है जो हेडर संपादित होने पर आंतरिक तालिका के डेटा को अद्यतन करता है।

आपके उत्तर में पाया गया अच्छा कामकाज, जो कार्रवाई से पहले एक xlApp खोलना है, फिर इसे बाद में बंद करें, इन अवलोकनों के अनुरूप है।

महत्वपूर्ण रूप से, "अन्य" समस्या यह है कि Chart वस्तु (में अद्यतन 1) के साथ होता है वास्तव में एक ही समस्या आप सही तरीके से ग्रहण के रूप में है ("मुझे लगता है यह एक ही समस्या है")। बनाया चार्ट कार्यपत्रक में ListObject तालिका से जुड़ा हुआ है, और है कि तालिका पहली पंक्ति पर अपने शीर्ष लेख है। तो जब आप शीर्ष लेख में एक सेल बदलने के लिए, ListColumn के नाम को बदल नहीं करता है, एक ही corruptness समस्या के लिए अग्रणी।

अद्यतन: एक और, हल्के वैकल्पिक हल

उठाया एक पूर्व एक्सेल ऐप्लिकेशन खोलने के वैकल्पिक हल के लिए संबंधित चिंताओं टिप्पणियों के बाद, मैं एक "हल्का" वैकल्पिक हल खोजने के लिए कोशिश की और एक मिल गया।

आश्वस्त है कि यह समस्या तालिका में ListColumn के नाम को अपडेट करने में विफलता के कारण है, मुझे इसके नामों को अपडेट करने के लिए "इसे मजबूर करने" का एक तरीका मिला। वर्कअराउंड में दो चरणों में शामिल हैं:

तालिका की सीमा को एक कॉलम दाएं को विस्तृत करें, फिर इसे तुरंत मूल सीमा तक संक्षिप्त करें।

यह ऑपरेशन बस तालिका को अपने कॉलम नामों की पुन: गणना करने के लिए मजबूर करता है, और यही वह है! अब तालिका के कॉलम नाम सही हैं और समस्या गायब हो गई है।

Public Sub Workaround() 
    Dim oslide As Slide: Set oslide = ActivePresentation.Slides.Add(1, ppLayoutBlank) 
    Dim oshape As Shape: Set oshape = oslide.Shapes.AddOLEObject(30, 30, 250, 250, "Excel.Sheet") 

    With oshape.OLEFormat.Object.Sheets(1) 
    .ListObjects.Add 1 ' xlRange 
    .Range("A1").Value = "fewewq" 

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    ' Expand the table one column to the right than shrink it back 
    ' 
    With .ListObjects(1) 
     .Resize .Range.Resize(, .Range.Columns.Count + 1) 
     .Resize .Range.Resize(, .Range.Columns.Count - 1) 
    End With 
    ' 
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    End With 

    With oshape.OLEFormat.Object 
    Debug.Print .Sheets(1).ListObjects(1).ListColumns(1).Range.Cells(1).Value ' fewewq 
    Debug.Print .Sheets(1).ListObjects(1).ListColumns(1).Name ' Now prints fewewq ! 
    .Close 
    End With 
End Sub 

इस आपरेशन के बाद, आप सत्यापित कर सकते हैं कि एम्बेडेड कार्यपत्रक संपादन योग्य है, और आप तो बंद कर सकते हैं प्रस्तुतिकरण को खोलने और आप किसी भी मुद्दे नहीं मिलेगा। मैं इस मदद करता है :)

+1

मुझे खुशी है कि अन्य लोग इस मुद्दे को देख और पुन: उत्पन्न कर सकते हैं। हाँ, ऐसा लगता है कि यह एक बग है, हालांकि कार्यालय के कई संस्करणों में बड़े ऐप्स में अपना कामकाज बढ़ा रहा है अभी तक चुनौतीपूर्ण और अक्षम दोनों साबित हुए हैं। इसलिए मैं एमएस से कुछ प्रकार की आधिकारिक स्वीकृति में अभी भी दिलचस्पी है। कार्यालय और वीबीए हमेशा विकसित करने के लिए एक चुनौतीपूर्ण माहौल रहा है, मैं हमेशा [अजीब चीज़ों] में चल रहा हूं (https://stackoverflow.com/questions/38664351/unable-to-add-oleobject-in-powerpoint-when- सेल-इन-इन-एडिट-मोड-इन-सेपरेट-एक्सस) इस तरह है। शायद मैं एक्सेल उपयोगकर्ता आवाज पर एक सुझाव खोलूंगा। –

+0

@ डेविडरोगर्स कृपया मेरे कामकाज की कोशिश करें, और मुझे अपने विचार दें। मुझे लगता है कि यह "हल्का वजन" है और मेरे लिए पूरी तरह से काम करता है। धन्यवाद। –

+1

हां यह बेहतर तरीके से काम कर रहा है, मैं केवल ListObject लपेटता हूं। उप-स्थान पर रीसाइज करें जहां कहीं भी मैं हेडर बदल रहा हूं। महान काम करता है :), ओ ठीक है मुझे लगता है कि अब तक का सबसे अच्छा कोई भी करने में सक्षम होने वाला है ... –

0

यह नीचे के साथ ठीक काम करता है (, एक्सेल संदर्भ और एक्सेल स्थिरांक के वास्तविक मूल्य जोड़ने Win7x64 पर PowerPoint 2010x86 का उपयोग किए बिना):

Option Explicit 

Sub test() 
    Dim sld As Slide 
    Dim shp As Shape 

    Set sld = ActivePresentation.Slides.Add(1, ppLayoutBlank) 
    Set shp = sld.Shapes.AddOLEObject(30, 30, 50, 50, "Excel.Sheet") 

    Dim listObject As Object ' listObject 
    Set listObject = shp.OLEFormat.Object.Sheets(1).ListObjects.Add(1) 'xlSrcRange = 1 
    shp.OLEFormat.Object.Sheets(1).Cells(1, 1) = "fewewq" 

    shp.OLEFormat.Object.Close 

End Sub 

बस नहीं यकीन है कि तुम क्यों वस्तुओं सेट लेकिन उनका उपयोग न।

+0

हां, यह मेरी गलती है, मैंने इसे PowerPoint 2010 में परीक्षण किया लेकिन यह 2016 के समान मशीन पर स्थापित किया गया था और मुझे लगता है कि यदि आप PowerPoint 2010 के साथ दस्तावेज़ खोलते हैं, तो यह अभी भी Excel 2016 के साथ एम्बेडेड ऑब्जेक्ट खोल देगा। इसलिए, मैं लगता है कि यह मुद्दा एक्सेल 2016 से संबंधित है क्योंकि आपका शामिल कोड अभी भी मेरी मशीन पर एक ही समस्या उत्पन्न करता है। मैंने इस नई जानकारी और कुछ बेहतर स्वरूपण के साथ प्रश्न अद्यतन किया है। क्षमा करें, मैं पहले स्पष्ट नहीं था :( –

+0

मैंने सभी 2010 केवल (x32) के साथ एक विंडोज 10 (x64) मशीन लोड की है, और आपको कोड फिर से चला रहा है, मुझे अभी भी समस्या दिखाई दे रही है ... मुझे आश्चर्य है कि कोई और कर सकता है इसे पुन: उत्पन्न करें? –

+0

मैंने इसे Office 365 ProPlus (PatricK के कोड) में चलाया और इसमें कोई समस्या नहीं थी। यह एक नई स्लाइड तैयार करेगा, लेकिन Excel ऑब्जेक्ट को पहली स्लाइड में डालें। यह "Excel.Sheet.12" ऑब्जेक्ट बनाता है, एक सूची बॉक्स के साथ। – mooseman

1

मैं एक वास्तव में "भयानक" वैकल्पिक हल मिल गया है, कम से कम तालिकाओं के लिए:

Public Sub CreateTable() 

    'Create a dummy excel object in the background(run this before working with OLE objects) 
    Dim xlApp As Object 
    Set xlApp = CreateObject("Excel.Application") 
    xlApp.Workbooks.Add 

    Dim slide As slide: Set slide = ActivePresentation.Slides.Add(1, ppLayoutBlank) 
    Dim shp As Shape: Set shp = slide.Shapes.AddOLEObject(30, 30, 50, 50, "Excel.Sheet") 

    shp.OLEFormat.Object.Sheets(1).ListObjects.Add (1) 'xlSrcRange 
    shp.OLEFormat.Object.Sheets(1).Cells(1, 1) = "fewewq" 

    shp.OLEFormat.Object.Close 

    'Kill it when the work is done 
    xlApp.Application.Quit 

End Sub 

चार्ट संस्करण:

Public Sub CreateChart() 

    'Create a dummy excel object in the background(run this before working with OLE objects) 
    Dim xlApp As Object 
    Set xlApp = CreateObject("Excel.Application") 
    xlApp.Workbooks.Add 

    Dim sld As slide 
    Dim shp As Shape 
    Dim pptWorkbook As Workbook 

    Set sld = ActivePresentation.Slides.Add(1, ppLayoutBlank) 
    Set shp = sld.Shapes.AddChart 

    Set pptWorkbook = shp.Chart.ChartData.Workbook 
    pptWorkbook.Close SaveChanges:=True 

    'Use the Activate code to open the worksheet, typically only need for 2010 
    xlApp.Application.Wait Now + TimeValue("0:00:01") 
    shp.Chart.ChartData.Activate 
    shp.Chart.ChartData.Workbook.Windows(1).Visible = False 

    Set pptWorkbook = shp.Chart.ChartData.Workbook 
    pptWorkbook.Sheets(1).Cells(1, 2) = "fewewq" 

    Application.ActivePresentation.Save 

    'Added a wait condition before closing the document, not sure why this works... 
    Excel.Application.Wait Now + TimeValue("0:00:01") 
    pptWorkbook.Close SaveChanges:=True 

    'Kill it when the work is done 
    xlApp.Application.Quit 

End Sub 
बेशक

, मैं इसे के रूप में उत्तर से संतुष्ट नहीं कर रहा हूँ बस मूल कारण को संबोधित करने के बजाय समस्या से बचाता है। मैं अभी भी इस व्यवहार को उत्पन्न करने के बारे में बेहतर समझना चाहता हूं। हालांकि, यह सच है कि, वास्तविक वीबीए फैशन में, यह एकमात्र व्यवहार्य विकल्प हो सकता है।

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