Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
27.10.12, 14:44
|
#1
|
Mitglied
Registriert seit: Jun 2010
Beiträge: 318
Bedankt: 92
|
Bilder verkleinern mit Visual Basic-Makro
Hallo Community!
Ich habe eine Frage zu Visual Basic. Ich fange grade erst an mich näher damit zu beschäftigen und bin deshalb nicht so weit, dass ich solche superkomplexen Sachen programmieren könnte.
Ich möchte gerne per Makro alle Bilder in einer Power Point Präsentation verkleinern lassen. Was ich mit Google und ein paar Handbüchern hinbekommen habe ist, dass das Makro alle Bilder auf allen Slides in der ganzen Präsi auf eine bestimmte Größe verkleinert. Nur bräuchte ich das Ganze etwas aufwändiger... und das kriege ich nicht hin, ich weiß nicht wie ich das machen soll.
Ich habe eine Präsentation angehängt, auf der beschrieben ist, was ich brauche. Denn alle Bilder müssen verschiedene Maße bekommen, je nach dem was in der Überschrift des Slides steht. Das Bild auf Slide 1 mit der Überschrift "lalalala" zB soll per Makro auf 1,5*1,5 cm resized werden, das auf Slide mit der Überschrift "babababa" wiederum auf 2*2 cm usw. Auf Slide 4 sind sogar 2 Bilder, die verschiedene Größen bekommen sollen.
Das Problem ist vor allem: die Bilder heißen alle GLEICH. Sie werden von einer Software automatisch reinkopiert und erhalten alle den Namen "Picture1" - daran kann ich auch nichts ändern. Man kann also nicht mit dem Bildernamen arbeiten. Und auch nicht mit Slidenummern, weil diese variieren. Die Präsentation soll nur ein Beispiel sein.
Die erste Frage lautet deshalb erst einmal: ist sowas grundsätzlich überhaupt möglich - Bilder per Makro auf verschiedene Größen zu resizen, obwohl alle denselben Namen haben, und ohne Angabe der Slides, weil diese ja variieren - nur mit Angabe dessen, was in der Überschrift auf dem selbeN Slide steht?
Ich stehe grade total auf dem Schlauch...
danke für jede Antwort!
Hier die Datei (nur 32 kb)
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
VG 
|
|
|
27.10.12, 16:34
|
#2
|
Anfänger
Registriert seit: Feb 2010
Beiträge: 27
Bedankt: 5
|
Die Antwort ist: Ja
|
|
|
27.10.12, 16:51
|
#3
|
Mitglied
Registriert seit: Jun 2010
Beiträge: 318
Bedankt: 92
|
Super, vielen Dank.
Könntest du (oder jemand sonst) mir ein bisschen helfen? Das hört sich für mich ziemlich kompliziert an und ich weiß garnicht wo ich da ansetzen soll...
Der erste Schritt wäre Slides 1-3 von meinem Beispiel hinzubekommen, Slide 4 ist für mich pers. dann noch mal komplizierter, aber Voraussetzung wäre sowas wie:
WENN "xxx" in Textfeld "xxx" steht (auf beliebigem Slide) DANN ändere die Größe von Bild "Picture1" (oder einfach von EACH Picture - weil ja sowieso alle gleich heißen) auf x mal x Pixel.
Wie gesagt, das was ich hingekriegt habe ist, dass das Makro auf ALLEN Slides alle Bilder resized. Ich verwende hierfür diesen Code:
Sub PictureSizer()
For NumSlide = 1 To ActivePresentation.Slides.Count
ActivePresentation.Slides(NumSlide).Select
For Each Picture In ActiveWindow.Selection.SlideRange.Shapes
Picture.Select
Picture.LockAspectRatio = msoFalse
Picture.Height = 100.00
Picture.Width = 100.00
Next
Next
End Sub
Wie ginge es nun weiter? Wie baue ich diese Textfeld-Bedingung ein, damit dieser Befehl nur ausgeführt wird, wenn "xxx" in dem Überschriften-Textfeld steht?
Vielen Dank!
|
|
|
28.10.12, 14:51
|
#4
|
Anfänger
Registriert seit: Feb 2010
Beiträge: 27
Bedankt: 5
|
Du brauchst eine eindeutige Liste, wo drinsteht, bei welchem Slide oder welcher Überschrift welches Zielformat zu generieren ist.
Dann iterierst du durch alle Sllides und alle Bilder eines Slides, guckst in der Liste nach und paßt entsprechend die Größe so an, wie es in der Liste steht.
|
|
|
28.10.12, 16:47
|
#5
|
Mitglied
Registriert seit: Jun 2010
Beiträge: 318
Bedankt: 92
|
Hi,
bei welchem Slide fällt ja aus - dann eher bei welcher Überschrift.
Aber ich kann keine fixe Liste erstellen, die abgearbeitet wird, da sich die Anzahl der Slides und die Reihenfolge der Slides und Bilder etc. jede Woche ändern... die Präsi, für die das Makro bestimmt ist, ändert sich jedes Mal.
In der Theorie komme ich ja mit, aber wie sieht das codetechnisch aus!?
Wie baue ich eine Iteration ein, die nur bei gewissen Bedingungen greift?
Könntest du mir für die Beispielpräsi, die ich dir geschickt habe, auch einen Beispiel-Code zeigen?
Vielen Dank!
MfG 
|
|
|
28.10.12, 20:14
|
#6
|
Mitglied
Registriert seit: Jun 2010
Beiträge: 318
Bedankt: 92
|
@trovato: wo denn zb? wo kann ich denn schnell und ohne anmeldung files hochladen und runterladen? hier wird halt oft uploaded verwendet, deswegen dachte ich das würde passen...
@forenregelnleser:
was für ein guter erster beitrag in diesem forum...
ist hier auch jemand, der wirklich helfen möchte?
|
|
|
29.10.12, 20:27
|
#7
|
Anfänger
Registriert seit: Feb 2010
Beiträge: 27
Bedankt: 5
|
Zitat:
Aber ich kann keine fixe Liste erstellen
|
Ich habe auch nichts von fix gesagt.
Wo kommen denn die Infos her, wie welches Bild verkleinert werden soll?
|
|
|
29.10.12, 20:28
|
#8
|
Anfänger
Registriert seit: Feb 2010
Beiträge: 27
Bedankt: 5
|
Zitat:
Aber ich kann keine fixe Liste erstellen
|
Ich habe auch nichts von fix gesagt.
Wo kommen denn die Infos her, wie welches Bild verkleinert werden soll?
|
|
|
30.10.12, 08:29
|
#9
|
Mitglied
Registriert seit: Jun 2010
Beiträge: 318
Bedankt: 92
|
Hi,
der Text in der Überschrift soll die Bedingung sein. Wenn dort bspw. "lala" im Textfeld der Überschrift steht soll das Bild auf diesem Slide eine bestimmte Größe bekommen, wenn dort "gaga" drin steht, soll das Bild eine andere Größe bekommen etc.
|
|
|
30.10.12, 20:04
|
#10
|
Anfänger
Registriert seit: Feb 2010
Beiträge: 27
Bedankt: 5
|
dann geh so vor:
du erstellst dir eine Textdatei mit Zuordnung von Überschrift und zugehöriger Bildgröße
dein programm liest dann als erstes diese Datei ein und speichert sie in einer geeigneten struktur
dann machst du iterativ für alle slides
1. überschrift ermitteln
2. überschrift in der Struktur (aus der eingelesenen datei) suchen
3a. beim Treffer: alle bilder dieses slides entsprechend der größe zur gefundenen überschrift verkleinern
3b. kein treffer, dann einen dialog zeigen wo der anwender die größe eintippen kann (alternativ: eine standardgröße verwenden) und dann wie bei 3a alle bilder dieses slides gemäß der angegebenen größe (oder der standardgröße) verkleinern
bei angabe der größe über anwenderdialog ist es dann auch sinnvoll, die angaben in der struktur und in der datei zu speichern, damit man sie fürs nächste mal schon kennt
|
|
|
30.10.12, 23:52
|
#11
|
Mitglied
Registriert seit: Jun 2010
Beiträge: 318
Bedankt: 92
|
hi Traeumer0069,
danke erstmal für deine hilfe!
das klingt alles sehr plausibel, aber meine VBA kenntnisse sind leider noch nicht so fortgeschritten, wie es diese "aufgabe" wohl verlangt, damit ich es selber programmieren könnte...
ich vermute aber, dass ich es nachvollziehen könnte wenn ich einen fertigen code zu meiner beispieldatei sehen könnte - dann könnte ich es eventuell selbst schaffen das auf die richtige datei zu übertragen. aber ich brauche eben erst einen funktionierenden code als grundlage - zumindest für mein beispiel.
würdest du mir helfen? ich wäre dir echt dankbar!
|
|
|
31.10.12, 12:41
|
#12
|
Anfänger
Registriert seit: Feb 2010
Beiträge: 27
Bedankt: 5
|
Wenn es eine Aufgabe im privaten Umfeld ist, dann hast du ja beliebig Zeit, also fang einfach an. Bei konkreten Problemen kannst du ja den betreffenden Code hier posten.
Nach dem weiter oben geposteten Code solltest du dich aber lieber erst in die VB Grundlagen einarbeiten, als Stichwort sei mal gesagt: explizite/implizite Variablendeklaration, Errorhandling.
Wenn du einen fertigen Code haben willst, kann ich dir gern meinen Tagessatz sagen.
|
|
|
03.11.12, 13:22
|
#13
|
Mitglied
Registriert seit: Jun 2010
Beiträge: 318
Bedankt: 92
|
Hi,
ich habe jetzt ein wenig herumversucht und es läuft gar nicht mal so schlecht. Das hier habe ich gebastelt und es funktioniert im Prinzip.
Code:
Sub resizePicsOverviewslide()
Dim pres As Presentation
Dim slid As Slide
Dim sCount As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim checkedForResize As Boolean
Set pres = ActivePresentation
sCount = pres.Slides.Count
With pres
For i = 1 To sCount
Set slid = pres.Slides(i)
For j = 1 To slid.Shapes.Count
If slid.Shapes(j).HasTextFrame = True Then
If Right(slid.Shapes(j).TextFrame.TextRange, 8) = "overview" Then
'MsgBox "Slide " & i & ", shape " & j & ": " & slid.Shapes(j).TextFrame.TextRange
For k = 1 To slid.Shapes.Count
If Left(slid.Shapes(k).Name, 7) = "Picture" Then
If slid.Shapes(k).Left < 300 Then
'resize
slid.Shapes(k).LockAspectRatio = msoTrue
slid.Shapes(k).Height = 36.85
End If
End If
Next k
checkedForResize = True
End If
If checkedForResize = True Then
checkedForResize = False
GoTo BailOut
End If
End If
Next j
BailOut:
Next i
End With
End Sub
Ich vermute es ist sehr viel umständlicher als nötig und es geht auch einfacher...? Aber nichtsdestotrotz, es geht ja!
Nur eine Sache: ich müsste die Bilder auf eine Maximalhöhe und Maximalbreite einstellen. Die Maximalhöhe ist 1,3 cm, so ist es grade auch im Makro eingestellt. Dadurch dass die Seitenverhältnisse beibehalten werden soll (LockAspectRatio) stellt er die Breite automatisch ein. Aber was wenn ich auch in der Breite ein Maximum haben möchte? Das Bild darf maximal 1,3cm hoch und maximal 2,7cm breit werden, je nach dem was der Fall ist. Es soll halt nich passieren, dass das Bild ohne dass die Seitenverhältnisse beachtet werden auf die fixe Größe von 1,3 x 2,7 resized wird.
|
|
|
03.11.12, 14:36
|
#14
|
Anfänger
Registriert seit: Feb 2010
Beiträge: 27
Bedankt: 5
|
ich würde einfach die Höhe (mit LockAspectRatio) auf den gewünschten Wert setzen und danach überprüfen, ob die neu entstandene Breite die Maximalbreite überschreitet.
Wenn ja, wird (wieder mit LockAspectRatio) die Breite aufs Breitenmaximum gesetzt, dh. verkleinert. Damit verkleinert sich logischerweise auch die Höhe und alles paßt.
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.
().
|