Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1472to1476
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA CODE KÜRZEN / INTELLIGENT & RUNTIME ERROR
13.02.2016 12:23:55
Mark.
Hallo liebe Community,
es geht um den Beitrag:
Archiv IDX:1474392
Datum: 2016-02-09 17:54:31
Titel: VBA Code Kürzen / INTELLIGENTER schreiben
anhängend könnt Ihr die Beispieldatei finden.
https://www.herber.de/bbs/user/103521.xlsm
diese Datei muss in dem selben Ordner wie die dazugehörige PowerPoint-Datei liegen.
Mit dem Namen: PPT_Template.pptx
https://www.herber.de/bbs/user/103522.ppt
Es geht darum, dass ich eine Excel-Arbeitsmappe habe mit 30 Tabellenblätter. Aus dieser Arbeitsmappe generiere ich eine PowerPoint-Präsentation.
In der Präsentation werden Tabellen aus Excel reinkopiert und Kommentare eingefügt, sowie die dazugehörigen Graphen. Die Positionen der jeweiligen zu kopierenden Inhalte sind je Tabellenblatt unterschiedlich.
Mein VBA-CODE könnt ihr aus der Beispiel-Datei entnehmen. In Wirklichkeit habe ich den Abschnitt, ab den ein Excel-Tabellenblatt aktiviert wird - für alle weiteren Tabellenblätter unter diesen Code kopiert und mit Anpassungen eingefügt.
Angepasst werden nur die Zellbezüge - sprich: Zellbezüge für die Kommentare, Namen und Tabellenbereiche.
Bei 30 Tabellenblätter ist das ganze ziemlich lang... sogar zu lang - jetzt bekomme ich neuerdings eine Fehlermeldung: Runtime Error.
Zum Code:
Zuerst habe ich alle Einfügepositionen für die PowerPoint-Folie definiert.
Dann wird erst überprüft (Auf dem "Gesamt-Überblick" Blatt) ob eine Eingabe stattgefunden hat in der Tabelle, sprich ob die Summe größer als Null ist. Wenn ja, dann kopiert er die Inhalte.
Wenn nicht prüft er die nächste Summe... usw.
Ich hoffe Ihr könnt mir weiterhelfen. Ich suche einen schlanken Ansatz, indem ich nur die Zellbezüge der einzelnen Tabellenblätter definieren muss. Alles andere, Format und Einfügepositionen bleibt ja gleich...
Seit neuestem bekomme ich auch die oben genannte Fehlermeldung (Laufzeitfehler...) ohne am Code was neues gemacht zu haben.
Viele Grüße und Beste Dank für jeden Beitrag schonmal,
Mark

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA CODE KÜRZEN / INTELLIGENT & RUNTIME ERROR
16.02.2016 09:22:48
ChrisL
Hi Mark
Sub GenAll()
'************** Start wie bisher ******************
Dim pptFileName As String
'Tabelle
Dim PastePositionLeft As Integer
Dim PastePositionTop As Integer
Dim PastePositionHeight As Integer
Dim PastePositionWidth As Integer
Dim PasteTableAsDefined As Integer
'Diagramm
Dim PastePositionLeftChart As Integer
Dim PastePositionTopChart As Integer
Dim PastePositionHeightChart As Integer
Dim PastePositionWidthChart As Integer
'Einfügeposition in [cm] definieren --> Tabelle
PastePositionLeft = Application.CentimetersToPoints(14.84)
PastePositionTop = Application.CentimetersToPoints(9.68)
PastePositionHeight = Application.CentimetersToPoints(8.1)
PastePositionWidth = Application.CentimetersToPoints(17.31)
'Einfügeposition in [cm] definieren --> Diagramm
PastePositionLeftChart = Application.CentimetersToPoints(14.84)
PastePositionTopChart = Application.CentimetersToPoints(4.12)
PastePositionHeightChart = Application.CentimetersToPoints(4.51)
PastePositionWidthChart = Application.CentimetersToPoints(17.3)
'Dateiname des Templates festlegen
pptFileName = ThisWorkbook.Path & "\PPT_Template.ppt"
Dim ppApp, ppFile, ppSlide, objShape
Set ppApp = CreateObject("Powerpoint.Application")
ppApp.Visible = msoTrue
'PowerPoint konfigurieren
Set ppFile = ppApp.presentations.Open(pptFileName)
ppApp.Activate
'Textbox in PowerPoint erstellen --> Auswahl Name
With ppFile.Slides(ppFile.Slides.Count).Shapes.AddShape(msoShapeRectangle, Application.CentimetersToPoints(15.57), Application.CentimetersToPoints(18.13), Application.CentimetersToPoints(4.15), Application.CentimetersToPoints(0.78)).TextFrame
.TextRange.Text = "PCM " & CStr(Worksheets("Gesamt-Überblick").Cells(11, 7).Value)
.TextRange.Font.Size = 12
.TextRange.Font.Size = 12
.TextRange.Font.Bold = False
.TextRange.Font.NameComplexScript = "Calibri"
.TextRange.Font.NameFarEast = "Calibri"
.TextRange.Font.Name = "Calibri"
.TextRange.Font.Color.RGB = RGB(0, 150, 150)
.TextRange.ParagraphFormat.Alignment = msoAlignLeft
.MarginBottom = Application.CentimetersToPoints(0.13)
.MarginLeft = Application.CentimetersToPoints(0.25)
.MarginRight = Application.CentimetersToPoints(0.25)
.MarginTop = Application.CentimetersToPoints(0.13)
.VerticalAnchor = msoAnchorTop
.HorizontalAnchor = msoAnchorNone
End With
With ppFile.Slides(ppFile.Slides.Count)
.Shapes(.Shapes.Count).Line.Visible = msoFalse
.Shapes(.Shapes.Count).Fill.Visible = msoFalse
End With
'***************** Ende Start ***********************
Dim WS1 As Worksheet, WS2 As Worksheet
Dim iZeile As Integer, rngKopierbereich As Range
Dim strGraph As String, strName As String
Set WS1 = Worksheets("Gesamt-Überblick")
' Blatt A
Set WS2 = Worksheets("A")
iZeile = 15
Set rngKopierbereich = WS2.Range("E46:L72")
strGraph = "Graph 1"
strName = WS1.Range("E35")
Call GenOne(ppApp, ppFile, ppSlide, objShape, WS1, WS2, iZeile, rngKopierbereich, strGraph, strName)
' Blatt B
Set WS2 = Worksheets("B")
iZeile = 16
Set rngKopierbereich = WS2.Range("E69:K103")
strGraph = "Graph 2"
strName = WS1.Range("E44")
Call GenOne(ppApp, ppFile, ppSlide, objShape, WS1, WS2, iZeile, rngKopierbereich, strGraph, strName)
'**************** Ende wie bisher ******************
Set objShape = Nothing
Set ppSlide = Nothing
Set ppFile = Nothing
Set ppApp = Nothing
End Sub
Private Sub GenOne(ppApp As Variant, ppFile As Variant, ppSlide As Variant, objShape As Variant, _
WS1 As Worksheet, WS2 As Worksheet, iZeile As Integer, rngKopierbereich, strGraph, strName)
'Excelblatt aktivieren
If WS1.Cells(iZeile, 12).Value > 0 Then
WS2.Activate
'Template-Folie für Detailsicht kopieren und einfügen --> Tabelle
Set ppSlide = ppFile.Slides(1)
ppSlide.Copy
ppFile.Slides(ppFile.Slides.Count).Select
ppApp.ActivePresentation.Slides.Paste(ppFile.Slides.Count + 1).Select
'zu kopierenden Bereich markieren --> Tabelle
rngKopierbereich.Select
'als Bild kopieren --> Tabelle
Selection.CopyPicture Appearance:=xlScreen, Format:=xlPicture
'in PowerPoint einfügen --> Tabelle
ppApp.ActiveWindow.Selection.sliderange.Shapes.Paste.Select
ppApp.ActiveWindow.Selection.ShapeRange.LockAspectRatio = msoFalse
ppApp.ActiveWindow.Selection.ShapeRange.Left = PastePositionLeft
ppApp.ActiveWindow.Selection.ShapeRange.Top = PastePositionTop
ppApp.ActiveWindow.Selection.ShapeRange.Height = PastePositionHeight
ppApp.ActiveWindow.Selection.ShapeRange.Width = PastePositionWidth
With ppFile.Slides(ppFile.Slides.Count).Select
'zu kopierenden Bereich markieren --> Diagramm
ActiveSheet.ChartObjects(strGraph).Activate
ActiveChart.ChartArea.Copy
ActiveChart.ChartArea.Select
With ppApp.ActiveWindow.Selection.ShapeRange
'in PowerPoint einfügen --> Diagramm
ppApp.ActiveWindow.Selection.sliderange.Shapes.Paste.Select
ppApp.ActiveWindow.Selection.ShapeRange.LockAspectRatio = msoFalse
ppApp.ActiveWindow.Selection.ShapeRange.Left = PastePositionLeftChart
ppApp.ActiveWindow.Selection.ShapeRange.Top = PastePositionTopChart
ppApp.ActiveWindow.Selection.ShapeRange.Height = PastePositionHeightChart
ppApp.ActiveWindow.Selection.ShapeRange.Width = PastePositionWidthChart
End With
End With
'Textbox in PowerPoint erstellen --> Kommentare
With ppFile.Slides(ppFile.Slides.Count).Shapes.AddShape(msoShapeRectangle,  _
Application.CentimetersToPoints(1.94), Application.CentimetersToPoints(4.48), Application.CentimetersToPoints(12.4), Application.CentimetersToPoints(13.25)).TextFrame
.TextRange.Text = CStr(Cells(4, 2).Value) & vbCr & vbCr & CStr(Cells(5, 2). _
Value) & vbCr & vbCr & CStr(Cells(6, 2).Value) & vbCr & vbCr & CStr(Cells(7, 2).Value) & vbCr & vbCr & CStr(Cells(8, 2).Value) & vbCr & vbCr & CStr(Cells(9, 2).Value) & vbCr & vbCr & CStr(Cells(10, 2).Value) & vbCr & vbCr & CStr(Cells(11, 2).Value) & vbCr & vbCr & CStr(Cells(12, 2).Value)
.TextRange.Font.Size = 12
.TextRange.Font.NameComplexScript = "Calibri"
.TextRange.Font.NameFarEast = "Calibri"
.TextRange.Font.Name = "Calibri"
.TextRange.Font.Color.RGB = RGB(0, 0, 0)
.TextRange.ParagraphFormat.Alignment = msoAlignLeft
.MarginBottom = Application.CentimetersToPoints(0)
.MarginLeft = Application.CentimetersToPoints(0)
.MarginRight = Application.CentimetersToPoints(0)
.MarginTop = Application.CentimetersToPoints(0)
.VerticalAnchor = msoAnchorTop
.HorizontalAnchor = msoAnchorNone
End With
With ppFile.Slides(ppFile.Slides.Count)
.Shapes(.Shapes.Count).Line.Visible = msoFalse
.Shapes(.Shapes.Count).Fill.Visible = msoFalse
End With
'Textbox in PowerPoint erstellen --> Name
With ppFile.Slides(ppFile.Slides.Count).Shapes.AddShape(msoShapeRectangle,  _
Application.CentimetersToPoints(1.75), Application.CentimetersToPoints(0.8), Application.CentimetersToPoints(30.38), Application.CentimetersToPoints(3.2)).TextFrame
.TextRange.Text = strName
.TextRange.Font.Size = 35
.TextRange.Font.NameComplexScript = "Calibri"
.TextRange.Font.NameFarEast = "Calibri"
.TextRange.Font.Name = "Calibri"
.TextRange.Font.Color.RGB = RGB(0, 0, 0)
.TextRange.ParagraphFormat.Alignment = msoAlignLeft
.MarginBottom = 0
.MarginLeft = 0
.MarginRight = 0
.MarginTop = 0
.VerticalAnchor = msoAnchorTop
.HorizontalAnchor = msoAnchorNone
End With
With ppFile.Slides(ppFile.Slides.Count)
.Shapes(.Shapes.Count).Line.Visible = msoFalse
.Shapes(.Shapes.Count).Fill.Visible = msoFalse
End With
End If
End Sub

Anzeige
AW: VBA CODE KÜRZEN / INTELLIGENT & RUNTIME ERROR
17.02.2016 08:41:34
Mark
Hallo Chris,
WOW. Super! Vielen Dank. Es funktioniert hervorragend. Habe es etwas angepasst und für alle meine Tabellenblätter definiert. Du hast mir sehr geholfen =). Bist ein Genie.
Eine Frage habe ich noch:
In 1 von 10 Fallen erscheint manchmal die Fehlermeldung:
'Run-time error '-2147188160(80048240)';
Shapes.Paste.Select: invalid request. To select a shape, its value must be active.

Also in meinem Code hier die erste Zeile:
'in PowerPoint einfügen --> Tabelle
ppApp.ActiveWindow.Selection.sliderange.Shapes.Paste.Select
ppApp.ActiveWindow.Selection.ShapeRange.LockAspectRatio = msoFalse
ppApp.ActiveWindow.Selection.ShapeRange.Left = PastePositionLeft
ppApp.ActiveWindow.Selection.ShapeRange.Top = PastePositionTop
ppApp.ActiveWindow.Selection.ShapeRange.Height = PastePositionHeight
ppApp.ActiveWindow.Selection.ShapeRange.Width = PastePositionWidth
Dies passiert obwohl ich keine andere Datei offen habe, weder PPT noch Excel.
Vielen Dank nochmals.
Viele Grüße,
Mark

Anzeige
AW: VBA CODE KÜRZEN / INTELLIGENT & RUNTIME ERROR
17.02.2016 09:41:35
Mark
Hi Chris,
Sorry anstatt Value meinte ich View und anstatt active sollte da visible stehene.
Hier nochmal:
'Run-time error '-2147188160(80048240)';
Shapes.Paste.Select: invalid request. To select a shape, its view must be visible

Gruß,
Mark

AW: VBA CODE KÜRZEN / INTELLIGENT & RUNTIME ERROR
17.02.2016 10:32:40
ChrisL
Hi Mark
Da bin ich überfragt. Mit dem Verhalten von ppt und VBA kenne ich mich zu wenig aus.
Grundsätzlich lässt sich Select aber fast immer vermeiden (ob in diesem Fall auch, kann ich nicht konkret sagen). Insofern würde ich ganz generell mal schauen, dass du die Select weg bringst.
http://www.online-excel.de/excel/singsel_vba.php?f=61
cu
Chris
Anzeige

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige