Excel 2003 Bild vom Laufwerk einfügen???

  • #21
Hallo mobilefly.

zur Anzeige bräuchtest du einen Viewer.

Im Office-Paket ist Microsoft-Photoeditor als Addon enthalten.

Ist denn der Microsoft-Photoeditor installiert ?

Bei Off97 wurde der standardmäßig mit installiert, bei den neueren Versionen muß man ihn glaube ich explizit mit angeben.

Gruß Matjes :)
 
  • #22
hmmm, finde nur den Microsoft Office Picture Manager (ist das die gleiche software unter neuem namen?) Der ist installiert??? :-\
 
  • #23
Hallo mobilefly

Habe OfficeXP, dürfte von der Setuproutine wie Office2003 sein.

mobilefly schrieb:
hmmm, finde nur den Microsoft Office Picture Manager (ist das die gleiche software unter neuem namen?) Der ist installiert???  :-\

Einfach mal Nachsehen.

Office Setup
hinzufügen/entfernen

Features hinzufügen oder entfernen
Hier unter Office Tools meint Matjes!
Microsoft Photo Editor = Installiert?

Ist er nicht Installiert, geht meist auch Scannen nicht in Office.

MfG hddiesel
 
  • #24
SUPER - Jetzt klappt alles

danke euch beiden!!

nun geht es sogar unter 2003, hab auf dem pc zusätzlich 2000 inkl PE installiert!

gruß mathias
 
  • #25
Das habe ich schon gesehen, hilft mir aber nicht wirklich. Ich möchte mehrere Dateien auswählen können und die ausgewählten Bilder direkt in Excel einfügen. Im Grunde geht es mir nur um eine Mehrfachauswahl und direktes Einfügen in Excel.

Danke
 
  • #26
also einfach mehrere bilder einfügen ist ja kein Problem, das geht ja über einfügen/bilder. dort kann man ja dann auch mehrere auf einen schlag einfügen.

diese sind dann aber ja nicht an die zellen fixiert, aber da bin ich leider überfragt :-\

Wo ich aber schon gerade mal wieder hier bin. werden die bilder verändert? ich habe das gefühl sie sind von der qualität etwas schlechter. verkleinert wurden sie nicht, sie liegen in der passenden größe vor.

gruß mathias
 
  • #27
Ich bin ein Anfänger und bitte daher um entschuldigung für blöde Fragen. Aber wie geht das, dass ich mehrere Jpgs auf einmal einfügen kann? Es lässt mich immer nur eine Datei markieren. Kann man die Größe nicht irgendwie automatisiert vorgeben?

Wäre sehr dringend.

Danke.
 
  • #28
Hi mobilfly,

jo in diesem Makro werden die Bilder verändert bzw. auf eine Größe beschränkt.

Code:
     'Bildhöhe begrenzen
      If o_Bild.Height > c_MAXBILDHOEHE Then
       ->skalieren
        l_faktor = c_MAXBILDHOEHE / o_Bild.Height
        o_Bild.ShapeRange.ScaleWidth l_faktor, msoFalse, msoScaleFromTopLeft
        o_Bild.ShapeRange.ScaleHeight l_faktor, msoFalse, msoScaleFromTopLeft
      End If
      
     ->Zeilenhöhe dem Bild anpassen
      ws.Rows(x).RowHeight = o_Bild.Height

Wenn du die Konstante c_MAXBILDHOEHE auf einen genügend großen Wert setzt, findet keine Veränderung mehr statt.

@wolfgang
ich werd mir mal Gedanken machen bzgl. deines Anliegens.
Kannst Du mir eine frische Datei mit 3 Bildern schicken, so wie du sie plaziert haben willst. Vielleicht auch noch die drei Bilder. Das Ganze wenn's möglich ist gezippt.

Gruß Matjes :)
 
  • #29
Hallo Matjes,

ich habe das mit den bilder mir angesehen. nun habe ich keine ahnung von excel. daher habe ich eine frage.
ist das eingefügte bild mit der zelle dann fest verbunden? also ich meine, wenn ich dann die zeile ausblenden will ist das bild dann auch ausgeblendet?

ich möchte nämlich gerne mit excel protokolle erstellen. somit könnte ich erledigte punkte ausblenden und falls ich den punkt doch noch mal brauche wieder einblenden.

kannst du mir dabei helfen ???

danke
 
  • #30
Hallo thorsten,

mit dem bisherigen Makro klappte das Ausblenden nicht, da die Bilder nicht auf die Zelle fixiert waren.

Hab den Makro so erweitert, daß die Spaltenbreite angepaßt wird, so daß alle Bilder in die Spalte passen. Anschließend wird das jeweilige Bild dann an die Zelle gebunden.

Damit klappt dann auch das Aus- und einblenden von Zeilen.  :D

Gruß Matjes :)
Code:
Option Explicit
' Typdeklaration für API-Dialog->Verzeichnis auswählen'
    Private Type BrowseInfo
        hOwner          As Long
        pidlRoot        As Long
        pszDisplayName  As String
        lpszTitle       As String
        ulFlags         As Long
        lpfn            As Long
        lParam          As Long
        iImage          As Long
    End Type

    Private Declare Function SHGetPathFromIDList Lib shell32.dll (ByVal pidl As Long, ByVal pszPath As String) As Long
    Private Declare Function SHBrowseForFolder Lib shell32.dll (lpBrowseInfo As BrowseInfo) As Long
'***********************************************************
' Ermittelt Verzeichnisnamen und zeigt Windows-Dialog an
Public Function VerzeichnisWählen(Optional DialogTitel) As String
    Dim StrukturVerzeichnisInfo As BrowseInfo, ListenNr As Long, Pfad As String
    Dim hWndAccessApp As Long
  
    With StrukturVerzeichnisInfo
        .hOwner = hWndAccessApp
        .lpszTitle = IIf(IsMissing(DialogTitel), Verzeichnispfad auswählen, CStr(DialogTitel))
        .ulFlags = &H1-> BIF_RETURNONLYFSDIRS
    End With
    
    ListenNr = SHBrowseForFolder(StrukturVerzeichnisInfo)
    Pfad = Space$(512)
    
    If SHGetPathFromIDList(ByVal ListenNr, ByVal Pfad) Then VerzeichnisWählen = Left(Pfad, InStr(Pfad, vbNullChar) - 1)
    
End Function
'***********************************************************
Sub JPEGSEinfügenInSpalteBMitWurzelPfadAuswahlUndSuche()
 ->Im der aktuellen Arbeitsmappe wird für
 ->alle Bezeichnungen in Splate A (z.B A1: 1111)
 ->das entsprechende Bild 1111.jpg in Spalte B eingefügt.
 ->Die Bildhöhe wird auf c_MAXBILDHOEHE begrenzt
 ->
 -><<< geändert 26.5.2006
 ->Die Spaltenbreite der betreffenden Spalte wird dann
 ->ggf auf Bildbreite erweitert.
 ->Die Bilder werden fest mit Zelle verbunden, so daß beim
 ->Ausblenden der zeile auch das Bild mit ausgeblendet wird.
 -> geändert 26.5.2006 >>>
 ->
 ->Vor dem eigentlichen Bilder-Einfügen werden
 ->vorhandene Bilder in Spalte B gelöscht
 ->Ebenfalls Zellinhalte.
 ->
 ->Werden Bilder nicht gefunden, wird der Text
 ->'Bild nvorh.' in der Spalte B eingefügt.
 ->In der Schlußmeldung wird die Anzahl der nicht
 ->gefundenen Bilder genannt
  
 ->Das WurzelVerzeichnis wird über einen Auswahldialog
 ->bestimmt. Weiterhin wird abgefragt, ob die Unterverzeichnisse
 ->auch in die Suche mit einbezogen werden sollen.
 ->Sind zu einem Bild-Namen mehrere Fundstellen vorhanden,
 ->wird abgefragt, welches Bild eingefügt werden soll.
 ->

 ->Const c_PFAD_JPGs = c:\Test_jpgs-> !!!!! ANPASSEN !!!!!!
  Const c_SPALTEQUELLE = 1   ' Splate A
  Const c_SPALTEZIEL = 2     ' Spalte B
  Const c_MAXBILDHOEHE = 100-> max. Bildhöhe in Punkten
  
  
  Dim l_rows As Long, ws As Worksheet, x As Long, s As Long
  Dim s_Bez As String, s_Bez_Full As String
  Dim l_ZaehlerBildNichtVorh As Long, l_ZaehlerBildNichtEingefuegt As Long
  Dim o_Bild As OLEObject, d_tmp As Double, l_faktor As Double
  Dim sh As Shape, l_AnzBildNichtGelöscht As Long
  Dim s_Pfad As String, ret As Integer, b_mitUterverzeichnissen As Boolean
  Dim s_Datei As String, l_Spalte As Long
  Dim d_ColWidth As Double, d_colWidth_Pkt As Double, d_BildWidth_Pkt As Double
  
 ->### für Bild in Spalte manifestieren
  Dim l_coumnwidth As Double, l_BildWith As Double, l_BildColumnwidth As Double
  
 ->*** Wurzelverzeichnis abfragen
  s_Pfad = VerzeichnisWählen(Wurzel-Verzeichnis für jpg's auswählen)
  If s_Pfad =  Then Exit Sub-> Abbruch ?
  
 ->*** Abfrage mit/ohne Sub-Directories
  ret = MsgBox( _
    Sollen die Unterverzeichnisse mit in die Suche nach den jpg's einbezogen werden?, _
    vbYesNo + vbDefaultButton2 + vbQuestion, _
    Auswahl mit/ohne Unterverzeichnisse)
  If ret = vbYes Then
    b_mitUterverzeichnissen = True
  Else
    b_mitUterverzeichnissen = False
  End If
  
 ->*** na dann an die Arbeit
  Set ws = ActiveSheet
  
  Application.ScreenUpdating = False
  
 ->*** alle Bilder in Spalte c_SPALTEZIEL wegräumen
  l_AnzBildNichtGelöscht = 0
  On Error Resume Next
  For Each sh In ws.Shapes
    l_Spalte = sh.TopLeftCell.Column
    If Err.Number = 0 Then
      If l_Spalte = c_SPALTEZIEL Then
        sh.Delete
        If Err.Number <> 0 Then
          Err.Clear
          l_AnzBildNichtGelöscht = l_AnzBildNichtGelöscht + 1
        End If
      End If
    Else
      Err.Clear
    End If
  Next
  On Error GoTo 0
  If l_AnzBildNichtGelöscht > 0 Then
    MsgBox ( _
    l_AnzBildNichtGelöscht &  Bilder konnten in Spalte  & _
      c_SPALTEZIEL &  nicht gelöscht werden.)
  End If
  
  
 ->*** Anzahl Zeilen feststellen
  l_rows = ws.Cells(ws.Rows.Count, c_SPALTEQUELLE).End(xlUp).Row
  
 ->über alle Zeilen
  For x = 1 To l_rows
    
   ->Status-Bar: momentanen Stand ausgeben
    Application.StatusBar = Bearbeiutng  & l_rows & / & x
  
   ->alten Zellinhalt entfernen
    ws.Cells(x, c_SPALTEZIEL).Value = 
    
    s_Bez = ws.Cells(x, c_SPALTEQUELLE).Value
   ->Dateiname
    s_Datei = s_Bez & .jpg
    
   ->*** Datei suchen
    s_Bez_Full = jpg_DateiSuchen(s_Pfad, b_mitUterverzeichnissen, s_Datei)
        
   ->*** Datei gefunden ?
    If  = s_Bez_Full Then
     ->*** Bild nicht vorhanden
      ws.Cells(x, c_SPALTEZIEL).Value = Bild nvorh.
      l_ZaehlerBildNichtVorh = l_ZaehlerBildNichtVorh + 1
    Else
     ->*** Bild eintragen
      
     ->Zelle markieren
      ws.Cells(x, c_SPALTEZIEL).Select
      
     ->Bild als Objekt einfügen
      On Error Resume Next
      ws.OLEObjects.Add(FileName:=s_Bez_Full, _
        Link:=False, DisplayAsIcon:=False).Select
      If Err.Number <> 0 Then
        Err.Clear
        l_ZaehlerBildNichtEingefuegt = l_ZaehlerBildNichtEingefuegt + 1
        ws.Cells(x, c_SPALTEZIEL).Select
        
        ret = MsgBox(Das Bild  & s_Bez_Full & _
           konnte nicht eingefügt werden. & vbLf & vbLf & _
          Zelle:  & ws.Cells(x, c_SPALTEZIEL).Address & vbLf & _
          Wollen Sie fortfahren?, vbExclamation + vbYesNo)
          
        If ret = vbNo Then Exit For
        
      Else
        Set o_Bild = Selection
        o_Bild.Placement = xlMove->xlFreeFloating
        o_Bild.PrintObject = True
        
       ->Bildhöhe begrenzen
        If o_Bild.Height > c_MAXBILDHOEHE Then
         ->skalieren
          l_faktor = c_MAXBILDHOEHE / o_Bild.Height
          o_Bild.ShapeRange.ScaleWidth l_faktor, msoFalse, msoScaleFromTopLeft
          o_Bild.ShapeRange.ScaleHeight l_faktor, msoFalse, msoScaleFromTopLeft
        End If
        
       ->Zeilenhöhe dem Bild anpassen
        ws.Rows(x).RowHeight = o_Bild.Height
        
       -><<<<<< geandert 27.05.2006 >>>>>>>
       ->Breite der Spalte anpassen, wenn Bild breiter als Spalte
        d_ColWidth = ws.Cells(x, c_SPALTEZIEL).ColumnWidth
        d_colWidth_Pkt = ws.Cells(x, c_SPALTEZIEL).Width-> in Punkt
        d_BildWidth_Pkt = o_Bild.ShapeRange.Width->in Punkt
       ->Bild breiter als Spalte - > Spalte auf Bild-Breite
        If d_BildWidth_Pkt > d_colWidth_Pkt Then
     ->Korrektur 27.5.2006
          d_ColWidth = d_BildWidth_Pkt / d_colWidth_Pkt * d_ColWidth 
          ws.Columns(c_SPALTEZIEL).colunwidth = d_ColWidth
        End If
       ->Um Bild mit Spalte ausblenden zu können, Bild mit Zelle verbinden
        o_Bild.Placement = xlMoveAndSize
       -><<<<<< geandert 27.05.2006 Ende >>>>>>
        
        
      End If
    End If
  Next
  ws.Cells(1, c_SPALTEQUELLE).Select
  
 ->Ende-Meldung
  Application.StatusBar = 
  If l_ZaehlerBildNichtVorh > 0 Or l_ZaehlerBildNichtEingefuegt > 0 Then
    MsgBox (l_ZaehlerBildNichtVorh &  Bilder wurden nicht gefunden. & vbLf & _
      l_ZaehlerBildNichtEingefuegt &  Bilder konnten nicht eingefügt werden.)
  Else
    MsgBox (Alle Bilder eingefügt.)
  End If
  
Aufraeumen:
  Application.ScreenUpdating = True
  Set ws = Nothing: Set o_Bild = Nothing
End Sub
'***********************************************************
Private Function jpg_DateiSuchen(s_Pfad As String, b_mitUterverzeichnissen As Boolean, _
                                  s_Datei As String) As String
                        
  Dim s_Bez_Full As String, x As Long
  Dim f_Bild() As String, f_Bild_cnt As Long
                    
  With Application.FileSearch
    .NewSearch
    .LookIn = s_Pfad
    .SearchSubFolders = b_mitUterverzeichnissen
    .FileName = s_Datei
    .FileType = msoFileTypeAllFiles
    If .Execute() > 0 Then
      
     ->*** Fund analysieren
      
      If .FoundFiles.Count = 1 Then
       ->ein Bild gefunden
        s_Bez_Full = .FoundFiles(1)
       ->richtigen Dateinamen gefunden ?
        If \ <> Mid(s_Bez_Full, Len(s_Bez_Full) - Len(s_Datei), 1) Then
          s_Bez_Full = ->ist nicht die gesuchte Datei
        End If
      
      ElseIf .FoundFiles.Count = 0 Then
        s_Bez_Full = 
      
      Else
       ->mehrere Bilder gefunden
        ReDim f_Bild(1 To 1): f_Bild_cnt = 0
        For x = 1 To .FoundFiles.Count
          s_Bez_Full = .FoundFiles(x)
          If \ = Mid(s_Bez_Full, Len(s_Bez_Full) - Len(s_Datei), 1) Then
            f_Bild_cnt = f_Bild_cnt + 1
            ReDim Preserve f_Bild(1 To f_Bild_cnt)
            f_Bild(f_Bild_cnt) = s_Bez_Full
          End If
        Next x
        If f_Bild_cnt = 0 Then
          s_Bez_Full = 
        ElseIf f_Bild_cnt = 1 Then
          s_Bez_Full = f_Bild(1)
        ElseIf f_Bild_cnt > 20 Then
          MsgBox ( _
            Datei: & s_Datei & vbLf & vbLf & _
            Es wurden mehr als 20 potenzielle Kandidaten für die gefunden. & vbLf & _
            --> wird übersprungen )
          s_Bez_Full = 
        Else
         ->mehrere relevante Fundstellen -> eine auswählen
          s_Bez_Full = DateiAuswaehlen(f_Bild(), f_Bild_cnt)
        End If
      End If
    Else
       s_Bez_Full = 
    End If
  End With
  
  ReDim f_Bild(1 To 1)
  jpg_DateiSuchen = s_Bez_Full->vollen Dateinamen zurueckgeben
End Function
'***********************************************************
Private Function DateiAuswaehlen(f() As String, f_cnt As Long) As String
  
  Const c_BREITE_ZEILEANGABE = 3
  
  Dim l_zaehler As Long, s_tmp As String, s_r As String
  Dim l_AnzLeerzeichen As Long, l_AnzStellen As Long, x As Long
  Dim s_Nr As String, l_Nr As Long, y As Long, s As String
  
 ->Meldung zusammenstellen
  s_tmp = Bitte geben Sie den Index der auszuwählenden Datei an & vbLf & vbLf
  
  l_zaehler = 0
  For x = 1 To f_cnt
    s_r = x
    l_AnzLeerzeichen = c_BREITE_ZEILEANGABE - Len(s_r)
    If l_AnzLeerzeichen < 0 Then l_AnzLeerzeichen = 0
    l_AnzStellen = Len(s_r)
    s_tmp = s_tmp & Format(x, String(l_AnzLeerzeichen, _) & _
                    String(Len(s_r), 0)) & vbTab & f(x) & vbLf
    l_zaehler = l_zaehler + 1
  Next
  
 ->Meldung ausgeben und Auswahl
Nochmal:
  s_Nr = InputBox( _
          s_tmp, _
          Auswahl zwischen mehreren gefundenen Dateien mit gleichem Namen, _
          )
  If s_Nr <>  Then
    For y = 1 To Len(s_Nr)
      s = Mid(s_Nr, y, 1)
      Select Case s
        Case 0 To 9->zulässig
        Case Else
          MsgBox (Bitte nur eine Zahl eingeben.)
          GoTo Nochmal
      End Select
    Next
    l_Nr = s_Nr
    If l_Nr < 0 Or l_Nr > f_cnt Then
      MsgBox (Index zu groß.)
      GoTo Nochmal
    End If
  
   ->ausgewahlte Datei
    DateiAuswaehlen = f(l_Nr)
  Else
    DateiAuswaehlen = 
  End If
End Function
 
  • #31
Hallo Matjes,

vielen Dank für deine super schnelle antwort.
allerdings funktioniert es bei mir gar nicht.
habe auch schon den photo editor installiert. Aber nicht unter dem veruzeichniss 2003 ! liegt es vielleicht daran?

kannst du mir nochmals helfen?

danke schön
 
  • #32
^habe ich noch vergessen:

das untermenü geht auf. werde gefragt ob die unterverzeichnisse mit einbezogen werden sollen

dann kommt die meldung 1 bilder wurde nicht gefunden. 0 bilder wurden eingefügt
 
  • #33
Matjes schrieb:
mit dem bisherigen Makro klappte das Ausblenden nicht, da die Bilder nicht auf die Zelle fixiert waren.

Hab den Makro so erweitert, daß die Spaltenbreite angepaßt wird, so daß alle Bilder in die Spalte passen. Anschließend wird das jeweilige Bild dann an die Zelle gebunden.

Damit klappt dann auch das Aus- und einblenden von Zeilen. :D

Gruß Matjes :)

Hallo Matjes

Klappt bei mir Super, auch mit ein- und ausblenden.
Bild 1.jpg
bis
10.jpg

Alle Bilder Tadellos eingefügt.

Gruß karl

Zitat korrigiert
 
  • #34
thorsten schrieb:
Hallo Matjes,

vielen Dank für deine super schnelle antwort.
allerdings funktioniert es bei mir gar nicht.
habe auch schon den photo editor installiert. Aber nicht unter dem veruzeichniss 2003 ! liegt es vielleicht daran?

kannst du mir nochmals helfen?

danke schön

Hallo thorsten

Einfach mal Nachsehen.
Start
Systemsteuerung
Software
Microsoft Office 2003
hinzufügen/entfernen

Features hinzufügen oder entfernen
Hier unter Office Tools
Klick auf das + Zeichen und nachsehen ob
Microsoft Photo Editor  Installiert ist, wenn nicht auswählen.

Ist er nicht Installiert, geht meist auch Scannen nicht in Office.

Office Installiert Microsoft Photo Editor schon ins Richtige Verzeichnis.
Notfalls Microsoft Photo Editor kurz Deinstallieren und Anschließend wieder Installieren.

In Spalte A muß auch der Richtige Name des Bildes stehen

Bei Karl.jpg
in A1
Karl
oder bei 1.jpg
In A2
1
dann müßte es gehen.

MfG hddiesel
 
  • #35
hallo hddiesel,

danke für die Antwort. jetzt klappt es auch. hatte den namen des bildes nicht eingetragen.

Jetzt habe ich aber noch mehr wünsche  :T

zueinem dürfte es die alten bilder nicht löschen. weiter ergänzt es die weiteren zeilen immer mit bilder nicht vorhanden
was auch nicht schlecht wäre, ich definiere im makro bild immer in zeile 5 z.b. und kann das bild über das verzeichnis anwählen ohne einen namen einzugeben sondern es wird an der stelle eingefügt die markiert ist inde spalte 5 z.b .  jaja das ist schon vom urgedanken und der eigentlichen idee weit weg. aber ich würde es halt zum erstellen von protokollen benutzen. geht das eigentlich auch, das es richtig fest verankert ist? d.h. das ich es nicht mehr durch anwählen verschieben kann?

Ansonsten nochmals vielen dank. ich hatte schon lange in anderen excel foren mal danach gesucht, wie ich bilder mit in einer festen größe mit ein uns ausblenden einfügen kann. aber das forum ist doch wohl das beste! supi

thorsten
 
  • #36
Hallo thorsten,

also ich fasse mal zusammen, wie dein Wunsch-Makro aussehen soll.

a) fügt in die monentan selektierte Zelle ein Bild ein, das an diese Zelle gebunden wird.

b) Auswahl des Bildes erfolgt online über einen aufzublendenden Auswahl-Dialog

c) Zeilenhöhe wird entsprechend der Bildhöhe gesetzt. Wird dabei eine maximale Höhe überschritten, wird die Bildhöhe darauf reduziert.

d) Spalte der betreffenden Zelle wird auf die sich dann ergebende Bildbreite erweitert, wenn das Bild nach der Skalierung breiter als die Spalte ist.

e) Bild soll nicht mehr anwählbar sein, also geschützt.
(Stellt sich die Frage, mit oder ohne Paßwort)

Hab ich das richtig verstanden ?

Gruß Matjes :)
 
  • #37
ah, was ist das für ein supi forum. hier wird man geholfen ohne irgendwie als deep darzustehen :1 :|

du hast alles richtig verstanden. ein paßwort wird nicht benötigt. dachte mir nur so könnte man ein selbst verschuldetes verschieben verhindern.

nochmals vielen vielen dank für deine hilfe. bin schon sehr lange auf der such nach sowas!

ach ja, was natürlich auch nicht schlecht wäre ;) wenn die bilder wie in word verknüpft wären. das würde die datei größe minimieren! aber falls das nicht geht auch nicht schlimm.

bis dann und hoffe du bekommst das hin. O0

thorsten
 
  • #38
Hallo thorsten,

dann hier das Gewünschte  ;D

Da hier der Blattschutz gesetzt wird um den Zell-Schutz wirksam werden zu lassen, empfiehlt sich vorher alle Zellen zu entsperren, da gesperrt der Defaultwert ist und zusammen mit dem Blattschutz dann keine Zelle mehr geändert werden kann.

a) alle Zellen selektieren
b) Format -> Zellen -> Reiter Schutz -> Haken aus->gesperrt' entfernen

Gruß Matjes :)

ps: Beim Erstellen ist mit noch ein Bug im vorherigen Makro bzgl. Bildbreite/Spaltenbreite aufgefallen. Ist gefixt.
d_ColWidth = d_BildWidth_Pkt / d_colWidth_Pkt
muß heissen
d_ColWidth = d_BildWidth_Pkt / d_colWidth_Pkt * d_ColWidth
Code:
Option Explicit
'***********************************************************
Sub SelektierteZelleJPEGEinfügenMitAuswahl()
 ->Das Makro
 ->a) fügt in die monentan selektierte Zelle ein Bild ein,
 ->   das an diese Zelle gebunden wird.
 ->b) Auswahl des Bildes erfolgt online über einen aufzublendenden Auswahl-Dialog
 ->   (Überprüfung, ob ausgewähltes file ein Bild ist,
 ->    erfolgt über einen internen Filter)
 ->c) Zeilenhöhe wird entsprechend der Bildhöhe gesetzt.
 ->   Wird dabei eine maximale Höhe c_MAXBILDHOEHE überschritten,
 ->   wird die Bildhöhe darauf reduziert.
 ->d) Spalte der betreffenden Zelle wird auf die sich dann ergebende Bildbreite erweitert,
 ->   wenn das Bild nach der Skalierung breiter als die Spalte ist.
 ->e) Bild soll nicht mehr anwählbar sein, also geschützt.
 ->  (Schutz ohne Paßwort)
 ->
 ->Voraussetzung:
 -> - die Zelle darf nicht bereits ein Bild enthalten
 -> - Seite darf nicht Passwort-geschützt sein
  
  
  Const c_MAXBILDHOEHE = 100-> max. Bildhöhe in Punkten
  Dim BILD_ENDUNGEN As Variant
  BILD_ENDUNGEN = Array(.jpg, .jpeg, .bmp)
  
  Dim ws As Worksheet, o_Bild As OLEObject, sh As Shape
  Dim s_DateinameFull As String, b_IstBild As Boolean
  Dim x1 As Long, l_Spalte As Long, lRow As Long, lCol As Long
  Dim l_faktor As Double, d_ColWidth As Double
  Dim d_colWidth_Pkt As Double, d_BildWidth_Pkt As Double
 Dim lCount As Long
 
->prüfen, ob Zelle markiert ist
 On Error Resume Next
 lCount = Selection.Count
 If Err.Number <> 0 Then
  Err.Clear
  MsgBox Keine Zelle markiert. Ein Bild ?
  Exit Sub
 End If
  
 ->prüfen, ob nur eine Zelle selektiert ist
  If Selection.Count > 1 Then
    MsgBox Es darf nur eine zelle selektiert sein.
    Exit Sub
  End If
  
  s_DateinameFull = Application.GetOpenFilename
 ->Dialog abgebrochen ?
  If s_DateinameFull = False Or s_DateinameFull = Falsch Then Exit Sub
  
 ->file ein Bild ?
  b_IstBild = False
  For x1 = LBound(BILD_ENDUNGEN) To UBound(BILD_ENDUNGEN)
    If LCase(Right(s_DateinameFull, Len(BILD_ENDUNGEN(x1)))) = _
       LCase(BILD_ENDUNGEN(x1)) Then b_IstBild = True: Exit For
  Next
  If Not b_IstBild Then
    MsgBox file-Typ ist nicht im Filter BILD_ENDUNG enthalten.
    Exit Sub
  End If
  
 ->*** na dann an die Arbeit
  Set ws = ActiveSheet
  lRow = Selection.Row
  lCol = Selection.Column
  
 ->*** pruefen, ob Zelle bereits ein Bild enthält
  On Error Resume Next
  For Each sh In ws.Shapes
    l_Spalte = sh.TopLeftCell.Column
    If Err.Number = 0 Then
      If l_Spalte = lCol Then
        If sh.TopLeftCell.Row = lRow Then
          MsgBox Die selektierte Zelle enthält bereits ein Bild.
          GoTo AUFRAEUMEN
        End If
      End If
    Else
      Err.Clear
    End If
  Next
  On Error GoTo 0
    
 ->Blatt-Schutz
  On Error Resume Next
  ws.Unprotect
  If Err.Number <> 0 Then
    MsgBox Blatt-Schutz konnte nicht entfernt werden.
    GoTo AUFRAEUMEN
  End If
  On Error GoTo 0
  
 ->alten Zellinhalt entfernen
  ws.Cells(lRow, lCol).Value = 
    
 ->*** Bild eintragen
 ->Zelle markieren
 ->Bild als Objekt einfügen
  On Error Resume Next
  ws.Cells(lRow, lCol).Select
  ws.OLEObjects.Add(FileName:=s_DateinameFull, _
    Link:=False, DisplayAsIcon:=False).Select
  If Err.Number <> 0 Then
    Err.Clear
    MsgBox Das Bild  & s_DateinameFull &  konnte nicht eingefügt werden.
    GoTo AUFRAEUMEN
  End If
  On Error GoTo 0
  
  Set o_Bild = Selection
  o_Bild.Placement = xlMove->xlFreeFloating
  o_Bild.PrintObject = True
  
 ->Bildhöhe begrenzen
  If o_Bild.Height > c_MAXBILDHOEHE Then
   ->skalieren
    l_faktor = c_MAXBILDHOEHE / o_Bild.Height
    o_Bild.ShapeRange.ScaleWidth l_faktor, msoFalse, msoScaleFromTopLeft
    o_Bild.ShapeRange.ScaleHeight l_faktor, msoFalse, msoScaleFromTopLeft
  End If
  
 ->Zeilenhöhe dem Bild anpassen
  ws.Rows(lRow).RowHeight = o_Bild.Height
  
 ->Breite der Spalte anpassen, wenn Bild breiter als Spalte
  d_ColWidth = ws.Cells(lRow, lCol).ColumnWidth
  d_colWidth_Pkt = ws.Cells(lRow, lCol).Width->in Punkt
  d_BildWidth_Pkt = o_Bild.ShapeRange.Width   'in Punkt
 ->Bild breiter als Spalte - > Spalte auf Bild-Breite
  If d_BildWidth_Pkt > d_colWidth_Pkt Then
    d_ColWidth = d_BildWidth_Pkt / d_colWidth_Pkt * d_ColWidth
    ws.Columns(lCol).ColumnWidth = d_ColWidth
  End If
 ->Um Bild mit Spalte ausblenden zu können, Bild mit Zelle verbinden
  o_Bild.Placement = xlMoveAndSize
  
 ->Zelle gesperrt setzen
  ws.Cells(lRow, lCol).Locked = True
  
  ws.Cells(1, 1).Select
 ->Blattschutz einschalten, damit Zell-Sperre wirksam wird
  ws.Protect
  
  
AUFRAEUMEN:
  Set ws = Nothing: Set o_Bild = Nothing: Set sh = Nothing
End Sub
 
  • #39
moin matjes,

einfach super - es ist fast ;) perfekt. eine kleinigkeit habe ich noch.
jetzt habe ich ja nach dem einfügen des bides ein gesamten blattschutz, geht das auch nur für die zellen in denen bilder sind!
weil ich schreibe einen punkt füge ein bild ein schreibe den nächsten punkt füge eve. wieder ein bild ein usw.

aber falls das nicht geht - bin auch schon super glücklich das es so wie es ist funzt!
werde mich heute mal ran setzten und mir die Protokollvorlage erstellen!

VIELEN DANK und einen schöne sonntag

thorsten
 
  • #40
Hallo thorsten,

dazu war dieser Hinweis gedacht
Da hier der Blattschutz gesetzt wird um den Zell-Schutz wirksam werden zu lassen, empfiehlt sich vorher alle Zellen zu entsperren, da gesperrt der Defaultwert ist und zusammen mit dem Blattschutz dann keine Zelle mehr geändert werden kann.

a) alle Zellen selektieren
b) Format -> Zellen -> Reiter Schutz -> Haken aus->gesperrt' entfernen

Da jetzt der Blattschutz schon eingeschaltet ist, müßtest Du vorher den Blattschtuz ausschalten
Extras -> Schutz -> Blattschutz aufheben

Gruß Matjes :)
 
Thema:

Excel 2003 Bild vom Laufwerk einfügen???

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.966
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben