我最近注意到,从Excel工作表中复制非连续范围(例如,通过Union())并将其粘贴到PowerPoint Slide.Shapes.Table对象会导致不良结果,而不是粘贴联合范围(或选择),将粘贴从最早的单元格到最远的单元格的范围。尽管我为自己的项目设计了一个临时解决方法(在粘贴扩展范围后删除了不需要的行),但我还是希望您知道如何在将来的项目中避免此问题。
我已经在Excel环境中测试了复制/粘贴方法,在该环境中,我在联合中复制了范围并将其粘贴到新的工作表中。一切都按预期工作。但是,我能够在基本的PowerPoint幻灯片中复制该问题。我搜索了可能遇到类似问题或解决方案的人,但是似乎没人遇到/研究过此问题。
下面是显示其在Excel环境中工作的示例代码:
Sub excelOnly()
Dim a As Range, b As Range, c As Range, d As Range
Dim lRow As Integer, lColumn As Integer
lRow = Cells(1, 1).End(xlDown).Row
lColumn = Cells(1, 1).End(xlToRight).Column
Set a = Range(Cells(1, 1), Cells(1, lColumn))
Set b = Range(Cells(3, 1), Cells(5, lColumn))
Set c = Range(Cells(9, 1), Cells(lRow, lColumn)) 'make sure sample data has more than 9 rows
Set d = Union(a, b, c)
d.Select
Selection.Copy 'not necessary to select, can directly copy from range
Sheets(2).Paste 'sample Workbook should have 2 sheets
End Sub
下面是示例代码,显示了它在PowerPoint环境中如何失败:
Sub powerPointEnv() 'PS: I am referencing Microsoft PowerPoint 16.0 Object Library
Dim newPPT As New PowerPoint.Application, pptpres As PowerPoint.Presentation, newSlide As Slide
Dim a As Range, b As Range, c As Range, d As Range
Dim lRow As Integer, lColumn As Integer
Set pptpres = newPPT.Presentations.Add
Set newSlide = pptpres.Slides.Add(1, 12)
lRow = Cells(1, 1).End(xlDown).Row
lColumn = Cells(1, 1).End(xlToRight).Column
Set a = Range(Cells(1, 1), Cells(1, lColumn))
Set b = Range(Cells(3, 1), Cells(5, lColumn))
Set c = Range(Cells(9, 1), Cells(lRow, lColumn))
Set d = Union(a, b, c)
d.Select
Selection.Copy 'again, it is possible to copy directly from the range, the issue remains the same
newSlide.Shapes.Paste
End Sub
请注意,PowerPoint环境中的粘贴范围超出了并集范围,特别是从所选范围中最早的单元格地址到最远的范围。
我希望有人可以对此问题提供解释/解决方案;同时,我建议在粘贴扩展范围后,从表格中删除不需要的范围。