| | 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 |
|
|