Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

macro per inserimento foto in celle Excel

Ultimo Aggiornamento: 29/12/2019 10:26
Post: 1
Registrato il: 27/12/2019
Età: 75
Utente Junior
Office 2010
OFFLINE
27/12/2019 18:39

Buongiorno
sono alle prese con un problema per la cui soluzione ringrazio anticipatamente colui o coloro che mi aiutano a risolverlo.
In excel 2010, ho una scheda di articolo, all'inserimento di un codice in una cella vorrei vedere la foto relativa all'articolo in un'altra cella o gruppo di celle
Le foto sono in un dossier, il loro formato JPG.
Ho un'idea sulle macro, ma.... ogni spiegazione in dettaglio non mi farebbe male.
Allego un file test
Non senza ringraziare ancora per l'aiuto
Alfio

PS: Ho allegato il fie, o almeno credo, ma non vedo alcun segnale in proposito
Post: 4.301
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
27/12/2019 19:12

Sul foglio SchArt inserisci un controllo Immagine (lo trovi in Sviluppo e poi Inserisci) posizionandola e dimensionandola opportunamente sulla cella C5-

Poi nel modulo del foglio SchArt devi inserire una macro (che al variare della cella B3) inserisca nel controllo immagine il file jpg del prodotto.

Per limitare l'esecuzione della macro alla sola cella B3 devi usare l'istruzione Intersect e per caricare l'immagine l'istruzione LoadPicture.

Alfredo
Post: 3.643
Registrato il: 03/04/2013
Utente Master
Excel 2000 - 2013
OFFLINE
27/12/2019 21:36

Buona sera, Alfio;
potresti testare questo Codice VBA legato all'Evento Worksheet_Change:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$3" Then
    ActiveSheet.Unprotect
On Error GoTo 10
Application.ScreenUpdating = False
Const Pth As String = "C:\Prove\AlfioB\"    '   Da adattare alla tua Directory (Cartella) Dossier
Dim FtX As String

    ActiveSheet.Shapes.SelectAll
    Selection.Delete
10:
        Cells(5, 3).Select
        FtX = Cells(3, 2).Value
            If Len(FtX & "") <> 0 Then
                If Dir(Pth & FtX & ".jpg") <> "" Then
                    With ActiveSheet.Pictures.Insert(Pth & FtX & ".jpg")
                        .Top = Cells(5, 3).Top
                        .Left = Cells(5, 3).Left
                        .Height = 89.2913385827     '   Da adattare alle dimensioni delle tue Foto
                        .Width = 132.6614173228     '   Da adattare alle dimensioni delle tue Foto
                End With
            End If
        End If
    End If
Application.ScreenUpdating = True
ActiveSheet.Protect
End Sub

Ovviamente dovresti modificare:
- Const Pth As String = "C:\Prove\AlfioB\" Da adattare alle tue reali esigenze
- .Height = 89.2913385827 ' Da adattare alle dimensioni delle tue Foto
- .Width = 132.6614173228 ' Da adattare alle dimensioni delle tue Foto



A disposizione.

Buona serata

Giuseppe

Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 4.302
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
27/12/2019 22:33

Giuseppe ma utilizzando un controllo immagine posizionato in C5 ed annesso metodo LoadPicture il il codice non si ridurrebbe a molte meno righe?

Alfredo
Post: 3.644
Registrato il: 03/04/2013
Utente Master
Excel 2000 - 2013
OFFLINE
28/12/2019 05:28

Buona giornata, Alfredo;
grazie della tua attenzione.

@alfrimpa, in risposta #4, scrive:


Giuseppe ma utilizzando un controllo immagine posizionato in C5 ed annesso metodo LoadPicture il il codice non si ridurrebbe a molte meno righe?


Per quanto concerne l'istruzione LoadPicture credo dovrò approfondire l'argomento; voglio dire dai Test che ho condotto con LoadPicture ho ottenuto sempre il Messaggio:


Errore di run-time '438': 
Proprietà o metodo non supportati dall'oggetto

Ho quindi optato per il Codice VBA che ho proposto che, se necessario, consente di gestire a piacere le caratteristiche posizione e dimensione delle Foto.

 

A disposizione.

Buon fine settimana.

Giuseppe



Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 2.475
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
28/12/2019 10:43

ciao a tutti
suggerisco il seguente metodo (in pratica uguale a quello proposto da Giuseppe (ciao), che permette di adattare qualsiasi foto ad un determinato range di celle prestabilito.

Nel caso specifico, qualsiasi foto viene adattata al range C5:D17.

Variando le righe interessate:
mHeight = Range(mDest.Address & ":" & Dest.Offset(12).Address).Height
mWidth = Range(mDest.Address & ":" & mDest.Offset(, 1).Address).Width


l'immagine potrà essere adattata a piacere

saluti

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B3")) Is Nothing Then
    ActiveSheet.Pictures.Delete
    mPath = "C:\Foto" ' > percorso immagini jpg
    If Target.Value = "" Then Exit Sub
    Application.ScreenUpdating = False
    mFoto = Target.Value
    Set mDest = Range("C5")
    If Dir(mPath & "\" & mFoto & ".jpg") <> "" Then ' se la foto esiste
        With ActiveSheet.Pictures.Insert(mPath & "\" & mFoto & ".jpg")
            .ShapeRange.LockAspectRatio = msoFalse
            mTop = mDest.Top
            mLeft = mDest.Left
            mHeight = Range(mDest.Address & ":" & mDest.Offset(12).Address).Height
            mWidth = Range(mDest.Address & ":" & mDest.Offset(, 1).Address).Width
            .Top = mTop
            .Left = mLeft
            .Width = mWidth
            .Height = mHeight
        End With
    Else
        MsgBox "Foto inesistente"
    End If
Application.ScreenUpdating = True
End If
End Sub


Ovviamente la routine va inserita nel vb del foglio SchArt, in quanto sfrutta l'evento change del foglio.

Per quanto riguarda l'utilizzo del controllo immagine, l'immagine deve comunque essere adattata per dimensioni a tale controllo, quindi tanto vale inserirla direttamente nel foglio.

saluti

Edit: rettifico per quanto riguarda l'uso dell'oggetto ActiveX (imageControl).
Dopo averlo inserito e dimensionato a piacere, selezionare dalle proprità: "PictureSizeMode" e settarlo a: "FmPictureSizeModeStretch" (sicuramente c'è il modo di settarlo da vb)

Poi, sempre tramite evento change del foglio:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B3")) Is Nothing Then
    Dim WS As Worksheet
    Dim mPath As String
    Set WS = ActiveSheet
    WS.OLEObjects("Image1").Object.Picture = LoadPicture("")
    Application.ScreenUpdating = False
    mPath = "C:\foto\" & Target.Text & ".jpg"
    If Dir(mPath) <> "" Then
        WS.OLEObjects("Image1").Object.Picture = LoadPicture(mPath)
    End If
End If
Application.ScreenUpdating = True
End Sub





[Modificato da dodo47 28/12/2019 13:38]
Domenico
Win 10 - Excel 2016
Post: 3.647
Registrato il: 03/04/2013
Utente Master
Excel 2000 - 2013
OFFLINE
29/12/2019 07:24

Buona giornata, a Tutti.
Considerando che considero Forum uno strumento di condivisione delle competenze e di approfondimento degli argomenti trattati, riprendo questa discussione per gli Utenti di Forum interessati a questo argomento.

@alfrimpa in risposta #2, proponeva:


 
Sul foglio SchArt inserisci un controllo Immagine (lo trovi in Sviluppo e poi Inserisci) posizionandola e dimensionandola opportunamente sulla cella C5-

Poi nel modulo del foglio SchArt devi inserire una macro (che al variare della cella B3) inserisca nel controllo immagine il file jpg del prodotto.

Per limitare l'esecuzione della macro alla sola cella B3 devi usare l'istruzione Intersect e per caricare l'immagine l'istruzione LoadPicture.



Inizialmente non riuscivo ad interpretare correttamente l'istruzione LoadPicture ottenendo sempre un messaggio di errore.
In seguiuto, grazie alle competenze e alla pazienza di Alfredo, ho chiarito privatamente questo aspetto concludendo che l'utilizzo di LoadPicture è da prendere in seria considerazione; per questo motivo mi sono sentito in dovere di attribuire un "mi piace" alla sua proposta.

LoadPicture, come tutte le istruzioni, presenta limiti e vantaggi.
- Svantaggio: Non consente di modificare dinamicamente posizione e dimensioni dell'immagine
- Vantaggio: Riduce drasticamente il Codice VBA

Nel caso in esame, se tutte le immagini sono state dimensionate correttamente, mi sento di condividere la propopsta di @alfrimpa.

Considerando che anche la proposta di @dodo47, che saluto, è molto interessante mi permetto di attribuire un "mi piace" anche alla sua proposta.

 

Tanto è dovuto per opportuna condivisione con tutti gli Utenti di Forum.

Buon fine settimana.

Giuseppe



Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 2.477
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
29/12/2019 10:26

Ciao

Due osservazioni se mi è consentito:

@Giuseppe


.....LoadPicture..... Non consente di modificare dinamicamente posizione e dimensioni dell'immagine


Nessuno vieta, da codice, di spostare l'oggetto ActiveX


.....se tutte le immagini sono state dimensionate correttamente, mi sento di ......


Non è necessario dimensionare preventivamente le immagini, queste si adattano automaticamente alle dimensioni del controllo ActiveX, se, come detto è stato assegnato alla proprità: "PictureSizeMode" di detto controllo, il valore "FmPictureSizeModeStretch"

Cari saluti
Domenico
Win 10 - Excel 2016
Vota: 15MediaObject5,0028 2
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 08:08. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com