Powerpoint VBA – 埋め込みExcel OLEオブジェクト内のテーブルの列名の編集

次のコードを実行すると、非常に興味深い結果が得られます(PowerPointのみを実行している場合は、実行する前にExcelのすべてのインスタンスを閉じます)。

'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.

このオブジェクトは他の方法ではアクセスできなくなり、オブジェクトの破損した性質はドキュメントを閉じたり開いたりして再起動しても持続します。私はこの問題が私がテストした1つのシステム(PowerPoint / Excel 2016、Windows 7 X 64)を除くすべてのシステムで発生することを確認しました。

質問

だから私の質問は、誰かがこれを再現することができます、そしてもしそうなら、なぜこれが起こっているのでしょうか? “Cells(1、1)”の行を “Cells(2、1)”に変更しても問題はありません。テーブルの先頭を編集すると、行の編集とは異なる特別な動作が発生するようです。他の細胞。

研究

>これについて書かれたことは実際にはありません、ほとんどのものはそうではありません
この特定の問題に関連しています。
> This postは、それが多すぎるフォントの問題であると主張しています
インストール済み(> 600)私はこれをテストしました、私は241しかインストールしていません…
>回答のない投稿がたくさんあります(thisthis
this、およびthis)そこに行くことを割り当てません。
>完全に無関係なsome postsがありますが、ここでもそうではありません
そこに行くことを割り当てます。
>私はMS Wordで同じコードをテストしました、うまくいっているようです、問題はあるようです
PowerPointに分離
>あるバージョンのコード(壊れたオブジェクト)と別のバージョンの手作業(作業オブジェクト)を行い、それらを保存してバイナリ出力を比較しました(of only the embedded objects)。これはクールに聞こえますが、それ以上の洞察は得られません。オブジェクトがproprietary formatに格納されているように見えるので、私はExcelで埋め込みオブジェクトを別々に開くことはできません。バイナリの中央領域は異なって見えますが、その方法や理由がわかりません。これまで、これを人間が読める情報にデコードする方法を発見していません。
> After a significant delay and with proper attribution、これをthe Microsoft forumsにクロス投稿しました。私は両方の投稿を積極的に管理します。私が100%確信していたならば、これはopening an issue hereを検討するかもしれないバグです。
> OLEObjectを閉じないことで、この問題を完全に回避できます。これは、特に関連するチャートの動作と組み合わせると、孤立したExcelウィンドウが表示されるため、2010年に問題を引き起こします。良いユーザーエクスペリエンスではありません。隠されたExcelウィンドウをバックグラウンドで開き、埋め込んだものの作業が終わったら終了することができると思います…
>バージョン:Microsoft Office 365 ProPlus:バージョン1705(ビルド8201.3103 Click-to-Run)を実行していますが、Microsoft Office Standard 2010バージョン14.0.7015.1000(32ビット)でも問題が発生しています。この問題は2010年以前のバージョンのOfficeに影響があるのでしょうか。

更新1

私はチャートでも同じことを試しました:

'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

ヘッダー行の値を変更すると埋め込みオブジェクト( “Cells(1、2)”)にアクセスできなくなり、別の値( “Cells(2、1)”)を変更すると正常に動作します。私はそれが同じ問題であると思います、このコードが実行された後に私はチャートデータを開くことができません。プログラムでアクセスしようとすると、次のエラーが発生します。

Run-time error ‘-2147467259 (80004005)’:

Method ‘Workbook’ of object ‘ChartData’ failed

2016年の問題だけ、私は2010年のためにわずかに異なる何かを試してみて、問題は見られませんでした。

アップデート2

私はこの問題を他のシステムで再現できない理由をついに見つけました。この問題は、変更が行われた後にExcelのすべてのインスタンスが閉じられた場合にのみ発生します。つまり、このコードを実行したときに別の(無関係な)Excelウィンドウを開いていても、問題は発生しません。

この問題は、他のExcelスプレッドシートを開かずにPowerPointを単独で実行している場合にのみ再現できます。

ベストアンサー
私はあなたの問題をWindows10-64 / Excel2013-64で一貫して再現することができました。それはバグです、我々は正確に何がうまくいっていないのかを調べることしかできません。

VBAを介してテーブルのヘッダーを変更すると、ListColumnはその名前の更新を固く拒否します。これは、ヘッダーセルを変更しても、ListColumnの名前を明示的に変更しても発生します。ワークブックを編集してセルを手動で変更した場合にのみ更新されますが、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

結果は明らかです。ListObjectテーブルは、ヘッダーに見つからない列名(つまりColumn1)を内部的に保存しているため、破損します(headerはfewewqです)。これは観察されたバグにつながります、残念ながら、表示されたエラーメッセージは必ずしも正確ではありません。

Excelインスタンスがすでに実行されていると、動作が変わり、ListColumnの名前が更新されます。ヘッダーの編集時にテーブルの内部データを更新する「コンポーネント」は、PowerPoint VBA内での編集時には「ロードされていません」ようです。次の場合に限ります。

> PPTでワークブックを手動で編集します。
>実行中のExcelインスタンスがあります。

一般的な要因は、いくつかのエディタコンポーネントがロードされていることです。このエディタは、ヘッダが編集されたときに内部テーブルのデータを更新するものです。

あなたが答えの中で見つけた良い対処法は、アクションの前にxlAppを開き、そしてその後それを閉じることですが、これらの観察と一致しています。

重要なことに、(Update 1で)Chartオブジェクトで発生する「その他」の問題は、実際に正しく仮定したのと同じ問題です(「同じ問題だと思います」)。作成されたチャートはワークシート内のListObjectテーブルにリンクされており、そのテーブルの最初の行にヘッダがあります。そのため、ヘッダのセルを変更しても、ListColumnの名前は更新されず、同じ破損の問題が発生します。

更新:別の軽量の回避策

以前のExcelアプリケーションを開くための回避策に関連してコメントが懸念を表明した後、私は「もっと軽い」回避策を見つけようとしましたが、それを見つけました。

この問題は、テーブル内のListColumnsの名前を更新できなかったことが原因であると確信し、その名前を強制的に更新する方法を見つけました。回避策は2つのステップで構成されています。

テーブルの範囲を1列右に拡大して、すぐに元の範囲に縮小します。

この操作は単にテーブルにその列名を再計算させるだけです、そしてそれはそれです!これでテーブルの列名は正しくなり、問題は解消されました。

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

この操作の後、埋め込みワークシートが編集可能であることを確認できます。プレゼンテーションを閉じてから開くことができます。問題は見つかりません。これが役に立つことを願っています:)

転載記事の出典を記入してください: Powerpoint VBA – 埋め込みExcel OLEオブジェクト内のテーブルの列名の編集 - コードログ