controllo image



  • controllo image
    di michel (utente non iscritto) data: 17/02/2015 18:17:53

    ciao ho una richiesta: in un foglio excel ho tanti controlli image, in cui ho caricato immagini e vorrei applicare le seguenti istruzioni:

    per creare una sorta di "zoom in " e "zoom out" alla pressione e rilascio del tasto del mouse.
    Ora ciò che vorrei è un modo per evitare di ripetere queste istruzioni per ogni immagine (ne ho più di 50)

    grazie per l'aiuto.
     
    Private Sub Image3_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
    Me.Image3.Height = 150
    Me.Image3.Width = 150
    End Sub
    Private Sub Image3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
    Me.Image3.Height = 48
    Me.Image3.Width = 48



  • di Vecchio Frac data: 17/02/2015 19:10:05

    Ma questi "controlli image" sono davvero sul foglio?
    Dal codice che hai postato ho il forte sospetto che siano controlli su uno userform.





  • di Vecchio Frac data: 17/02/2015 20:50:55

    Se invece le immagini non sono su un form ma sul foglio, con un piccolo accrocchio puoi ottenere un interessante effetto di zoom-in e zoom-out, non a pressione e rilascio di mouse ma ad ogni clic sinistro di mouse (in pratica il codice seguente ingrandisce e rimpicciolisce l'immagine cliccata ad ogni clic).
     
    'in un Modulo
    Option Explicit
    
    Private prev_img As String
    
    Public Sub zoom_onoff()
        
        ActiveSheet.Shapes(prev_img).Width = 150
        
        With ActiveSheet.Shapes(Application.Caller)
            If .Width >= 200 Then
                .Width = 150
            Else
                .Width = 200
            End If
        End With
        
        prev_img = Application.Caller
        
    End Sub
    






  • di Vecchio Frac data: 17/02/2015 21:00:40

    Dimenticavo di dire, se ce n'è bisogno, che la macro suddetta va assegnata ad ogni immagine sul foglio.





  • di Michel (utente non iscritto) data: 18/02/2015 07:24:33

    Grazie trac,
    Mi piace l idea del click che hai suggerito;e si i controlli sono su un foglio e non in una userform.
    Il mio problema comunque è non dover " la macro suddetta va assegnata ad ogni immagine sul foglio" come citi tu....poiché ho più di 50 immagini nel foglio.



  • di michel (utente non iscritto) data: 18/02/2015 08:28:05

    ciao Frac,
    praticamente speravo in un qualcosa tipo un ciclo FOR (scusate se scrivo eresie) che facesse eseguire le istruzioni di Zoom ad ogni immagine presente nel foglio.



  • di Vecchio Frac data: 18/02/2015 09:03:24

    cit. "Il mio problema comunque è non dover " la macro suddetta va assegnata ad ogni immagine sul foglio" come citi tu....poiché ho più di 50 immagini nel foglio. "
    cit. " speravo in un qualcosa tipo un ciclo FOR (scusate se scrivo eresie) che facesse eseguire le istruzioni di Zoom ad ogni immagine presente nel foglio."
    ---> Oh ma questo non è affatto un problema e non è un'eresia :o)
    Vai nel foglio con le 50 immagini, apri l'editor di codice (Alt-F11), attiva la finestra Immediata (Ctrl-G) e incolla questa riga, poi premi invio:
    for each v in activesheet.shapes: v.onaction="zoom_onoff": next
    Questa riga di codice per ogni Shape sul foglio assegna la macro scritta prima "zoom_onoff" (bè... compresi eventuali pulsanti di comando, in effetti, ma è solo per farti vedere come si fa in un colpo solo). Se hai combo, textbox, pulsanti eccetera e vuoi risparmiarli dall'assegnazione cumulativa allora sarà meglio scrivere una procedura separata da far partire al volo e poi da cancellare.









  • di michel (utente non iscritto) data: 18/02/2015 13:01:19

    ciao Frac...scusa..ho cercato di applicare i tuoi suggerimenti ...ma non funzionano...sicuramente ho sbagliato qualcosa..ti allego un file , potresti fare le modifiche ?
    grazie



  • di Vecchio Frac data: 18/02/2015 13:35:56

    Il file allegato è un .xlsx e se tu ci scrivi delle macro non verranno eseguite.
    Devi salvare il file come .xlsm cioè con attivazione delle macro, quindi riaprirlo stando attento che le macro siano attivate per questo progetto.





  • di Vecchio Frac data: 18/02/2015 14:08:48

    Ah vedo ora dal file che tu hai inserito le immagini come controlli ActiveX... ecco perchè il tuo codice iniziale era scritto così :o)
    Quel trucco che ti ho mostrato io vale solo se inserisci le immagini non come controlli ActiveX ma come semplici immagini (io ho trascinato un paio di immagini direttamente su Excel).





  • di Vecchio Frac data: 18/02/2015 15:11:51

    Allego il file "prova zoom vfrac.xlsm" che in qualche modo fa quello che dici... ho creato una matrice di controlli image e l'ho gestita con una routine comune. Il codice è comunque interessante, dagli un'occhiata (in cella AA1 viene messo il nome della figura cliccata, serve per ripristinarla quando si fa clic su un'immagine diversa).





  • di MICHEL (utente non iscritto) data: 18/02/2015 16:19:47

    ciao Frac... azzz..qui la cosa si complica...comunque mi piace iol file che mi hai inviato; ma come si fa a far ritornare piccole tutte le immagini ? nell'esempio che hai allegato una rimane sempre "zommata";
    Ti allego un altro file in cui ho tentato di applicare l"accrocchio" di cui prima con le immagini inserite direttamente nel foglio excel senza controlli activex: perchè restituisce un errore ?



  • di isy data: 18/02/2015 18:46:00

    Ciao

    Allego il seguente file: pop-up-picture.xls da provare
    Consiglio di utilizzare immagini di piccola dimensione



  • di Vecchio Frac data: 18/02/2015 20:01:25

    Ciao isy,
    grazie dell'intervento! Io proprio non capisco perchè, ma ho problemi qui col mio Excel 2010 sia con la mia versione che con la tua (mi riferisco alla versione che usa array di controlli). Mentre in ufficio (Excel 2007) non ho problemi, qui non riesco a fargli digerire nè OLEObjects nè OLEFormat.Objects :(





  • di Vecchio Frac data: 19/02/2015 10:46:44

    @Michel
    Ti riposto il codice modificato valido in caso di immagini incollati direttamente sul foglio non come controlli activex. Qui con Excel 2007 non mi dà errore e funziona in modo che cliccando sull'immagine ingrandita la rimpicciolisce.
     
    Option Explicit
    
    Public WithEvents itmImage As Image
    Public CallerObject As class_control_matrix
    
    Private Sub itmImage_Click()
    Dim s As String
    
        If itmImage.Name = Range("AA1") Then
            With itmImage
                .Width = 50
                .Height = 50
            End With
            CallerObject.ItemClick itmImage
            Exit Sub
        End If
        If Range("AA1") = "" Then s = itmImage.Name Else s = Range("AA1")
        
        With ActiveSheet.OLEObjects(s)
            .Width = 50
            .Height = 50
        End With
        
        With itmImage
            If .Width >= 100 Then
                .Width = 50
                .Height = 50
            Else
                .Width = 100
                .Height = 100
            End If
        End With
        
        Range("AA1") = itmImage.Name
        
        CallerObject.ItemClick itmImage
        
    End Sub






  • di michel (utente non iscritto) data: 19/02/2015 15:19:29

    ciao Frac grazie...con excel2010 mi restituisce un errore...
    senti ma se volessi andare avanti con la strada dei controlli activex come avevo cominciato, c'è modo di "saltare" le righe d' istruzione "zoom" per ogni immagine ?
    grazie per l'aiuto



  • di Vecchio Frac data: 19/02/2015 16:05:36

    Cosa intendi esattamente per "saltare le righe d' istruzione "zoom" per ogni immagine ?"

    p.s. anche sul mio Excel 2010 queste stesse righe di codice che qui funzionano, non funzionano per niente e speravo che isy avesse una trovata geniale :)





  • di michel (utente non iscritto) data: 19/02/2015 16:44:03

    intendo per esempio le mie vecchie righe che vedi sotto che sono associate al controlloactive image 21....che vorrei evitare di ripetere per ogni controllo image....
     
    Private Sub Image21_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Image21.Height = 150
    Image21.Width = 150
    End Sub
    
    Private Sub Image21_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Image21.Height = 48
    Image21.Width = 48
    End Sub



  • di Vecchio Frac data: 19/02/2015 17:15:15

    Ah... l'unica è un array di controlli che però ho verificato anche con la soluzione di isy, su questo 2010 non funziona come dovrebbe e non ho ancora trovato il motivo :o)





  • di michel (utente non iscritto) data: 19/02/2015 17:45:20

    ok gazie comunque per l'esaustivo aiuto...approfitto ancora di voi...ho tentato di impostare nella finetrsa proprietà dei miei controlli image la proprietà mousepointer su "99...." e poi tramite mouseicon ho "sfogliato" per cercare altri file (.ico e .cur) ma ciò che ottengo è solo un errore. qualche aiuto ?