2017-01-24 21 views
0

ExcelからPowerpointまでの範囲をテーブルとして貼り付けています。複数のExcelテーブルを別々のPowerPointスライドに配置する

問題は、最初のテーブルを貼り付けると、ポジショニングが正常に機能しますが(.Topと.Left)、最初のテーブルの後に貼り付けられたテーブルは、最初のテーブルから相対的に配置されます。

.Topは、テーブルの左上隅と最初のテーブルの位置の上端との間の距離になります(スライドの上辺ではありません!)。同じことが起こります。左(テーブルの左上隅から最初のテーブルの左端までの距離を表します)。

コードは以下の通りです:

Sub ExportaraPowerPoint() 

Dim pptApp As PowerPoint.Application 
Dim pptPres As PowerPoint.Presentation 
Dim pptSlide As PowerPoint.Slide 
Dim pptShape As PowerPoint.Shape 
Dim excelTable As Excel.Range 
Dim SlideTitle As String 
Dim SlideText As String 
Dim SlideObject As Object 
Dim pptTextbox As PowerPoint.Shape 
Dim SlideNumber As String 
Dim xlTable As PowerPoint.Shape 

'Check is PPT is open and create if not 
On Error Resume Next 
Set pptApp = GetObject("", "PowerPoint.Application") 
Err.Clear 
If pptApp Is Nothing Then Set pptApp = CreateObject(class:="PowerPoint.Application") 
pptApp.Visible = True 
pptApp.Activate 

'Add presentation 
Set pptPres = pptApp.Presentations.Add 
pptPres.PageSetup.SlideSize = ppSlideSizeOnScreen 
pptPres.ApplyTemplate "c:\Program Files\Microsoft Office\Templates\1033\Blank.potx" 

'Assing Tables 
Set excelTable1 = Worksheets("TDSACI").Range("N246:U259") 
Set excelTable2 = Worksheets("TDCSD").Range("N215:U223") 

'Slide 1: 
Set pptSlide = pptPres.Slides.Add(1, ppLayoutTitleOnly) 
excelTable1.Copy 
pptSlide.Shapes.PasteSpecial (ppPasteDefault) 
pptSlide.Shapes(2).Width = 670.4 
pptSlide.Shapes(2).Height = 292 
pptSlide.Shapes(2).Left = 24.4 
pptSlide.Shapes(2).Top = 90.4 

'Slide 2: 
Set pptSlide = pptPres.Slides.Add(2, ppLayoutTitleOnly) 
excelTable2.Copy 
pptSlide.Shapes.PasteSpecial (ppPasteDefault) 
pptSlide.Shapes(2).Width = 670.4 
pptSlide.Shapes(2).Height = 292 
pptSlide.Shapes(2).Left = 24.4 
pptSlide.Shapes(2).Top = 90.4 

私は、テーブルには、常に形状指標番号2であるので、それは問題ではないことを知っています。

数字によると、両方のテーブルの位置は同じである必要があります。

答えて

1

好奇心。 On Error Resume Nextをコメントアウトする場合、VBEがに設定されていることを確認してください。で、最初のSlide 2行に改行を入れると、 .PasteSpecial行はエラーを生成しません。私はこれは、PowerPointがスライド2が表示されていないと訴えているためだと思います。そのため、オブジェクトがスライドに貼り付けられているように見えても、貼り付け方法が乱れてしまいます。私はGotoSlide方法追加することによって、私のデモデッキ(パワーポイント2016)の上にそれを修正:パワーポイントビューを操作

'Slide 2: 
Set pptSlide = pptPres.Slides.Add(2, ppLayoutTitleOnly) 
excelTable2.Copy 
pptApp.ActiveWindow.View.GotoSlide 2 
pptSlide.Shapes.PasteSpecial (ppPasteDefault) 
pptSlide.Shapes(2).Width = 670.4 
pptSlide.Shapes(2).Height = 292 
pptSlide.Shapes(2).Left = 24.4 
pptSlide.Shapes(2).Top = 90.4 

ので私はコードがパワーポイントVBEで実行されている場合は、スライドにオブジェクトを貼り付ける必要はありませんこの場合、何がうまくいかないかはわかりません。

+0

それは働きました!ありがとうございました!本当に!私はこんなにこだわっていた...ありがとう!!!!! – thePB

+0

1つの質問:私はOn Error Resumeをオンラインのページからコピーしました。(私はVBAで新しいので、あまり理解できません)、本当に必要だと思いますか?ありがとう – thePB

+0

VBAはすべてのエラーを無視するように指示します。現実の世界で予期せぬ挙動を発生させると(b)予期せぬ動作を引き起こす可能性があるため、(意図的なエラートラップなどの理由がないと)使用することは非常に悪いプログラミングです。 On Error Gotoエラーハンドラーのようなエラーハンドラーを使用し、コードエラーハンドラーの末尾にアンカーがある方がはるかに良いです: –

0

'Assing tablesから下部分を交換するには、次のコードは、より良い(よりスケーラブル)であるかもしれないあなたが2つの以上の範囲に対処するために探しているなら...

'Assing Tables 

Dim excelTables(1) As Range 

Set excelTables(0) = Worksheets("TDSACI").Range("N246:U259") 
Set excelTables(1) = Worksheets("TDCSD").Range("N215:U223") 

For Each myTable In excelTables 

    myTable.Copy 

    With pptPres.Slides.Add(pptPres.Slides.Count + 1, ppLayoutTitleOnly) 
     .Select 
     With .Shapes.PasteSpecial(ppPasteDefault) 
      .Width = 670.4 
      .Height = 292 
      .Left = 24.4 
      .Top = 90.4 
     End With 
    End With 

Next 
+0

多くの範囲で作業しています(現在は47種類ありますが、それ以上になります)が、すべてが同じサイズと位置を持つわけではありません。どのようにして、テーブル1から10までのサイズと位置をコード化し、テーブル11から20のコードとサイズをコード化しますか?ありがとう。また、なぜあなたはexceltables(1)を薄暗くしますか?あなたはまたceroを持っている場合、なぜインデックス番号1を使用するのですか?再度、感謝します。 – thePB

+0

'Dim excelTables(1)'は、0と1の番号をつけた2つの項目を保持する配列を作成します。 'Dim excelTables(4)'は、5個の項目、0,1,2,3および4を保持する配列を作成します。私が見たところでは、元のコードに近い形になった「Dim excelTables(1 to 2)」を使用しました。 – CLR

+0

スプレッドシートにテーブルを作成しないと、 'sheetname'、' rangeaddress'、 'width'、' height'、 'left'、' top'という列があります。これらのテーブルの各行を読み込んで処理するマクロを書くことができます。こうすることで、新しいテーブルを追加した場合、行を追加するのは簡単な作業です。 – CLR

関連する問題