Bilder anhand ausgelesener Zellen auswählen und importieren

  • Excel

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Bilder anhand ausgelesener Zellen auswählen und importieren

    Hallo zusammen!

    Ich, als VBA-Neuling, stehe vor der folgender Problematik:
    Eine Tabelle, in der in der ersten Spalte eine bestimmte Anzahl (max 30) an Nummern stehen.
    In einem Verzeichnis (z.B. D:\PDFs) liegen PDF-Dateien, die genau nach den gerade erwähnten Nummern benannt sind.
    Nun möchte ich die PDF-Dateien jeweils richtig zugeordnet in die gleiche Zeile in Spalte 3 importieren.
    Die PDFs sollten dabei an die vorgegebene Spaltenbreite angepasst werden.

    Wäre super wenn mir hierzu eine/r der Cracks hier helfen könnte.

    Grüße
    Zefix

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Zefix“ ()

    PDFs zu interpretieren ist alles andere als trivial.
    Ich gebe dir keine Chance, das sauber hinzukriegen.

    Aber es gibt Konverter, die du vorschalten kannst.
    Nachdem ich einige Freeware-Tools getestet hate, bin ich letztendlich bei der Profi-Version von Simpo gelandet, mit dem ich recht zufrieden bin.
    Ich hab mir gleich die ganze Suite gekauft, aber möglicherweise reicht dir auch das Excel-Paket.

    Im Übrigen lassen sich PDFs auch so schreiben, dass jegliche Text- und Tabelleninformation fehlt und alles nur noch reine Grafik ist.
    Da hast du dann fast keine Möglichkeiten der automatischen Nachbearbeitung mehr.
    Also immer erst die PDFs auf Brauchbarkeit testen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok, ich denke das kam falsch rüber.

    Ich möchte die PDFs nicht in Excel konvertieren oder deren Textinhalt in eine Excel-Tabelle einlesen.
    Die PDFs sollen "nur" als Bilddatei importiert werden. Sollte das nicht möglich sein,
    hätte ich auch noch die Möglichkeit, die PDFs vorher in jpg-Dateien umzuwandeln und diese dann zu importieren.
    Diesen Schritt würde ich mir aber gerne sparen.
    Hat niemand eine Idee?

    Wie ich die Bilder importiere, weiß ich nun.
    Jedoch tu ich mir schwer mit dem Auslesen der Zellen und
    der Verwendung der dadurch erhaltenen Daten um die Bilder zu importieren.
    Macht man sowas am Besten über ein Array?
    Hat niemand eine Idee?
    Es ist immer etwas schwierig, Ideen zu einem Programm zu liefern, von dem man nicht weiß, wie es aussieht.
    Wenn du die Code-Fragmente, die dir Schwierigkeiten bereiten, hier veröffentlichst, fällt vielleicht jemand eine konkrete Lösungsidee ein.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    In der Tabelle stehen in der ersten Spalte die Dateinamen der Bilder, welche sich im Verzeichnis D:\Bilder befinden.
    In die dritte Zelle der jeweiligen Zeile soll nun das entsprechende Bild eingefügt werden.

    Foldend der Code für den reinen Bild-Import.
    Was mir hier Schwierigkeiten macht, ist das Auslesen der ersten Zelle und der Import der entsprechenden Bilddatei.
    Das Ganze dann natürlich als Loop bis zum Ende der Einträge.

    Visual Basic-Quellcode

    1. Sub BilderImport()
    2. '** Dimensionierung der Variablen
    3. Dim strVerzeichnis$, strDatei$
    4. Dim pct As Picture
    5. Dim lngZeile As Long 'Zeile zum Eintragen der Bilder
    6. Dim lngSpalte As Long 'Spalte zum Eintragen der Bilder
    7. Dim varBreite As Variant 'Spaltenbreite
    8. Dim varHoehe As Variant
    9. '** Verzeichnis und Dateinamen definieren und auslesen
    10. strVerzeichnis = "D:\Bilder"
    11. strDatei = Dir(strVerzeichnis & "\*.jpg")
    12. '** Startzeile + Spalte festelegen
    13. lngZeile = 2
    14. lngSpalte = 3
    15. '** Ermittlung der Spaltenbreite
    16. varBreite = Columns("C:C").Width
    17. Cells(lngZeile, lngSpalte).Select
    18. Cells(lngZeile, lngSpalte + 1) = strDatei ' schreiben Dateinamen
    19. Set pct = ActiveSheet.Pictures.Insert(strVerzeichnis & "\" & strDatei)
    20. With ActiveSheet.Shapes("Picture 1")
    21. '** Auslesen der Breite
    22. ActiveSheet.Shapes("Picture 1").Select
    23. Selection.ShapeRange.LockAspectRatio = msoTrue
    24. '** Bild auf aktuelle Spaltenbreite skalieren
    25. Selection.ShapeRange.Width = varBreite
    26. '** Zeilenhöhe festlegen
    27. varHoehe = ActiveSheet.Shapes("Picture 1").Height
    28. Rows(lngZeile).RowHeight = varHoehe
    29. End With
    30. '** Zähler für Shape definieren
    31. shp = 2
    32. '** Zeilenzähler erhöhen
    33. lngZeile = lngZeile + 1
    34. '** Bild 2 bis n durchlaufen
    35. Do While strDatei <> ""
    36. strDatei = Dir()
    37. If strDatei = "" Then Exit Do
    38. Cells(lngZeile, lngSpalte).Select
    39. Set pct = ActiveSheet.Pictures.Insert(strVerzeichnis & "\" & strDatei)
    40. ActiveSheet.Shapes("Picture " & shp).Select
    41. Cells(lngZeile, lngSpalte + 1) = strDatei ' schreiben Dateinamen
    42. Selection.ShapeRange.LockAspectRatio = msoTrue
    43. Selection.ShapeRange.Width = varBreite '* 5.355 'Bild auf Spaltenbreite skallieren
    44. '** Zeilenhöhe festlegen
    45. varHoehe = ActiveSheet.Shapes("Picture " & shp).Height
    46. Rows(lngZeile).RowHeight = varHoehe
    47. '** Zeilenzähler erhöhen
    48. lngZeile = lngZeile + 1
    49. '** Shape-Zähler erhöhen
    50. shp = shp + 1
    51. Loop
    52. End Sub


    Wär super wenn mir hier jemand zumindest die richtige Richtung weisen könnte. :)
    Uff. Das riecht stark nach umständlichem Macrorecorder-Code.
    Was mir hier Schwierigkeiten macht, ist das Auslesen der ersten Zelle
    Kannst du das etwas genauer definieren?
    Suchst du die erste freie Zelle?
    Möchtest du den Inhalt einer bestimmten Zelle wissen?

    Visual Basic-Quellcode

    1. For Each Cell in Intersect(UsedRange, Columns(1))
    2. If Text.Value <> "" Then BilderImport (Cell)
    3. Next
    4. Sub BilderImport(ByVal Cell As Range)
    5. Filename = Cell.Value
    6. Set ImageCell = Cell.Offset(0,1)
    7. ' hier Bild einfügen
    8. End Sub
    Der Rest ist mir zu chaotisch.

    Wenn du ein Objekt festlegst mit Set pct = ActiveSheet.Pictures.Insert(strVerzeichnis & "\" & strDatei) Dann kannst du dieses Objekt hinterher auch verwenden und musst es nicht anschliessend mit variablen komplizierten Konstruktionen nochmals suchen. Anstatt

    Visual Basic-Quellcode

    1. ActiveSheet.Shapes("Picture " & shp).Select
    2. Selection.ShapeRange.LockAspectRatio = msoTrue
    geht es direkter und vor allem zuverlässiger mit

    Visual Basic-Quellcode

    1. pct.ShapeRange.LockAspectRatio = msoTrue
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --