2017-06-19 4 views
5

Wenn Sie den folgenden Code, den Sie ganz ein interessantes Ergebnis zu erhalten (mit nur Powerpoint ausgeführt wird, schließen Sie alle Instanzen von Excel vor Betrieb):Powerpoint VBA - editting Spalte Name der Tabelle in Embedded Excel OLE-Objekt

'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 

Das eingebettete Objekt wurde erfolgreich erstellt und die Tabelle ist mit den angegebenen Daten vorhanden. Wenn jedoch klicken Sie auf das eingebettete Objekt Sie folgende Fehlermeldung erhalten:

enter image description here

There isn't enough memory available to read Worksheet.

Dieses Objekt kann nicht mehr auf andere Weise zugegriffen werden kann, und die beschädigte Natur des Objekts bleibt auf Schließen/Öffnen des Dokuments und neu starten. Ich habe festgestellt, dass dieses Problem auf allen Systemen auftritt, auf denen ich getestet habe (PowerPoint/Excel 2016, Windows 7 X64).

Frage

Also meine Frage ist, kann jemand anderes dieses reproduzieren, und wenn ja, warum ist das passiert? Wenn Sie die Zeile "Cells (1, 1)" in "Cells (2, 1)" ändern, gibt es kein Problem. Es scheint, als ob die Bearbeitung des Kopfs der Tabelle ein bestimmtes Verhalten verursacht, das sich von der Bearbeitung der Zeilen unterscheidet andere Zellen.

Forschung

  • Es ist wirklich nicht darüber geschrieben zuzuteilen, die meisten Sachen nicht zu diesem speziellen Thema zusammen.

  • This post behauptet, dass es ein Problem mit zu vielen Schriften installiert ist (> 600). Getestet habe ich diese, ich habe nur 241 ...

    installiert haben
  • Es gibt eine ganze Menge Beiträge ohne Antworten (this, this, this und this) nicht dorthin gehen zuzuteilen.

  • Es gibt some posts, die völlig unabhängig sind, wieder nicht Zutot dort gehen.

  • ich den gleichen Code in MS Word getestet haben, scheint gut zu funktionieren scheint Ausgabe zu Powerpoint isoliert

  • Ich habe eine Version in Code versucht zu tun (gebrochene Objekt) und eine weitere von Hand (Arbeitsobjekt), speichert sie und vergleicht die binäre Ausgabe (of only the embedded objects). Das klingt cool, aber es gibt mir keinen besseren Einblick. Ich kann die eingebetteten Objekte nicht separat mit Excel öffnen, da die Objekte scheinbar in einer proprietary format gespeichert sind. Die zentrale Region von binär erscheint anders, aber ich bin mir nicht sicher, wie oder warum. Bis jetzt habe ich noch keine Möglichkeit gefunden, dies zu einer menschenlesbaren Information zu dekodieren.

  • After a significant delay and with proper attribution, ich habe dieses Kreuz auf the Microsoft forums gepostet. Vielleicht hat da jemand einen Einblick. Ich werde beide Posten aktiv pflegen. Wenn ich zu 100% davon überzeugt wäre, dass es sich um einen Fehler handelt, könnte ich sogar opening an issue here in Betracht ziehen.

  • Sie können dieses Problem vollständig vermeiden, indem Sie das OLEObject nie schließen, dies verursacht Probleme in 2010, besonders wenn es mit dem zugeordneten Diagrammverhalten kombiniert wird, erhalten Sie verwaiste Excel-Fenster angezeigt. Keine gute Benutzererfahrung.Ich denke, ich könnte ein verstecktes Excel-Fenster im Hintergrund öffnen und dann beenden, wenn ich mit der Arbeit an eingebetteten Dingen fertig bin ...

  • Ich verwende Version: Microsoft Office 365 ProPlus: Version 1705 (Build 8201.3103 Click-to -Run), aber ich habe auch das Problem in Microsoft Office Standard 2010, Version 14.0.7015.1000 (32-Bit) gesehen. Das Problem mit der Tabelle scheint auf allen anderen Office-Versionen gleich zu sein, obwohl ich mich frage, ob dies Auswirkungen auf die Office-Versionen vor 2010 hat.

Update 1

habe ich versucht, das Gleiche mit Diagrammen:

'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 

Wenn Sie den Kopfzeilenwert ändern können Sie keinen Zugriff mehr auf das eingebettete Objekt ("Cells (1, 2) "), wenn Sie einen anderen Wert (" Zellen (2, 1) ") ändern, läuft es gut. Ich nehme an, es ist das gleiche Problem, ich kann die Diagrammdaten nicht öffnen, nachdem dieser Code ausgeführt wurde. Wenn ich versuche, darauf zuzugreifen programmatisch bekomme ich folgende Fehlermeldung:

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

Method 'Workbook' of object 'ChartData' failed

Nur ein Problem auf 2016 aber, habe ich versucht, etwas etwas anders für 2010 und habe keine Probleme zu sehen.

Update 2

ich, warum endlich herausgefunden ich dieses Problem nicht auf einem anderen System reproduzieren konnten. Dieses Problem tritt nur auf, wenn alle Instanzen von Excel geschlossen werden, nachdem die Änderung vorgenommen wurde. Das bedeutet, wenn Sie beim Ausführen dieses Codes ein separates (nicht verknüpftes) Excel-Fenster geöffnet haben, wird das Problem nicht angezeigt.

Dieses Problem kann nur reproduziert werden, wenn PowerPoint alleine ausgeführt wird, ohne dass andere Excel-Tabellen geöffnet sind.

+1

Ich nehme an, Sie haben bereits auf Excel-Anwendung verwiesen? Versuchen Sie, den Namen des Listenobjekts in etwas anderes zu ändern. 'Dim lo als listobject' – Ibo

+0

@Ibo, das sind ausgezeichnete Vorschläge, ich habe meine Frage bearbeitet, um klarer zu sein und die Referenz in einem Kommentar enthalten, ich entferne die Variable" listObject "alle zusammen. –

+0

Ihr Code ist diesem MSDN-Artikel sehr ähnlich: [Erstellen Sie ein PowerPoint 2010-Diagramm mit einem neuen Chart-Objektmodell] (https://msdn.microsoft.com/en-us/library/office/ff973127 (v = office.14)). aspx), außer dass Sie 'Sheets' und nicht' Worksheets' verwenden. – PatricK

Antwort

1

Ich könnte Ihr Problem konsequent auf Windows10-64/Excel2013-64 reproduzieren. Es ist ein Fehler, wir können nur versuchen zu überprüfen, was genau falsch läuft.

Wenn Sie die Kopfzeile der Tabelle über VBA ändern, weigert sich die ListColumn hartnäckig, ihren Namen zu aktualisieren. Dies geschieht unabhängig davon, ob Sie die Header-Zelle oder explizit den Namen der ListColumn ändern! Es aktualisiert nur, wenn Sie die Arbeitsmappe bearbeiten und die Zelle von Hand ändern, aber nicht von VBA:

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 

Das Ergebnis ist offensichtlich: Die ListObject Tabelle beschädigt wird, weil es intern Spaltennamen gespeichert (dColumn1), dass es nicht in der Kopfzeile gefunden wird (Kopfzeile ist fewewq). Dies führt zu dem beobachteten Fehler, die angezeigten Fehlermeldungen sind leider nicht immer genau.

Wenn eine Excel-Instanz bereits ausgeführt wird, ändert sich das Verhalten und der Name ListColumn wird aktualisiert. Es scheint, dass die "Komponente", die die internen Daten der Tabelle aktualisiert, wenn der Header bearbeitet wird, beim Bearbeiten in PowerPoint VBA "nicht geladen" ist. Nur wenn entweder:

  • Sie die Arbeitsmappe in-place in PPT bearbeiten, von Hand

  • Sie haben eine Excel-Instanz läuft

Der gemeinsame Faktor ist, dass es einige ist Editor-Komponente geladen, und dieser Editor ist derjenige, der die Daten der internen Tabelle aktualisiert, wenn der Header bearbeitet wird.

Die gute Problemumgehung, die Sie in Ihrer Antwort gefunden haben, nämlich eine xlApp vor der Aktion zu öffnen und sie danach zu schließen, stimmt mit diesen Beobachtungen überein.

Wichtig ist, dass das „andere“ Problem, das mit dem Chart Objekt geschieht (in Update 1) ist in der Tat das gleiche Problem wie Sie richtig angenommen („Ich nehme an, es ist das gleiche Problem“). Das erstellte Diagramm ist mit einer ListObject Tabelle im Arbeitsblatt verknüpft, und diese Tabelle hat ihren Kopf in der ersten Zeile. Wenn Sie also eine Zelle in der Kopfzeile ändern, wird der Name der ListColumn nicht aktualisiert, was zu dem gleichen Korruptionsproblem führt.

UPDATE: eine andere, leicht Abhilfe

Nach den Kommentaren Sorgen um die Problemumgehung eine vorherige Excel App zu öffnen, im Zusammenhang hob ich versucht, eine „leichtere“ Abhilfe zu finden und eine gefunden.

Überzeugt, dass das Problem aufgrund der fehlgeschlagenen Aktualisierung der ListColumn s Name in der Tabelle ist, fand ich eine Möglichkeit, "erzwingen" seine Namen zu aktualisieren. Die Problemumgehung besteht aus zwei Schritten:

Erweitern Sie den Bereich der Tabelle eine Spalte auf der rechten Seite, dann schrumpfen Sie sofort zurück in den ursprünglichen Bereich.

Diese Operation zwingt die Tabelle einfach, ihre Spaltennamen neu zu berechnen, und das war's! Jetzt sind die Spaltennamen der Tabelle korrekt und das Problem ist verschwunden.

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 

Nach dieser Operation können Sie überprüfen, ob das eingebettete Arbeitsblatt bearbeitet werden kann, und Sie können dann schließen Sie die Präsentation öffnen, und Sie werden keine Probleme finden. Ich hoffe, das hilft :)

+1

Ich bin froh, dass andere das Problem sehen und reproduzieren können. Ja, es scheint ein Bug zu sein, jedoch meine Workaround auf große Apps in mehreren Office-Versionen skalieren hat sich bisher als herausfordernd und ineffizient erwiesen bin immer noch an einer Art offizieller Bestätigung von MS interessiert. Office und VBA waren schon immer ein herausforderndes Umfeld, in dem ich mich weiterentwickeln konnte. Ich stoße immer auf [seltsame Dinge] (https://stackoverflow.com/questions/38664351/unable-to-add-oleobject-in-powerpoint-when- cell-is-im-edit-mode-in-seperate-exce) so. Vielleicht werde ich einen Vorschlag für die Excel-Benutzerstimme öffnen. –

+0

@DavidRogers Bitte versuchen Sie meine Workaround und geben Sie mir Ihre Gedanken. Ich denke, es ist "leicht" und funktioniert perfekt für mich. Vielen Dank. –

+1

Ja, das funktioniert viel besser, ich wickle die ListObject.Resize einfach in ein Sub und platziere das überall wo ich Header ändere. Funktioniert großartig :), na ja, ich denke, das ist das Beste, was jemand für den Moment tun kann ... –

0

Es arbeitet mit folgenden Fein (ohne Referenz Excel Hinzufügen und tatsächlichen Wert der Excel-Konstanten, mit Powerpoint 2010x86 auf Win7x64):

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 

einfach nicht sicher, warum Sie Objekte einstellen, aber nicht mit ihnen.

+0

Ja, das ist meine Schuld, ich habe es in PowerPoint 2010 getestet, aber es wurde auf dem gleichen Computer wie 2016 installiert und ich denke, wenn Sie das Dokument mit PowerPoint 2010 öffnen, wird es weiterhin das eingebettete Objekt mit Excel 2016 öffnen Stellen Sie sich das Problem wahrscheinlich in Zusammenhang mit Excel 2016 vor, da der enthaltene Code auf meinem Computer immer noch das gleiche Problem verursacht. Ich habe die Frage mit dieser neuen Information und etwas besserer Formatierung aktualisiert. Sorry, ich war zuerst nicht klar :( –

+0

Ich lud eine Windows 10 (x64) Maschine mit allen nur 2010 (x32), und reran Sie Code, ich sehe immer noch das Problem ... Ich frage mich, ob jemand anderes kann reproduzieren dies? –

+0

Ich habe dies in Office 365 ProPlus (PatricK-Code) und hatte keine Probleme. Es wird eine neue Folie erstellen, aber das Excel-Objekt in der ersten Folie. Es erstellt ein "Excel.Sheet.12" -Objekt, mit einer Listbox – mooseman

1

fand ich eine wirklich "awesome" Abhilfe, zumindest für die Tabellen:

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 

Tabelle Version:

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 

Natürlich, ich bin mit der Antwort, da sie nicht zufrieden einfach vermeidet das Problem und geht nicht auf die Ursache ein. Ich möchte immer noch ein besseres Verständnis davon bekommen, was dieses Verhalten verursacht. Wenn dies jedoch in echter VBA-Form nicht möglich ist, ist dies möglicherweise die einzig mögliche Option.

Verwandte Themen