2017-06-19 46 views
5

Nếu bạn chạy đoạn mã sau bạn sẽ có được một kết quả khá thú vị (với chỉ PowerPoint chạy, đóng tất cả các trường hợp của Excel trước khi chạy):Powerpoint VBA - Editting Tên cột của bảng trong Embedded Excel OLE Object

'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 

Đối tượng nhúng được tạo thành công và bảng có mặt với dữ liệu được chỉ định. Tuy nhiên, khi bạn nhấp chuột vào các đối tượng nhúng bạn nhận được lỗi sau:

enter image description here

There isn't enough memory available to read Worksheet.

Đối tượng này không còn có thể được truy cập bất kỳ cách nào khác, và bản chất hỏng của đối tượng vẫn tồn tại trên đóng/mở của tài liệu và khởi động lại. Tôi đã xác minh vấn đề này xảy ra trên tất cả nhưng một hệ thống tôi đã thử nghiệm ở trên (PowerPoint/Excel 2016, Windows 7 X64).

Câu hỏi

Vì vậy, câu hỏi của tôi là, bất kỳ ai khác có thể tạo lại điều này và nếu vậy tại sao điều này lại xảy ra? Nếu bạn thay đổi dòng "Ô (1, 1)" thành "Ô (2, 1)" thì không có vấn đề gì, có vẻ như chỉnh sửa phần đầu của bảng khiến một số hành vi đặc biệt khác với việc chỉnh sửa các hàng hoặc các tế bào khác.

Nghiên cứu

  • Có thực sự không được phân phối bằng văn bản về vấn đề này, hầu hết những thứ không phải là liên quan đến vấn đề cụ thể này.

  • This post tuyên bố rằng đó là vấn đề với quá nhiều phông chữ được cài đặt (> 600). Tôi đã thử nghiệm này, tôi chỉ có 241 được cài đặt ...

  • Có một rất nhiều toàn bộ bài viết không có câu trả lời (this, this, this, và this) không phân phối đi trên đó.

  • some posts hoàn toàn không có liên quan, một lần nữa không phải là tất cả để tiếp tục ở đó.

  • Tôi đã thử nghiệm cùng mã trong MS Word, dường như làm việc tốt, vấn đề dường như bị cô lập sang PowerPoint

  • Tôi đã thử làm một phiên bản trong mã (phá vỡ đối tượng), và một người khác bằng tay (đối tượng làm việc), lưu chúng và so sánh đầu ra nhị phân (of only the embedded objects). Điều này nghe có vẻ tuyệt vời, nhưng nó không giúp tôi hiểu rõ hơn. Tôi không thể mở với Excel các đối tượng nhúng riêng biệt vì các đối tượng dường như được lưu trữ trong một proprietary format. Khu vực trung tâm của nhị phân có vẻ khác nhau, nhưng tôi không chắc chắn làm thế nào hoặc tại sao. Cho đến nay tôi đã không phát hiện ra một cách để giải mã điều này thành một thông tin có thể đọc được của con người.

  • After a significant delay and with proper attribution, tôi có chữ thập được đăng này lên the Microsoft forums. Có lẽ ai đó có một số cái nhìn sâu sắc ở đó. Tôi sẽ chủ động duy trì cả hai bài đăng. Nếu tôi bị thuyết phục 100% thì đây là lỗi tôi thậm chí có thể xem xét opening an issue here. Bạn có thể hoàn toàn tránh được vấn đề này bằng cách không bao giờ đóng OLEObject, điều này gây ra các vấn đề trong năm 2010, đặc biệt khi kết hợp với hành vi biểu đồ liên quan, bạn sẽ nhận được các cửa sổ excel mồ côi được hiển thị. Quay lại đầu trang ||||||||||||||||||||||||||||||||||||||||||||||||||||| Không phải là trải nghiệm người dùng tốt.Tôi đoán tôi có thể mở một cửa sổ excel ẩn trong nền và sau đó chấm dứt khi tôi đang làm việc trên những thứ nhúng ...

  • Tôi đang chạy phiên bản: Microsoft Office 365 ProPlus: Phiên bản 1705 (Build 8201.3103 Click-to -Run), nhưng tôi cũng đã nhìn thấy vấn đề trên Microsoft Office Standard 2010, Phiên bản 14.0.7015.1000 (32-bit). Vấn đề với bảng có vẻ giống nhau trên mọi phiên bản khác của văn phòng, mặc dù tôi tự hỏi liệu điều này có ảnh hưởng đến các phiên bản trước năm 2010 của văn phòng không?

Cập nhật 1

tôi đã cố gắng điều tương tự với bảng xếp hạng:

'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 

Nếu bạn thay đổi giá trị tiêu đề hàng bạn không còn có thể truy cập vào các đối tượng nhúng ("Cells (1, 2) "), nếu bạn thay đổi một giá trị khác (" Ô (2, 1) ") thì nó chạy tốt. Tôi cho rằng đó là vấn đề tương tự, tôi không thể mở dữ liệu biểu đồ sau khi mã này được chạy. Nếu tôi cố gắng truy cập vào nó lập trình tôi nhận được lỗi sau:

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

Method 'Workbook' of object 'ChartData' failed

Chỉ một vấn đề trên 2016, mặc dù tôi đã cố gắng một cái gì đó hơi khác nhau cho năm 2010 và không thấy bất kỳ vấn đề.

Cập nhật 2

Cuối cùng tôi đã tìm ra lý do tại sao tôi không thể tạo lại vấn đề này trên hệ thống khác. Vấn đề này chỉ xuất hiện khi tất cả các trường hợp của excel được đóng sau khi thay đổi được thực hiện. Điều đó có nghĩa là nếu bạn có một cửa sổ excel riêng biệt (không liên quan) mở khi bạn chạy mã này, bạn sẽ không thấy vấn đề.

Sự cố này chỉ có thể được sao chép khi PowerPoint đang chạy một mình mà không có bất kỳ bảng tính Excel nào khác mở.

+1

Tôi cho rằng bạn đã tham chiếu đến ứng dụng excel? cố gắng thay đổi tên của listobject thành cái gì khác. 'Dim lo as listobject' – Ibo

+0

@Ibo, Đó là những gợi ý xuất sắc, tôi đã chỉnh sửa câu hỏi của mình rõ ràng hơn và bao gồm tham chiếu trong nhận xét, tôi xóa tất cả biến" listObject ". –

+0

Mã của bạn rất giống với bài viết msdn này: [Tạo Biểu đồ PowerPoint 2010 với Mô hình Đối tượng Biểu đồ Mới] (https://msdn.microsoft.com/en-us/library/office/ff973127 (v = office.14). aspx) ngoại trừ bạn đang sử dụng 'Sheets' chứ không phải' Worksheets'. – PatricK

Trả lời

1

Tôi có thể tạo lại sự cố của bạn một cách nhất quán trên Windows10-64/Excel2013-64. Đó là một lỗi, chúng tôi chỉ có thể cố gắng kiểm tra chính xác những gì đang xảy ra.

Khi thay đổi tiêu đề của bảng thông qua VBA, ListColumn liên tục từ chối cập nhật tên của nó. Điều này xảy ra cho dù bạn thay đổi ô tiêu đề hay rõ ràng tên của ListColumn! Nó chỉ cập nhật nếu bạn chỉnh sửa các Workbook và thay đổi tế bào bằng tay, nhưng không phải từ 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 

Kết quả là rõ ràng: bảng ListObject bị hỏng, bởi vì nó đã nội bộ lưu tên cột (ví dụ:Column1) mà nó không tìm thấy trong tiêu đề (tiêu đề là fewewq). Điều này dẫn đến lỗi được quan sát, các thông báo lỗi hiển thị không phải lúc nào cũng chính xác, thật không may.

Khi một phiên bản Excel đang chạy, thay đổi hành vi và tên của ListColumncập nhật. Dường như "thành phần" cập nhật dữ liệu nội bộ của bảng khi tiêu đề của nó được chỉnh sửa, là "không được tải" khi chỉnh sửa bên trong VBA của PowerPoint. Chỉ khi một trong hai:

  • Bạn chỉnh sửa bảng tính tại chỗ trong PPT, bằng tay

  • Bạn có một ví dụ Excel chạy

Yếu tố chung là có một số thành phần trình chỉnh sửa được tải và trình chỉnh sửa này là trình chỉnh sửa cập nhật dữ liệu của bảng nội bộ khi tiêu đề được chỉnh sửa.

Cách giải quyết tốt mà bạn tìm thấy trong câu trả lời của mình, đó là mở một xlApp trước khi thực hiện hành động, sau đó đóng nó sau, phù hợp với các quan sát này.

Quan trọng hơn, các vấn đề "khác" điều đó xảy ra với đối tượng Chart (trong Cập nhật 1) thực sự là vấn đề tương tự như bạn giả định một cách chính xác ("Tôi cho rằng đó là cùng một vấn đề"). Biểu đồ đã tạo được liên kết với một bảng ListObject trong trang tính và bảng đó có tiêu đề của nó trên hàng đầu tiên. Vì vậy, khi bạn thay đổi một ô trong tiêu đề, tên của ListColumn không cập nhật, dẫn đến cùng một vấn đề tham nhũng.

UPDATE: khác, nhẹ workaround

Sau những ý kiến ​​lo ngại liên quan đến workaround mở một ứng dụng Excel trước, tôi đã cố gắng để tìm một "nhẹ" workaround và tìm thấy một.

Thuyết phục rằng vấn đề là do không cập nhật được tên ListColumn trong bảng, tôi đã tìm thấy cách "buộc" cập nhật tên của nó. Cách giải quyết bao gồm hai bước:

Mở rộng phạm vi của một cột sang bên phải, sau đó ngay lập tức thu nhỏ lại phạm vi ban đầu.

Thao tác này chỉ đơn giản là buộc bảng tính lại tên cột của nó và chính xác là vậy! Bây giờ tên cột của bảng là chính xác và vấn đề biến mất.

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 

Sau thao tác này, bạn có thể xác minh rằng trang tính được nhúng có thể chỉnh sửa và bạn có thể đóng rồi mở bản trình bày và bạn sẽ không tìm thấy bất kỳ vấn đề nào. Tôi hy vọng điều này sẽ giúp :)

+1

Tôi hạnh phúc những người khác có thể nhìn thấy và tái sản xuất vấn đề. cho đến nay đã chứng minh được cả hai thách thức và không hiệu quả. vẫn còn quan tâm đến một số loại thừa nhận chính thức từ MS. Văn phòng và VBA luôn là một môi trường đầy thách thức để phát triển, tôi luôn chạy vào [những điều kỳ lạ] (https://stackoverflow.com/questions/38664351/unable-to-add-oleobject-in-powerpoint-when- cell-is-in-edit-mode-in-seperate-exce) như thế này. Có lẽ tôi sẽ mở một gợi ý về giọng nói của người dùng Excel. –

+0

@DavidRogers Hãy cố gắng giải quyết sự cố của tôi và cho tôi suy nghĩ của bạn. Tôi nghĩ rằng nó "nhẹ" và hoạt động hoàn hảo cho tôi. Cảm ơn. –

+1

Có điều này là cách làm việc tốt hơn, tôi chỉ quấn ListObject.Resize trong một tiểu và nơi mà bất cứ nơi nào tôi đang thay đổi tiêu đề. Hoạt động tuyệt vời :), o tôi đoán đó là người tốt nhất sẽ có thể làm ngay bây giờ ... –

0

Nó hoạt động tốt với bên dưới (mà không cần thêm tài liệu tham khảo Excel và giá trị thực tế của các hằng Excel, sử dụng 2010x86 PowerPoint trên 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 

Chỉ cần không chắc chắn lý do tại sao bạn Đặt đối tượng nhưng không sử dụng chúng.

+0

Vâng, đây là lỗi của tôi, tôi đã thử nghiệm trong PowerPoint 2010 nhưng nó đã được cài đặt trên cùng một máy tính vào năm 2016 và tôi nghĩ rằng nếu bạn mở tài liệu với PowerPoint 2010, nó vẫn sẽ mở đối tượng được nhúng với Excel 2016. Vì vậy, tôi nghĩ rằng vấn đề có thể liên quan đến Excel 2016 vì mã được bao gồm của bạn vẫn tạo ra cùng một vấn đề trên máy của tôi. Tôi đã cập nhật câu hỏi với thông tin mới này và một số định dạng tốt hơn. Xin lỗi tôi đã không rõ ràng lúc đầu tiên :( –

+0

Tôi nạp một cửa sổ 10 (x64) máy lên với tất cả năm 2010 chỉ (x32), và reran bạn mã, tôi vẫn thấy vấn đề ... Tôi tự hỏi nếu có ai khác có thể –

+0

Tôi chạy nó trong Office 365 ProPlus (mã PatricK) và không có vấn đề gì.Nó sẽ tạo một trang trình bày mới, nhưng đặt đối tượng Excel trong trang chiếu đầu tiên. Nó tạo đối tượng "Excel.Sheet.12", với một listbox – mooseman

1

Tôi tìm thấy một thực sự "tuyệt vời" khắc phục, ít nhất là cho các bảng:

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 

Chart 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 

Tất nhiên, tôi không hài lòng với câu trả lời vì nó đơn giản tránh vấn đề thay vì giải quyết nguyên nhân gốc rễ. Tôi vẫn muốn hiểu rõ hơn về những gì đang gây ra hành vi này. Mặc dù vậy, trong thời trang VBA thực sự, đây có thể là lựa chọn duy nhất khả thi.

Các vấn đề liên quan