Problem Makro automatisches einfügen von Bildern

Hallo zusammen. Ich habe ein Makro gemacht zum automatisch Bilder einfügen. Nun wollte ich die Bilder auch schön zentrieren und alle auf die selbe Grösse anpassen. Alles funtioniert wunderbar bis auf eine Kleinigkeit: Wenn Bilder breiter als hoch sind und nur ganz wenig hoch sind, werden sie komischerweise immer erst eine Zeile weiter unten eingefügt. Weiss jemand an was die liegt?
Hier mein Makro:

Option Explicit

Sub Bilder_einfügen()
ActiveWorkbook.SaveAs „C:\oehri_temp.xls“ 'Datei mit neuem Namen Speichern, damit keine Bilder im Original (automatisch Überschreiben möglich?)
Dim Pfad As String, Wiederholungen As Long 'While Schleife
Dim Hoehe As String 'Die Höhe der Spalte wird von Zelleninhalt genommen
Dim Faktor As String 'Faktor zum umrechnen des Verhältnis Höhe/Breite
Hoehe = ActiveSheet.Cells(3, 3).Value 'Zelle in der Höhe definiert wird
On Error Resume Next 'Immer wieder von vorne anfangen…
Pfad = „C:\bilder“ '****************** Bilder Pfad **********************
For Wiederholungen = 9 To Range(„A65536“).End(xlUp).Row 'Immer eine Zeile nach der anderen durchgehen
Cells(Wiederholungen, 2).Activate 'Zelle von aktueller Zeile auswählen
If Dir(Pfad & Cells(Wiederholungen, 3) & „.jpg“) „“ Then 'Wenn Bild vorhanden…
ActiveSheet.Pictures.Insert(Pfad & Cells(Wiederholungen, 3) & „.jpg“).Select '… Bild einfügen
With Selection
.ShapeRange.LockAspectRatio = msoTrue 'Seitenverhältnis sperren (unnötig glaubs)
Faktor = .Width / .Height 'Seitenverhältnis
.Height = Hoehe 'Höhe fix
.Width = Hoehe * Faktor 'Breite mal Faktor für richtiges Verhältnis
If .Width > 145 Then '***** Umkehrung wenn Bild Breiter als Hoch *****
Faktor = .Width / 145
.Height = Hoehe / Faktor
.Width = 145
End If
.Left = ActiveCell.Left + (145 + 3 - .Width) / 2 'verschieben nach rechts in die Mitte der Zelle mit kleinem Abstand
.Top = ActiveCell.Top + (Hoehe + 3 - .Height) / 2 'verschieben nach unten in die Mitte der Zelle mit kleinem Abstand
End With
Else
If Cells(Wiederholungen, 3).Value = „“ Then 'wenn Zeile kein Bild haben soll nichts machen
Else
ActiveSheet.Pictures.Insert(Pfad & „blanko.jpg“).Select 'wenn Zeile ein Bild haben soll, aber keins Vorhanden ist, Standardbild einfügen
With Selection
.ShapeRange.LockAspectRatio = msoTrue
Faktor = .Width / .Height
.Height = Hoehe
.Width = Hoehe * Faktor
If .Width > 145 Then
Faktor = .Width / 145
.Height = Hoehe / Faktor
.Width = 145
End If
.Left = ActiveCell.Left + (145 + 3 - .Width) / 2
.Top = ActiveCell.Top + (Hoehe + 3 - .Height) / 2
End With
End If
End If
If Cells(Wiederholungen, 3).Value = „“ Then
Cells(Wiederholungen, 3).RowHeight = 30 '***** Breite = Höhe aber egal hehe *****
Else
Cells(Wiederholungen, 3).RowHeight = Hoehe + 3 '***** Breite = Höhe aber egal hehe *****
End If
Next
End Sub

Gruss

Hi FordPerfect,
benutze bitte den Pre-tag um Einrückungen im Code zu erhalten, pre-Tag wird unterhalb des Eingabefensters erläutert.

Auf den ersten Blick, warum definierst du Höhe und Faktor als String?
Du willst doch damit rechnen!?

Lass mal On error resume next weg, wo tauchen Fehler auf?

Und zu Seitenverhältnis sperren, wenn du sowieso Höhe und breite selbst festlegen willst kann es einzig Probleme geben solltest du es sperren, nötig ist es dann nicht.

Gruß
Reinhard

pre-Tag wird unterhalb des Eingabefensters erläutert.

Okay sorry ich merke es mir für das nächste Mal (kann Nachricht nicht ändern?)

Auf den ersten Blick, warum definierst du Höhe und Faktor als
String?

Kein Ahnung! Hauptsache es funktioniert oder? Ich dachte String ist das selbe wie Variable, kenne mich nur mit PHP aus :wink:

Lass mal On error resume next weg, wo tauchen Fehler auf?

Keine Fehler!

Und zu Seitenverhältnis sperren, wenn du sowieso Höhe und
breite selbst festlegen willst kann es einzig Probleme geben
solltest du es sperren, nötig ist es dann nicht.

Stimmt, diese Funktion funktioniert sowieso nicht! Habe das schon nachgelesen… alle scheinen damit Probleme zu haben. Habe es rausgenommen aber bringt mich nicht weiter.

Das Problem bleib bestehen: Wenn ein Bild, sagen wir mal, 400 x 10 Pixel ist kommt es erst in der nächsten Zeile… :frowning:((

Gruss

FP

Hallo FP,

pre-Tag wird unterhalb des Eingabefensters erläutert.

Okay sorry ich merke es mir für das nächste Mal (kann
Nachricht nicht ändern?)

nein. (Btw es gibt den Button Vorschau )
Ändern geht nicht als Normaluser, aber solange noch keiner darauf geantwortet hat, kannste dir deinen Text mit Strg+A, Strg+C sichern, dann deinen Beitrag löschen.
Der Betreff ist dann futsch, aber den Beitragsinhalt haste ja noch wenn du einen neuen Beitrag erstellst

Auf den ersten Blick, warum definierst du Höhe und Faktor als
String?

Kein Ahnung! Hauptsache es funktioniert oder? Ich dachte
String ist das selbe wie Variable, kenne mich nur mit PHP aus
:wink:

In Vba von Excel ist String Text. Daß kein Fehler kommt, liegt daran daß Excel mitdenkt :smile:

Gehe mal in die vba -Hilfe und schau nach variant,Integer,Double,Long,Date usw.
Gibt es das bei PHP nich?

Lass mal On error resume next weg, wo tauchen Fehler auf?

Keine Fehler!

Dann lass es erst mal weg. Bei der Entwicklung von Code ist das störend weil ich will ja wissen wo Fehler sind. Erst wenn man genau weiß warum wo ein nicht abfangbarer Fehler entsteht baut man das ein.

Aber Fehlerbehandlung ist ein weites Gebiet, ich wage zu behaupten, wenn man es korrekt macht und alle möglichen Fehlerursachen durch Fehlerbehandlungsroutinen „behandeln“ läßt, hat man damit weit mehr zu tun als mit dem eigentlichen Code.

Und zu Seitenverhältnis sperren, wenn du sowieso Höhe und
breite selbst festlegen willst kann es einzig Probleme geben
solltest du es sperren, nötig ist es dann nicht.

Stimmt, diese Funktion funktioniert sowieso nicht! Habe das
schon nachgelesen… alle scheinen damit Probleme zu haben.
Habe es rausgenommen aber bringt mich nicht weiter.

Aber klar bringt dich das in der Erkenntnis weiter, dein Code klappt nicht, egal ob du das Seitenverhältnis sperrst oder nicht *grins*
D.h. der „Fehler“, liegt nicht daran und das bringt dich dann doch schon weiter in der Fehlersuche.

Das Problem bleib bestehen: Wenn ein Bild, sagen wir mal, 400
x 10 Pixel ist kommt es erst in der nächsten Zeile… :frowning:((

So ein Bild würde ich als dicke Linie bezeichen*gg*
(Mein zweitnick ist „Neugierig“, was für Bilder sind denn das?)

Ich hatte gestern keine Zeit deinen Code zu testen, mache ich heute Abend, mal schauen, vielleicht finde ich ja die dicke Kartoffel :smile:

Gruß
Reinhard

Hallo Reinhard und danke für die Antwort.

nein. (Btw es gibt den Button Vorschau )
Ändern geht nicht als Normaluser, aber solange noch keiner
darauf geantwortet hat, kannste dir deinen Text mit Strg+A,
Strg+C sichern, dann deinen Beitrag löschen.
Der Betreff ist dann futsch, aber den Beitragsinhalt haste ja
noch wenn du einen neuen Beitrag erstellst

Ja okay, das ist Rhetorik :stuck_out_tongue:

Auf den ersten Blick, warum definierst du Höhe und Faktor als
String?

Kein Ahnung! Hauptsache es funktioniert oder? Ich dachte
String ist das selbe wie Variable, kenne mich nur mit PHP aus
:wink:

In Vba von Excel ist String Text. Daß kein Fehler kommt, liegt
daran daß Excel mitdenkt :smile:

Gehe mal in die vba -Hilfe und schau nach
variant,Integer,Double,Long,Date usw.
Gibt es das bei PHP nich?

Nö, so nicht, PHP ist noch schlauer :wink:

Dann lass es erst mal weg. Bei der Entwicklung von Code ist
das störend weil ich will ja wissen wo Fehler sind. Erst wenn
man genau weiß warum wo ein nicht abfangbarer Fehler entsteht
baut man das ein.

Ja okay, aber es ist kein Fehler.

Aber Fehlerbehandlung ist ein weites Gebiet, ich wage zu
behaupten, wenn man es korrekt macht und alle möglichen
Fehlerursachen durch Fehlerbehandlungsroutinen „behandeln“
läßt, hat man damit weit mehr zu tun als mit dem eigentlichen
Code.

Ich habe das natürlich schon gemacht, bevor ich hier geschrieben habe. Ich kenne Methoden zur Fehlerbehandlung. Ich habe z.B. via MsgBox alle Abstände ausgeben lassen. Wenn das Problem einfach zu lösen wäre, hätte ich hier nicht geschrieben.

Aber klar bringt dich das in der Erkenntnis weiter, dein Code
klappt nicht, egal ob du das Seitenverhältnis sperrst oder
nicht *grins*
D.h. der „Fehler“, liegt nicht daran und das bringt dich dann
doch schon weiter in der Fehlersuche.

Es ist kein Fehler nur unnötig. Wir reden hier nicht von optimieren. :wink:

Das Problem bleib bestehen: Wenn ein Bild, sagen wir mal, 400
x 10 Pixel ist kommt es erst in der nächsten Zeile… :frowning:((

So ein Bild würde ich als dicke Linie bezeichen*gg*
(Mein zweitnick ist „Neugierig“, was für Bilder sind denn
das?)

Es sind etwa 3000 Bilder. Der Strich wäre eine Antenne.

Ich hatte gestern keine Zeit deinen Code zu testen, mache ich
heute Abend, mal schauen, vielleicht finde ich ja die dicke
Kartoffel :smile:

Gruß
Reinhard

Würde mich freuen, wenn dus mal anschauen könntest.

Gruss

FP

Hallo FP,

ich habe es mir gestern angeschaut, kann aber nicht nachvollziehen, warum da etwas eine Zeile tiefer rutscht.
Nun gut, ich weiß ja nicht was du in C3 stehen hast und wie groß deine Bilder so sind.
Ich habe den Code, naja irgednwas mußte ich ja machen, wenn ich den „Fehler“ schon nicht sehe, leicht abgeändert, das Wesentliche, also die Berchnungen müßten noch genauso funktionieren.
Bei meinen Tests mit 2 Bildern werden die linken oberen Ecken der Bilder wie von dir beschrieben in die Mitte der Zelle gestellt, plus dem Versatz von 3 nach rechts und unten.
Naja, schaue es dir an, vielleicht kannste ja was davon brauchen:

Option Explicit
'
Sub Bilder\_einfügen()
'ActiveWorkbook.SaveAs "C:\oehri\_temp.xls" 'Datei mit neuem Namen Speichern, damit keine Bilder im Original (automatisch Überschreiben möglich?)
Dim Pfad As String, Wiederholungen As Long 'While Schleife
Dim Hoehe As Double 'Die Höhe der Spalte wird von Zelleninhalt genommen
Dim Bild As String, Zelle As Range, Ze As Range
Call Reset
Hoehe = ActiveSheet.Cells(3, 3).Value 'Zelle in der Höhe definiert wird
Pfad = "C:\Dokumente und Einstellungen\User\Eigene Dateien\"
For Wiederholungen = 9 To Range("A" & Rows.Count).End(xlUp).Row 'Immer eine Zeile nach der anderen durchgehen
 Set Zelle = Cells(Wiederholungen, 3)
 If Zelle.Value "" Then 'Zelle leer=kein Bild
 Bild = Pfad & "user.bmp" 'Standardbild
 If Dir(Pfad & Zelle.Value & ".bmp") "" Then Bild = Pfad & Zelle.Value & ".bmp"
 Set Ze = Zelle.Offset(0, -1) 'Zelle von aktueller Zeile auswählen
 ActiveSheet.Pictures.Insert(Bild).Name = "Bild" & Wiederholungen '.Select '... Bild einfügen
 Zelle.RowHeight = IIf(Zelle.Value = "", 30, Hoehe + 3)
 With ActiveSheet.Shapes("Bild" & Wiederholungen)
 .Height = IIf(.Width \> 145, Hoehe \* 145 / .Width, Hoehe)
 .Width = IIf(.Width \> 145, 145, .Width \* Hoehe / .Height)
 .Left = Ze.Left + Ze.Width / 2 + 3 'verschieben nach rechts in die Mitte der Zelle mit kleinem Abstand
 .Top = Ze.Top + Ze.Height / 2 + 3 'verschieben nach unten in die Mitte der Zelle mit kleinem Abstand
 End With
 End If
Next Wiederholungen
End Sub
'
Sub Reset()
Dim S
For Each S In ActiveSheet.Shapes
 If S.Name Like "Bild\*" Then S.Delete
Next S
Cells.Rows.AutoFit
End Sub

Gruß
Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hey Reinhard

Dein Code ist wohl meinem weit voraus…
Vor allem das mit dem Reset find ich witzig :wink:

Leider klapp es nicht, die Bilder werden nicht mehr richtig angepasst.

Ich weiss du meinst es gut, aber leider ist mir damit nicht geholfen.

Vielleicht kann ich dir ja mal eine Excel Datei aus Beispiel senden.

Gruss

FP

BTW: in der Zelle steht nur die Höhe der Spalten mit Bild. Und Meine Bilder sind von 50x50 Pixel bis 9999x9999 Pixel. Also Kunterbunt gemischt.

Hi FP,

Leider klapp es nicht, die Bilder werden nicht mehr richtig
angepasst.
Ich weiss du meinst es gut, aber leider ist mir damit nicht
geholfen.

Jepp, knapp daneben ist leider auch völlig vorbei :smile:

Vielleicht kann ich dir ja mal eine Excel Datei aus Beispiel
senden.

Nein, lade sie besser irgendwo hoch, http://www.hostarea.de o.ä. dann können dir hier alle helfen.

Und, ich habe noch nicht verstanden was die Unterscheidung >145 soll.
Und wieso du da irgendwann auf das Seitenverhältnis 400:10 kommst.

Und wieso PHP schlauer ist habe ich auch nicht verstanden, ich denke mir jedes Programm benötigt eine Variablendeklaration/definition.
Klar kann jedes Programm erkennen ob z.B. „01.01.2008“ ein gültiges Datum ist, aber es weiß absolut nicht ob ich diesen Wert/Text als Datum, als Text, oder in Excel als Zahl oder in PHP als Any oder sonstwas weiter verarbeiten will.
Und dafür ist die Variablendefinition da.
Und die ist eindeutig. Lassen wir mal weg daß man in C o.ä. Funktionen usw. „überladen“ kann, sodaß halt die gleiche Funktion sich bei unterschiedlichen Typen der Parameter sich unterschiedlich verhält, oder so ähnlich.

Gruß
Reinhard

Hier ein genaues Beispiel:

http://hurtec.ch/beispiel.rar

Gruss

FP

Und wieso PHP schlauer ist habe ich auch nicht verstanden, ich
denke mir jedes Programm benötigt eine
Variablendeklaration/definition.
Klar kann jedes Programm erkennen ob z.B. „01.01.2008“ ein
gültiges Datum ist, aber es weiß absolut nicht ob ich diesen
Wert/Text als Datum, als Text, oder in Excel als Zahl oder in
PHP als Any oder sonstwas weiter verarbeiten will.
Und dafür ist die Variablendefinition da.
Und die ist eindeutig. Lassen wir mal weg daß man in C o.ä.
Funktionen usw. „überladen“ kann, sodaß halt die gleiche
Funktion sich bei unterschiedlichen Typen der Parameter sich
unterschiedlich verhält, oder so ähnlich.

Gruß
Reinhard

Variablen in PHP:

$a = "abc";
$a = 1;
$a .= 1;
$a = $a / 2;
echo $a // = 5.5

$b[1] = "abc";
$b[2] = $a;
$b[3] = $b[1].$b[2];
echo $b[3] //abc5.5

Einen Array oder eine Variable zu definieren ist in PHP um ein vielfaches einfacher.