Condividi:        

Passare o inserire immagini Shapes un un Userform

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Passare o inserire immagini Shapes un un Userform

Postdi Maury170419 » 01/04/19 11:17

Buon Giorno a tutti mi chiamo Maurizio
E il mio problema è questo : Su di un foglio di excel arrivano nella colonna (A) cinque link che io prelevo dal sito Meteo Weather.com
e fin qui tutto ok !
Poi io con questo Listato :
Codice: Seleziona tutto
Dim rngTarget As Range

Sub GetShapeFromWeb(strShpUrl As String, rngTarget As Range)
    On Error GoTo Description
   
Description:

    With rngTarget.Parent
       .Pictures.Insert strShpUrl
       .Shapes(.Shapes.Count).Left = rngTarget.Left
       .Shapes(.Shapes.Count).Top = rngTarget.Top
    End With
   
If Description = "" Then
: Description = 0
End If

 End Sub

Private Sub Cmd_Recupera_Immagini_Click()
'On Error Resume Next

'For I = 1 To 1
'Call GetShapeFromWeb(Foglio1.Range("A10").Value, Foglio1.Range("B20"))

'Call GetShapeFromWeb(Foglio1.Range("A11").Value, Foglio1.Range("C20"))

'Call GetShapeFromWeb(Foglio1.Range("A12").Value, Foglio1.Range("D20"))

'Call GetShapeFromWeb(Foglio1.Range("A13").Value, Foglio1.Range("E20"))

'Call GetShapeFromWeb(Foglio1.Range("A14").Value, Foglio1.Range("F20"))

'Call GetShapeFromWeb(Foglio1.Range("A15").Value, UserForm1.Image6.Picture)
'End
'Next I


Leggo questi link ed estraggo le loro immagini per inserirle poi nelle rispettive celle del foglio di excel ; E anche qui tutto ok
Il problema sorge però quando tento di voler fare la stessa cosa solo però inserendo le immagini all'interno di un Userform
Credetemi che ho tentato in tutti i modi da me conosciuti possibili senza ricavare anche solo un piccolo risultato valido.
In più ho provato anche a dare un'occhiata su internet , ma sembra tutto (Tabu)
Per cui io chiedo a voi se ci fosse la possibilità di copiare o trasferire queste immagini direttamente nell'userform .
Oppure : Anche solo sapere come poter salvare queste immagini che arrivano sul foglio di lavoro, inserendole direttamente nella mia cartella di lavoro; Per poi capire come cancellare il tutto in forma Automatica una volta copiate o fatte arrivare all'interno dell'Userform .
In modo tale che siano sempre aggiornate grazie

(P.S) Scusatemi della spiegazione forse un pochino poco chiara
Ma e difficile per me esprimere con precisione ciò che non conosco ; Con termini conprensibili a tutti voi !

Grazie sin da ora per le vostra disponibilità Saluti da Maurizio

Dimenticavo di Aggiungere il link per scaricare il tutto che è questo :
https://app.box.com/s/msk7fvgj2gl4vpfy1hvqdhbk8es451ir
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05

Sponsor
 

Re:Passare o inserire immagini Shapes un un Userform

Postdi Anthony47 » 01/04/19 18:21

Per la soluzione del problema bisogna avere in mente due prerequisiti:
1) Le immagini devono essere "locali" (cioe' sul tuo disco) per essere inserite in un controllo Image
2) I formati accettati sono .bmp, .gif, .jpg, .wmf o anche .ico; quelle che prelevi sono invece png.

Per scaricare le immagini dal sito possiamo utilizzare la funzione URLDownloadToFile, disponibile tra le API di windows.
Piu' difficile e' la conversione in formato accettabile, che ho fatto tramite una soluzione pubblicata da Andy Pope qui: https://answers.microsoft.com/en-us/mso ... 8c8fe23d90

Quindi alla fine
1) In testa al modulo vba con il codice della userform inserisci questa ulteriore dichiarazione:
Codice: Seleziona tutto
Dim rngTarget As Range             'Questa c'e' gia'
'LA PROSSIMA e' da aggiungere:
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
    (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

2) inserisci nel tuo progetto un nuovo modulo in cui mettiamo tutto e solo il codice di Andy Pope, e cioe':
Codice: Seleziona tutto
Private Type GUID
    Data1                   As Long
    Data2                   As Integer
    Data3                   As Integer
    Data4(0 To 7)           As Byte
End Type

Private Type PICTDESC
    Size                        As Long
    Type                        As Long
    hPic                        As Long
    hPal                        As Long
End Type

Private Type GdiplusStartupInput
    GdiplusVersion              As Long
    DebugEventCallback          As Long
    SuppressBackgroundThread    As Long
    SuppressExternalCodecs      As Long
End Type

Public Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, _
    inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Function GdipCreateBitmapFromFile Lib "GDIPlus" (ByVal filename As Long, bitmap As Long) As Long
Private Declare Function GdipCreateHBITMAPFromBitmap Lib "GDIPlus" (ByVal bitmap As Long, _
    hbmReturn As Long, ByVal background As Long) As Long
Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal image As Long) As Long
Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PICTDESC, _
    RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

Public Function LoadImage(ByVal strFName As String) As IPicture
    Dim uGdiInput As GdiplusStartupInput
    Dim hGdiPlus As Long
    Dim hGdiImage As Long
    Dim hBitmap As Long

    uGdiInput.GdiplusVersion = 1
   
    If GdiplusStartup(hGdiPlus, uGdiInput) = 0 Then
        If GdipCreateBitmapFromFile(StrPtr(strFName), hGdiImage) = 0 Then
            GdipCreateHBITMAPFromBitmap hGdiImage, hBitmap, 0
            Set LoadImage = ConvertToIPicture(hBitmap)
            GdipDisposeImage hGdiImage
        End If
        GdiplusShutdown hGdiPlus
    End If

End Function

Public Function ConvertToIPicture(ByVal hPic As Long) As IPicture

    Dim uPicInfo As PICTDESC
    Dim IID_IDispatch As GUID
    Dim IPic As IPicture

    Const PICTYPE_BITMAP = 1

    With IID_IDispatch
        .Data1 = &H7BF80980
        .Data2 = &HBF32
        .Data3 = &H101A
        .Data4(0) = &H8B
        .Data4(1) = &HBB
        .Data4(2) = &H0
        .Data4(3) = &HAA
        .Data4(4) = &H0
        .Data4(5) = &H30
        .Data4(6) = &HC
        .Data4(7) = &HAB
    End With

    With uPicInfo
        .Size = Len(uPicInfo)
        .Type = PICTYPE_BITMAP
        .hPic = hPic
        .hPal = 0
    End With

    OleCreatePictureIndirect uPicInfo, IID_IDispatch, True, IPic

    Set ConvertToIPicture = IPic
End Function

Chiedetemi pure la spiegazione del codice, o quali sono le sue caratteristiche complete; tanto non vi rispondero', perche' non lo so decodificare :D
Io so solo che puo' essere usato per far digerire a un controllo Image un file in formato "PNG".

3) sostituisci la tua Sub Cmd_Recupera_Immagini_Click con questa versione:
Codice: Seleziona tutto
Private Sub Cmd_Recupera_Immagini_Click()
Dim fName As Variant, Risp As Long, I As Long
Debug.Print Format(Now, "hh:mm:ss")
For I = 1 To 5
    fName = Environ("temp") & "\" & Mid(Foglio1.Range("A10").Offset(I - 1, 0), InStrRev(Foglio1.Range("A10").Offset(I - 1, 0), "/") + 1)
    Debug.Print I, fName, Foglio1.Range("A10").Offset(I - 1, 0)
    ''Salva file Immagini:
    Risp = URLDownloadToFile(0, Foglio1.Range("A10").Offset(I - 1, 0), fName, 0, 0)
    'Carica Immagine nel Controllo:
    If UCase(Right(fName, 4)) = ".PNG" Then
        Me.Controls("Image" & I).Picture = LoadImage(fName)      'Usa il codice AndyPope
    Else
        Me.Controls("Image" & I).Picture = LoadPicture(fName)    'Metodo normale
    End If
Next I
''Call Salva_Immagini    'Serve a che cosa??
End Sub

Ho evidenziato l'istruzione che salva nella tua directory Temp i file prelevati dal sito, e le istruzioni che inseriscono l'immagine nel Controllo, col metodo normale o (in caso di .png) col codice contenuto nel modulo "AndyPope"

A me funziona, prova e fai sapere
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Passare o inserire immagini Shapes un un Userform

Postdi Maury170419 » 03/04/19 10:35

Ciao Anthony
Scusami se ti scrivo solo ora per ringraziarti infinitamente per questo tuo capolavoro
Ma ho avuto dei problemi di permessi negati da parte di questo forum , in quanto pensando di fare una cosa giusta ho provato l'altro giorno a voler cambiare il mio nuovo indirizzo di posta elettronica in quanto quella di Yahoo-it non funzionava più ; Ho che sappia io non esiste più neppure come App.
Però devo aver fatto un pochino di casini come il mio solito , per qui non potevo più accedere a questo forum.
Però ora sembra tutto a posto .
Come sempre sei non solo un Grande ma forse il più grande programmatore che io abbia mai avuto a che fare.
Anche se a dire il vero :
1 ) Io non ti stavo chiedendo di realizzarmi questo ben di dio che hai fatto tu
Che ora proverò a mettere in pratica sicuramente .
2 ) Ma la mia Richiesta era un pochino più semplice ; Logicamente per chi lo sa fare !!!!!!!
Forse un pochino Banali . Ma che su Internet non si trovano facilmente ed erano queste :
1 ) Una cosa che vorrei capire e : Una volta Estratte le immagini dai 5 link usando anche solo la mia procedura
e vero che loro sono classificate con estensione (PNG)
Però quando excel le mette sotto forma di Immagini , Loro continuano a mantenere sempre lo stesso formato ; Ho diventano automaticamente altro (Jpg/Bmp/Gif) ecc...!
2 ) Cosa molto Importante : Una volta Estratte portate alla luce dal mio progetto ; C'è una semplice funzione "Sempre Tra Virgolette" che possa semplicemente salvare queste immagini all'interno di una mia sotto cartella chiamata per ipotesi (Immagini_Google) Tutto qui !
Chiaro si fa per dire ?
Chiedo questo perché : Io nella mia Pseudo ignoranza in materia , Pensavo che bastasse scrivere
( Percorso : (C:\) - Il Nome Variabile Dell'immagine in questione - E poi Salve )
Invece sembra che tutto ciò non basti !
Un po come succede quando selezionando un oggetto si usi il copia ed incolla ho salva con Nome , solo che il questo caso il percorso e già stato scritto per qui e li che dovrebbe andare .
Grazie infinite per ciò che hai fatto ; Per il tuo tempo che mi hai sempre dedicato , e per le ulteriori spiegazioni che vorrai darmi in merito a quanto spiegato prima.
Sinceri saluti da A.Maurizio
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05

Re: Passare o inserire immagini Shapes un un Userform

Postdi Anthony47 » 03/04/19 19:18

Io ti ho sistemato la Sub Cmd_Recupera_Immagini_Click affinche' prelevi le immagini dagli url elencati su Foglio1e li salvi all'interno della tua directory TEMP; poi (nella stessa Sub), a seconda del formato, le immagini sono assegnate ai controlli "Immagine" in modo tradizionale [LoadPicture(NomeFile)] o col metodo sviluppato da Andy Pope [LoadImage(NomeFile)]

Le tue domande richiedono una risposta articolata:
1) In Excel, le immagini visibili nei fogli possono essere "collegate" (cioe' viene creato sul foglio un "link" all'immagine, nel nostro caso all'url https://cdn.worldweatheronline.net/imag ... tcetc.png). Il comando Pictures.Insert inserisce un "collegamento" all'immagine
Oppure possono essere "integrate" nel file Excel. Il comando Shapes.AddPicture inserisce l'immagine nel file Excel.
I formati accettati sono molti, compreso il .png

2) Su una userform o un controllo Image gli unici formati accettati sono .bmp, .gif, .jpg, .wmf/emf, .ico

Quindi se vuoi genericamente il codice che ti salva le immagini prelevate da sito web, esso e' sinteticamente
Codice: Seleziona tutto
Risp = URLDownloadToFile(0, UrlDiOrigine, NomeDelFileSalvato, 0, 0)


Poiche' URLDownloadToFile e' una funzione di sistema, essa va dichiarata in testa al Modulo che la usa

Con riferimento specifico al tuo messaggio:
1 ) Una cosa che vorrei capire e : Una volta Estratte le immagini dai 5 link usando anche solo la mia procedura
e vero che loro sono classificate con estensione (PNG)
Però quando excel le mette sotto forma di Immagini , Loro continuano a mantenere sempre lo stesso formato ; Ho diventano automaticamente altro (Jpg/Bmp/Gif) ecc...!
2 ) Cosa molto Importante : Una volta Estratte portate alla luce dal mio progetto ; C'è una semplice funzione "Sempre Tra Virgolette" che possa semplicemente salvare queste immagini all'interno di una mia sotto cartella chiamata per ipotesi (Immagini_Google) Tutto qui !
Io non so quale e' la procedura completa che tu hai usato; nel file allegato vedo che hai "integrato" le immagini, che quindi risulteranno presenti all'interno del file Excel. Un modo semplice per ritrovarle e' di salvare il file Excel in formato "Pagine Web"; in questo modo troverai su disco anche una directory che ha lo stesso nome del file, all'interno della quale troverai anche le Immagini

Ma in questo modo non so se la qualita' e' la stessa dell'originale o puo' risultare peggiorata, perche' Excel comprime le immagini.

Il modo piu' lineare di lavorare e' di scaricare le immagini (usando ad esempio la URLDownloadToFile, come ho fatto io) e successivamente usarle all'interno degli applicativi Office.

Rimane l'impossibilita' di usare direttamente le immagini in formato .png su Userform o controllo Image, cosa che puo' essere aggirata usando il codice di Andy Pope

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19438
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Passare o inserire immagini Shapes un un Userform

Postdi Maury170419 » 04/04/19 08:21

Grazie Infinite Anthony
Come sempre sei un grande anche nelle tue risposte
Grazie e buona giornata
(P.S) Metterò sicuramente a frutto i tuoi suggerimenti
Ciao e alla prossima
Un sincero saluto anche a tutto lo staff di Pc-Facile
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05


Torna a Applicazioni Office Windows


Topic correlati a "Passare o inserire immagini Shapes un un Userform":


Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti

cron