Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
848to852
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
848to852
848to852
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Bilder positionieren & beschriften

Bilder positionieren & beschriften
03.03.2007 07:29:01
Veit
Hallo und Guten Morgen,
ich bekomme es einfach ohne Hilfe nicht hin. Hoffentlich könnt Ihr mir die "Augen öffnen" (habe wegen dieses Problems nicht so gut geschlafen ;-) ):
Folgendes möchte ich erreichen:
Es sollen (viele) Bilder -vom Print-Button einer UF aus- in eine Tabelle eingefügt werden. Sie sollen beschriftet und dann so in dem Sheet positioniert werden, dass kein Bild von einem Seitenumbruch "zerschnitten" wird.
Ich habe jetzt ein Wahnsinnskonstrukt, welches allerdings 2 Nachteile hat: zum einen funktionierts nicht und zum anderen würde es dank select, auch wenn ich es zum laufen bekäme, unheimlich langsam sein.
Im Moment, bin ich einfach am Ende, da ich schon einige "schlaflose" Nächte deshalb hinter mir habe...
Ich hoffe, dass Ihr mir helfen könnt.
Bye und für alle ein schönes Wochenende
Ein Veit

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bilder positionieren & beschriften
03.03.2007 17:02:00
Veit
Hallo, ich nochmal.
Vielleicht fällt es ja leichter meinen Fehler zu finden, wenn Ihr "ihn" seht...
Ich habe den betreffenden Code hier mal ausgegliedert, so dass er auch in einem Modul funktioniert... naja bis zum Fehler eben.
Sub cmb_print_Click()
Dim wb1 As Workbook
Dim ws1 As Worksheet
Set wb1 = ActiveWorkbook
Set ws1 = wb1.Worksheets("Tabelle2")
'pfad='Pfad zum Bilderverzeichnis (Achtung: letztes Zeichen "\")
'wort='name des Bildes ohne Dateiendung
pfad = "J:\Dieter\Bilder\"
wort = "ab"
'normalerweise sind das viele verschieden Bilder, aber damit Ihr das besser testen könnt
'geht es hier mit dem gleichen Bild 30 x hintereinander
zaehler = 1
ersteswort = True
bildbreite = 150
bildhoehe = 214
Do While zaehler < 30
If Dir(pfad & wort & ".jpg") <> "" Then
If ersteswort = True Then
On Error GoTo neues_workbook
ActiveWorkbook.Sheets.Add before:=ActiveWorkbook.Sheets(1)
GoTo weiter
neues_workbook:
Application.Workbooks.Add
weiter:
On Error GoTo 0
Set wb1 = ActiveWorkbook
Set ws1 = wb1.Sheets(1)
ws1.Name = "Druckausgabe " & wb1.Worksheets.Count
ws1.Cells.ColumnWidth = 1
ws1.Cells.RowHeight = 10
'Kontrolle der maximalen Breite der seite
'Testobjekt schrittweise solange breiter machen bis es einen Seitenumbruch gibt
'das habe ich noch nicht gemacht... aus vielleicht verständlichen Gründen ;-) :-(
'Bild einfügen
ws1.Pictures.Insert(pfad & wort & ".jpg").ShapeRange.Name = "Bild_" & zaehler
Set objPicture = ws1.Shapes("Bild_" & zaehler)
'(?)Breite und Höhe festlegen (?)
'da die Bilder unterschiedliche Abmessungen haben, bringe ich die hier auf gleiche Größe
'normalerweise wird das berechnet, um die Seitenverhältnisse zu behalten. Hier habe ich das _
rausgenommen
objPicture.Width = bildbreite
objPicture.Height = bildhoehe
'nächste Position (left/top) ermitteln
spalte = ws1.Shapes(zaehler).Left + objPicture.Width
zeile = ws1.Shapes(zaehler).Top '+ objPicture.Height
'text (wenn Text gewünscht) rein
'If opt_ja.Value = True Then
ws1.Shapes.AddTextbox(msoTextOrientationHorizontal, 10, 10, 10, 10).Name = "Bescheibung_" _
& _
zaehler
'Set objTextbox = ws1.Shapes("Bescheibung_" & zaehler)
ws1.Shapes("Bescheibung_" & zaehler).Select
With Selection
.Text = wort
.HorizontalAlignment = xlCenter
.AutoSize = True
.ShapeRange.ZOrder msoBringToFront
.ShapeRange.Left = (objPicture.Left + (objPicture.Width / 2)) - .Width / 2
.ShapeRange.Top = objPicture.Top + objPicture.Height - .Height
End With
'End If
ersteswort = False
Else
ws1.Cells(1, 1).Select
ws1.Pictures.Insert(pfad & wort & ".jpg").ShapeRange.Name = "Bild_" & zaehler
'Set objPicture = ws1.Shapes("Bild_" & zaehler)'das funktioniert überhaupt nicht, deshalb das _
SELECT
ws1.Shapes("Bild_" & zaehler).Select
'(?)Breite und Höhe festlegen (?)
Selection.Width = bildbreite
Selection.Height = bildhoehe
'vorläufige Position festlegen
Selection.Left = spalte
Selection.Top = zeile
'Test ob es einen Seitenumbruch gibt
'Leider kann ich auf diese Art nur die erste "Seitenspalte" bis runter nutzen
'das sollte zwar eigentlich reichen (die Anzahl der Bilder wäre auch schon enorm) aber es ist _
eben nicht _
perfekt
cFull = 0
For Each pbv In ws1.VPageBreaks
If pbv.Extent = xlPageBreakFull Then cFull = cFull + 1
Next
If cFull > 0 Then 'wenn rechts eine neue Seite begonnen wurde
zeile = zeile + bildhoehe
Selection.Top = zeile
Selection.Left = ws1.Shapes("Bild_1").Left
cFull = 0
ws1.Cells(1, 1).Select
'For Each pbh In ws1.HPageBreaks
'    If pbh.Extent = xlPageBreakFull Then cFull = cFull + 1
'Next
If seitenumbruchzaehler <> ws1.HPageBreaks.Count Then
seitenumbruchzaehler = ws1.HPageBreaks.Count
'!!!!!!!!!!!!!!!!!!!Hier kommt der Fehler!!!!!!!!!!!!! und ich habe keine Ahnung warum
zellenzeile = ws1.HPageBreaks(seitenumbruchzaehler).Location.Row - 1
ws1.Shapes("Bild_" & zaehler).Select
Selection.Delete
ws1.Cells(zellenzeile + 1, 1).Select
ws1.Pictures.Insert(pfad & wort & ".jpg").ShapeRange.Name = "Bild_" & zaehler
ws1.Shapes("Bild_" & zaehler).Select
zeile = Selection.Top '+ bildhoehe
End If
End If
ws1.Shapes("Bild_" & zaehler).Select
spalte = Selection.Left + Selection.Width
oben = Selection.Top
hoehe = Selection.Height
Links = Selection.Left
breite = Selection.Width
ws1.Cells(1, 1).Select
'If opt_ja.Value = True Then 'das ist ein Optionsbutton, falls man sich die Bezeichnung nicht _
anzeigen lassen _
möchte
ws1.Shapes.AddTextbox(msoTextOrientationHorizontal, 10, 10, 10, 10).Name = "Bescheibung_" _
& _
zaehler
'wieder die Sache, dass das mit dem benannten Objekt nicht funktioniert
'Set objTextbox = ws1.Shapes("Bescheibung_" & zaehler)
ws1.Shapes("Bescheibung_" & zaehler).Select
With Selection
.Text = wort
.HorizontalAlignment = xlCenter
.AutoSize = True
.ShapeRange.ZOrder msoBringToFront
.ShapeRange.Left = (Links + (breite / 2)) - Selection.Width / 2
.ShapeRange.Top = oben + hoehe - Selection.Height
End With
'End If
End If
End If
Application.ScreenUpdating = True
zaehler = zaehler + 1
Loop
End Sub

Grüße und schon mal ein hoffnungsvolles Danke
Ein Veit
Anzeige
AW: Bilder positionieren & beschriften
03.03.2007 17:15:24
EtoPHG
Hallo Veit,
Ich würde Dir dringend die folgenden Sachen empfehlen:
1. Als erste Codezeile in jedem CodeTeil (Modul, Tabelle, Mappe) Option Explicit
2. Alle Variablen zu deklarieren (was eben Pkt. 1. erzwing!)
3. Wenn Du Fehlermeldungen hast, die auch mitzuteilen, bzw. Informationen was Du mit dem Debugger denn bis jetzt schon gefunden hast!
Gruss Hansueli
AW: Bilder positionieren & beschriften
03.03.2007 18:00:20
Veit
Hallo Hansueli
Danke für die Tips, aber leider...
naja also
1. Als erste Codezeile in jedem CodeTeil (Modul, Tabelle, Mappe) Option Explicit
zu 1. habe ich im Orginal.
2. Alle Variablen zu deklarieren (was eben Pkt. 1. erzwing!)
zu 1. habe ich im Orginal auch.
Das sieht dann so aus (komplett):
'Integer%
Dim Dateinummer%, spalte%, cFull%
'String$
Dim pfad$, eingabe$, wort$, lblwort$, vorgabewort$
'Double#
Dim laenge#, zaehler#, bildbreite#, bildhoehe#, startposition#, faktor#, zellenzeile#, zeile#, oben#, hoehe#, Links#, breite#
Dim seitenzaehler#, seitenumbruchzaehler#
'Long
Dim picturebreite&, picturehoehe&
'sonstiges
Dim varPB As Variant
Dim objPicture As Shape, objTextbox As TextBox
Dim objShell As Object, objFolder As Object
Dim varName, pbv, pbh
Dim Mybild As Control
Dim ersteswort As Boolean, letztesworterledigt As Boolean
Dim wdApp As Object
Dim wdoc As Object
Dim ab As Byte
Dim wb1 As Workbook
Dim ws1 As Worksheet
Set objShell = CreateObject("Shell.Application")
und dann kommt der Code... wie gesagt, das ist jetzt komplett alles... da sind auch viele dabei die in vorherlaufendem Code benutzt werden
3. Wenn Du Fehlermeldungen hast, die auch mitzuteilen, bzw. Informationen was Du mit dem Debugger denn bis jetzt schon gefunden hast!
Da das Ganze ja Druckerabhängig ist und die Abmessungen der Bilder auch ne Rolle spielen, sind die folgenden Zahlen b e i m i r so. Andrer Drucker andres Bild und die Werte sind andere. (Allerdings wahrscheinlich das Ergbnis [=Fehler] nicht)
Ende 2. Seite kommt (bei mir) der Fehler
seitenumbruchzaehler steht korrekt auf 2
aber bei der Zeile:
zellenzeile = ws1.HPageBreaks(seitenumbruchzaehler).Location.Row - 1
meldet der Debugger "Index ausserhalb des gültigen Bereichs"
Achtung! wenn ich dann die Entwicklungsumgebung minimiere und die Userform auch, dann bis zum letzten (fehlerverursachenden) Bild runterscrolle, dann wieder zum VBA wechsel und F5 drücke, dann läuft die Kiste wieder weiter... bis zum nächsten Seitenumbruch... und dann ..."Index ausserhalb des gültigen
Bereichs"
Ja so sieht das aus...
Grüße
Ein Veit
Anzeige
AW: Bilder positionieren & beschriften
03.03.2007 19:48:00
Veit
... kann man das SELECT beim Arbeiten Shapes vielleicht weglassen? ...
AW: Bilder positionieren & beschriften
03.03.2007 20:11:48
Heiko
Hallo Veit,
ich habe jetzt nicht deine ganzen Code nachvollzogen, aber deine Letzte Frage kann ich mit Ja beantworten, guckst du hier.
Bild 1 ist im aktiven Tabellenblatt und wird ohne Select bearbeitet.
Sub TestT()
With ActiveSheet.Shapes("Bild 1")
.ZOrder msoBringToFront
.Left = 100
.Top = 100
End With
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
AW: Bilder positionieren & beschriften
03.03.2007 21:53:04
Veit
Hallo Heiko,
da hat die Sache mit dem Wald und den Bäumen bei mir zugeschlagen... ich war so sauer, dass das mit dem set = nicht funktionierte, dass ich with völlig vergessen habe. Ich danke Dir wie verrückt so sehr. Das hilft auf alle Fälle schon mal weiter. Bin grade dabei die betreffenden Stellen umzuschreiben.
Leider bricht es immer noch mit dem Fehler ab... na mal sehen.
Bis dahin
Ein Veit
Anzeige
AW: Bilder positionieren & beschriften
03.03.2007 20:26:52
EtoPHG
Hallo Veit,
Die Fehlermeldung deutet darauf hin, dass Dir der Array-Index überläuft. Versuch mal bei Index 0 anzufangen und dann bis Count-1 zu gehen.
Gruss Hansueli
AW: Bilder positionieren & beschriften
03.03.2007 21:45:48
Veit
Hallo... klingt gut und äh... ich habe keine Ahnung wie ich das anstellen soll... so gut ist mein VBA dann offensichtlich doch nicht.
Kannst Du mir da eventuell noch einen Tip geben?
Grüße
Ein Veit
AW: Bilder positionieren & beschriften
03.03.2007 21:53:31
EtoPHG
Hallo Veit,
Ich meine diesen Teil hier:

If seitenumbruchzaehler <> ws1.HPageBreaks.Count Then
seitenumbruchzaehler = ws1.HPageBreaks.Count
zellenzeile = ws1.HPageBreaks(seitenumbruchzaehler).Location.Row - 1

ersetzen mit:

If seitenumbruchzaehler <> ws1.HPageBreaks.Count Then
seitenumbruchzaehler = ws1.HPageBreaks.Count -1
zellenzeile = ws1.HPageBreaks(seitenumbruchzaehler).Location.Row - 1

Gruss Hansueli
Anzeige
AW: Bilder positionieren & beschriften
04.03.2007 21:38:00
Veit
Hallo Hansueli,
Danke erstmal für Deinen Tip. Ich habe mich jetzt aber nach den nicht sehr aussagekräftigen Ergebnissen dazu entschlossen, diesen Teil komplett nochmal neu zu schreiben. Seitenumbruch und Grafiken scheinen generell ein problematisch zu sein und so durcheinander, wie das durch unendliche Änderungen mittlerweile war, wurde es nicht weniger problematisch.
Ich glaube zwar nicht so richtig dran, dass es dann funzt... aber zum einen muß man es ja wenigstens probiert haben und zum andern "Die Hoffnung stirbt zuletzt" (wie wir hier in Dresden sagen). Und gottseidank gibt es ja dieses Forum, das ich dann immer noch wieder "belästigen" kann ;-)
Hier nochmal mein Problem in Kurzfassung, für den Fall, dass sowas vielleicht schon mal jemand gelöst hat:
Viele Bilder (*.jpg) sollen aus einer AddIn-Userform heraus nacheinander so in einem Tabellenblatt platziert werden, dass sie nicht durch einen Seitenumbruch (horizontal und vertikal) "zerschnitten" werden...
Tja, es könnte so einfach sein ;-)
Also bis später und bis hierhin: Vielen Dank für Eure Unterstützung!
Grüße
Ein Veit
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige