Condividi:        

EXCELL Richiamare Immagini

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

Postdi Anthony47 » 24/10/07 16:02

Se un foglio e' protetto, nemmeno le macro possono modificare le celle. Le istruzioni che hai usato, "se eseguite", sproteggono e proteggono il foglio; e' possibile che qualche macro possa terminare senza settare la protezione?

Ma potrei non aver capito il problema: dici "Il problema è che a volte rimane tutto bloccato come dovrebbe, ma altre volte la pssw non è che si disabilita", ma la frase si presta a piu' interpretazioni:
-le macro vengono eseguite correttamente, il che farebbe pensare che la protezione viene rimossa?
-il foglio rimane sempre protetto? basta provare a modificare una cella protetta e lo vedi subito.

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

Sponsor
 

Oggetto: macro con foglio bloccato

Postdi fly84pd » 07/11/07 09:54

..le macro vengono eseguite correttamente, ma la protezione viene rimossa..cmq per l'uso che ne devo fare va bene lo stesso...

Una cosa che noto: quando ho + di 1 foglio di lavoro aperto e apro il file che abbiamo fatto (con la macro per abilitare le immagini di cui abbiamo discusso), mi da un errore di run time dicendo che è impossibile eseguire la macro (debug / annulla), per cui devo chiudere tutto excel. perchè funzioni correttamente devo aprire solamente il foglio di lavoro eseguito.
E possibile risolvere questo handicap?

Grazie per la collaborazione
Saluto
fly84pd
Newbie
 
Post: 6
Iscritto il: 18/10/07 17:59

Postdi Anthony47 » 07/11/07 14:36

Se il foglio rimane sprotetto, significa che l' istruzione ActiveSheet.Protect Password:="nome pssw data" non viene eseguita; riguarda la macro e i suoi punti di uscita per capire dove agire.

Per l' errore:
-quale messaggio ti esce?
-in quale momento?
-se scegli Debug, quale istruzione e' evidenziata?
-infine, con quale macro stai lavorando?

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

Postdi TheMG » 20/11/07 14:54

Ciao Ragazzi,
ho un problema simile, ma non riesco a risolvere con le vostre indicazioni (forse perchè sono ancora scarso con il VBA)

Il problema è più o meno lo stesso.

In base al valore di una colonna (una %) devo incollare nella colonna adiacente una determinata immagine presa da un altro foglio

ES
Arrivo (mio malgrado) a questo punto, perchè non so lavorare con le immagini:

If worksheets(1).cells(1,1) < 24,99999 then

e qui gli devo dire di incollare nella cella A2 il disegno presente nella cella A1 del secondo foglio e così via per

If worksheets(1).cells(1,1) >25 and < 49,9999

Come posso fare??

GRAZIE MILLE!
TheMG
Newbie
 
Post: 1
Iscritto il: 20/11/07 14:46

Postdi Anthony47 » 20/11/07 23:29

Ciao MG e benvenuto nel forum.
La chiave la trovi nel messaggio del 09/10/07 ore 23:50; per cercare quale immagine prendere ti aiuta il ciclo
For Each Pict In ActiveSheet.Shapes / Next Pict

Prima avrai messo in CurPos l’ indirizzo doove si trova l’ immagine da prelevare, quindi
Codice: Seleziona tutto
If worksheets(1).cells(1,1) < 25 then
CurPos = "A2"
For Each Pict In ActiveSheet.Shapes
  If Pict.TopLeftCell.Address = CurPos Then
  NomeImm = Pict.Name: Exit For
  End If
Next Pict
End If


Questa ti restituisce in NomeImm il nome della forma da copiare; credo che se guardi “quel messaggio” capirai bene.

Attenzione alla sintassi del secondo tuo if:
Codice: Seleziona tutto
If worksheets(1).cells(1,1) >=25 and worksheets(1).cells(1,1)<50 then . . . .


Fai sapere, ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi corindone » 28/11/07 12:30

Ciao a tutti, sono nuovo del forum... anzi, dei forum in generale, quindi se

sbaglio qlcs fatemelo pure notare senza problemi.

Di vba sono pressoché digiuno :-? , quindi confido molto in voi esperti :) .
Ecco la mia situazione. Sto costruendo per lavoro un corposo file excel che opera delle verifiche ingegneristiche e in uno dei fogli ho 80 celle (indipendenti tra loro) per ognuna delle quali posso scegliere il valore in un elenco a discesa di 23 voci (stringhe alfanumeriche i cui primi due caratteri costituiscono la numerazione progressiva: 01, 02,..., 23), lo stesso per tutte le 80 celle.
Ora vorrei visualizzare accanto ad ognuna delle 80 celle l'immagine corrispondente alla voce che scelgo dall'elenco a discesa.
Faccio presente che nel foglio sono presenti già altre immagini "statiche" che non posso cancellare, e che una volta finito il file dovrò proteggerlo con una password bloccando alcune celle e salvarlo come modello xlt.

Potete aiutarmi?

Grazie infinite.
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

Postdi Anthony47 » 29/11/07 02:19

Ciao corindone e benvenuto nel forum.
Direi che sei entrato nella discussione giusta, e leggendo la pag 1 (i messaggi dal 9 al 19 ottobre) trovi anche 2 ipotesi su cui puoi lavorare. Ovviamente stai chiedendo di lavorare con qualcosa come 1800 immagini diverse, che comporta qualche gioco di pazienza.
Mi sembra che per te la soluzione migliore dovrebbe essere quella di Fiorella, per cui:
- ti fai 80 tabelle che incrociano ogni valore con il relativo nome immagine che vuoi visualizzare; diciamo che in col A metti (da riga 2) il valore 01. . . 23 e nelle 80 colonne con pazienza scrivi nella riga 1 l’ indirizzo della cella a cui l’ elenco appartiene e nelle righe sottostanti il nome dell’ immagine corrispondente che vuoi visualizzare.
- ti fai una macro di tipo Worksheet_Change(ByVal Target As Range), che si attivera’ a ogni inserimento che fai in qualsiasi cella; all’ interno della macro:
---controlli che l’ indirizzo di Change sia compreso nell’ elenco delle intestazioni delle 80 tabelle
---se No, esci dalla macro
---se SI:
-----nascondi l’ immagine al momento associata con la cella; potrai usare
Codice: Seleziona tutto
ActiveSheet.Shapes("NomeImmagine").Visible = False
Per NomeImmaginevedi nota 1, piu’ in avanti.
-----attivi l’ immagine che estrai dalla tabella immagini, incrociando il valore digitato e l’ indirizzo della cella usando qualcosa come
Codice: Seleziona tutto
ActiveSheet.Shapes("NomeImmagine").Visible = True

-----memorizzi in un foglio di appoggio, nella cella corrispondente all’ indirizzo della cella modificata, il nome dell’ immagine attivata (Nota1: questa cella quindi contiene il nome dell’ immagine che deve essere nascosta prima di attivare la nuova, al ciclo successivo)
-----posizioni l’ immagine sulla cella che ti interessa con istruzioni quali

Codice: Seleziona tutto
ActiveSheet.Shapes("NomeImmagine").Top = Range("IndirizzoCella").Top
ActiveSheet.Shapes("NomeImmagine").Left = Range("IndirizzoCella").Left


Quanto descritto assume che le immagini siano integrate nel foglio excel, cosa pressocche’ indispensabile se si vuole scambiare il file con altri utenti. Se invece il lavoro riguarda un unico Pc, si potrebbe pensare di avere le immagini su una directory del disco e invece di attivarle (.Visible = True) e nasconderle (.Visible = False) le inserisci e cancelli.
Per inserire
Codice: Seleziona tutto
    ActiveSheet.Pictures.Insert( _
        "C:\Documents and Settings\User_name\Documenti\Immagini\NomeImmagine.bmp").Select

(qui inserirai il path corretto, mentre il nome file lo recupererai sulla tabella 23*80) e per cancellare
Codice: Seleziona tutto
ActiveSheet.Shapes("NomeImmagine").Delete)


Dovresti avere qualche spunto su cui lavorare... ma penso che ne parleremo ancora.

Ciao, fatti sentire.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi corindone » 29/11/07 12:04

Grazie per il pronto interessamento al mio caso, questo già mi solleva un bel po'.
Mi permetto solo di dare qualche chiarimento in più su quello che devo fare (probabilmente è superfluo ed è a me che sfugge qualcosa, me la cavo molto meglio con le formule che con la programmazione).
Intanto le immagini le devo inserire nel foglio di calcolo perché in effetti va usato poi su pc diversi.
Poi, le immagini a cui devo fare riferimento sono solo 23 diverse tra loro, ognuna associata a una stringa (numerata da 1 a 23) che la descrive, e in ognuna delle 80 celle scelgo una delle 23 stringhe: per cui comunque in totale visualizzerò 80 immagini nel foglio, ognuna scelta sempre nella stessa rosa di 23 possibilità. Quindi non potrei,in ognuna delle 80 celle, riferirmi a una stessa tabella di 2 colonne e 23 righe? Nella prima colonna metto le 23 stringhe di testo e nella seconda colonna il nome delle 23 immagini corrispondenti,

A B
1 01) abcd | Img01
2 02) efgh | Img02
. | .
. | .
. | .
23 23) wxyz | Img23


e ognuna delle 80 volte la macro dovrebbe pescare lì dentro: in soldoni, se ad esempio una delle 80 celle è la C73, quando vado lì scelgo dall'elenco la descrizione "02) efgh" e nella cella D73 vorrei veder comparire l'immagine Img02. In effetti il metodo di Fiorella mi sembra vada bene, solo che lo devo applicare contemporaneamente a 80 celle. Sto annegando in un bicchier d'acqua? :oops:
Scusate se dico qlc fesseria o ripeto cose che non sono chiare solo a me, ma sono digiuno di VBA e non so come mettere in pratica qst cosa :( . Però sono sempre contento quando posso imparare qlcs di nuovo da gente preparata :) .

Grazie ancora.
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

Postdi Anthony47 » 29/11/07 23:33

Il fatto che le immagini sono solo 23 semplifica alla grande, ma comporta che le immagini devono essere “copiate” e “inserite” nelle varie posizioni; questo significa che del “metodo Fiorella” userai solo la parte che consente di ottenere il nome immagine in funzione del valore digitato ma poi useremo le istruzioni delle varie macro postate da me per copiare l’ immagine e inserirla in posizione, compreso le correzioni dette nel messaggio del 19-10 “mattina presto”.
Confermo che dovremo memorizzare il nome di ogni immagine copiata (ogni immagine assumera’ il suo proprio nome indipendentemente dall’ immagine di partenza), e per questo potremmo usare non un foglio di servizio ma la stessa cella su cui piazzeremo l’ immagine (quella a dx della cella dei dati), se possiamo essere certi che essa non viene usata per gli input.
E poi, dovendo fare una macro che scatta ad ogni cambiamento sul foglio, sara’ cruciale poter identificare se il cambiamento e’ avvenuto in una delle “nostre” 80 celle: hai qualche regola che si possa adottare? Oppure: come sono disposte le 80 celle? Oppure: quei 23 valori possono essere scritti sono in una delle 80 celle, per cui basta controllare che l’ input dato sia in quell’ elenco e dare per scontato che quindi abbiamo modificato una delle nostre celle (ma quest’ ultimo metodo e’ il piu’ rischioso).

Attendo tuoi chiarimenti sulle cose dette per poter passare …alle vie di fatto.
Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi corindone » 30/11/07 18:01

In effetti il foglio di calcolo ha una struttura ricorrente: le famose 80 celle sono suddivise in 20 gruppi da 4 e la loro posizione sarà fissa nel foglio. Per ora le 80 celle sono raggruppate così: C73:C76, C148:C151, C223:C226, C298:C301, C373:C376, C448:C451, C523:C526, C598:C601, C673:C676, C748:C751, AC73:AC76, AC148:AC151, AC223:AC226, AC298:AC301, AC373:AC376, AC448:AC451, AC523:AC526, AC598:AC601, AC673:AC676, AC748:AC751. Dico "per ora" perché potrei anche avere all'ultimo minuto la necessità di inserire qlcs che mi cambia un po' la conformazione del foglio, comunque il lavoro è già quasi definitivo. E in ogni caso credo che a quel punto basterebbe cambiare nella macro i riferimenti alle celle giuste per rimettere tutto a posto.

Ad ogni modo solo i "magnifici 80" possono contenere uno dei 23 valori dell'elenco, perciò quando la macro trova nel foglio uno dei 23 può anche dare per scontato che quella è una delle 80 celle e quindi può inserire l'immagine corrispondente 'x' celle più a destra.

Un'ulteriore precisazione, forse inutile: la scelta che si opera nell'elenco a discesa di ognuna delle 80 celle potrebbe essere soggetta a ripensamenti (ad es. magari prima scelgo la prima voce, poi mi accorgo di aver sbagliato e scelgo la 23esima), quindi la macro dovrebbe prima cancellare l'eventuale immagine già presente nella cella di destinazione e poi incollarvi la nuova immagine, altrimenti si rischia che ad ogni cambio sovrappongo un'immagine ulteriore e il foglio mi diventa pesantissimo.

Pensavo poi che se ogni immagine copiata va rinominata, si potrebbe anche strutturarne i nomi con qlcs del tipo "Immagine"&RIF.COLONNA(...)&RIF.RIGA(...), dove RIF.COLONNA e RIF.RIGA possono essere quelli della cella dove viene incollata l'immagine o quelli della corrispondente cella riconosciuta dalla macro come una delle 80 famose... se questo facilita qlcs nella macro (scusa se magari è un'ingenuità :oops: ).

Se non sono stato esauriente o chiaro dimmelo pure, di tante cose magari neanche mi rendo bene conto.

Grazie.
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

Postdi Anthony47 » 02/12/07 02:18

Allora facciamo cosi’. . . .
Nel tuo file ti crei un foglio che nomini InpDati (o come ti piace); in questo foglio inserisci le 23 immagini, facendo attenzione a mettere l’ angolo sup-sx dell’ immagine associata a un certo valore (01-23) all’ interno della riga che ha quel numero (Riga1-Riga23); per questo devi guardare i delimitatori dell’ immagine quando la selezioni. Le immagini possono essere anche sovrapposte, ma suggerisco di sfalsarle per una migliore visibilita’.
Sulla stesso foglio ti crei un elenco verticale con i 23 valori, facendo in modo che i primi 2 caratteri siano numerici (01-23); a questo elenco associ il nome “Valida”: selezioni le 23 celle, Menu /Inserisci /Nome /Definisci; nell’ area “Nomi nella cartella. . . “ scrivi Valida, confermi con Ok.

Torni sul tuo foglione, e inserisci una convalida sulle 80 celle; basta farlo su una e poi la copi nelle altre 79 posizioni. Per questo:
-selezioni la prima cella, Menu /Dati /Convalida; scegli Consenti da Elenco, nell’ area Origine scrivi “=Valida” (senza virgolette); compili messaggi di input e di output a piacere, chiudi con Ok.
-selezioni questa cella, fai Contr-c (copia), poi vai nelle altre 79 e in ognuna fai Contr-v (incolla)
-se hai gia' inserito una convalida, io suggerisco di cancellarla (selezioni tutte le celle, Menu /Dati /Convalida; scegli Consenti Qualsiasi valore)
-ricorda che useremo la cella a dx per compilarla con il nome immagine, quindi verifica che esse siano libere.

Sempre dal “foglione”, fai tasto dx sul tab col nome del foglio e seleziona Visualizza codice. Ti si apre il vba editor; copia le seguente macro e incollalo nel frame vuoto di dx:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
'
FServ = "InpDati"             '<<<<<< Foglio con elenco e immagini
'
Application.EnableEvents = False
On Error GoTo Esci
MVal = Target.Value
Trovato = Sheets(FServ).Range("Valida").Find(what:=MVal)
ADx = Target.Offset(0, 1).Value
If ADx <> "" Then
Shapes(ADx).Delete
Target.Offset(0, 1).ClearContents
End If
CWs = ActiveSheet.Name
'Vai a prendere l' immagine
Application.ScreenUpdating = False
Sheets(FServ).Select
CurPos = Val(Left(MVal, 2))
For Each Pict In ActiveSheet.Shapes
aaa = Pict.TopLeftCell.Row
  If Pict.TopLeftCell.Row = CurPos Then
  NomeImm = Pict.Name: Exit For
  End If
Next Pict
'
'e Copiala
Sheets(CWs).Activate
Application.ScreenUpdating = True
If NomeImm = "" Then
MsgBox ("Nessuna Immagine corrisponde")
GoTo Esci
End If
Sheets(FServ).Shapes(NomeImm).Copy
Target.Offset(0, 1).Select
ActiveSheet.Paste
Target.Offset(0, 1).Value = Selection.Name
aa = 1
Esci:
Target.Select
Application.EnableEvents = True
End Sub


Verifica che il nome foglio specificato nell’ istruzione marcata <<<< sia quello che hai usato.

A questo punto torna sul tuo foglione e prova cosa succede.

MA PRIMA, come sempre prima di fare esperimenti, fai 2 copie di backup del tuo file originale.

Ciao, fai sapere.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi corindone » 03/12/07 09:33

Grazie per la risposta, ora provo e appena fatto illustro i risultati :D :D
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

Postdi corindone » 04/12/07 11:47

Eccomi qua. Mi scuso se ho fatto un po' attendere la risposta.
La macro in effetti funziona abbastanza, ho solo notato qualche imprecisione nel posizionamento delle immagini.
Intanto, non capisco come mai, la terza immagine dell'elenco delle 23 non viene inserita: invece di esserci scritto 'Picture ##' nella cella di destinazione (con ## numero progressivamente incrementato) compare 'Line ##' (sempre con ## numero progressivamente incrementato) e l'immagine non c'è.
Poi le altre immagini vengono incollate, ma non allineate alla cella di destinazione: vengono inserite molto più a destra (e in qlc caso più in basso) della cella in cui compare la scritta 'Picture ##'. Si potrebbe fare in modo di allinearle al centro della cella o scostarle di, non so, 20 pixel dal margine sinistro della cella? Altrimenti l'immagine incollata potrebbe coprire la freccetta che apre l'elenco a discesa.

Chiedo venia se sono così seccatore :roll: :oops: .

Comunque l'obiettivo mi sembra molto vicino, sei grande Anthony, ti sono infinitamente grato :D .
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

Postdi Anthony47 » 05/12/07 02:13

Secondo me, in riga 3 esiste un ulteriore disegno, una linea poco visibile che e’ l’ immagine che viene copiata. Devi scovarla e cancellarla. Oppure inserisci un NUOVO foglio, quindi certamente vuoto, e copi su esso le immagini, 1 per una e controllando di non copiare anche immagini spurie; poi elimini il vecchio foglio.

Per quanto riguarda il posizionamento delle immagini, puoi definirlo in modo preciso con le istruzioni
Codice: Seleziona tutto
Selection.ShapeRange.Top = ActiveCell.Top
Selection.ShapeRange.Left = ActiveCell.Left + 22

Da inserire dopo l’ ActiveSheet.Paste di copia sul foglio corrente.

Ciao, fai sapere.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi corindone » 06/12/07 11:54

Probabilmente avevi ragione Anthony, ho rifatto tutto daccapo e ora funziona perfettamente, anche le immagini incollate si allineano bene nella loro cella con quella piccola aggiunta al codice.
Non so davvero come ringraziarti, oltre a risolvermi un problema mi hai aperto un mondo :D .
E adesso prevale la curiosità: se volessi ad esempio incollare le immagini non nella cella subito a destra, ma tot celle più a destra rispetto a quella in cui opero la mia scelta, come dovrei dirgli di farlo?
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

Postdi Anthony47 » 07/12/07 00:58

Visto l’ entusiasmo, ti segnalo solo l’ istruzione chiave che determina la posizione delle immagini:
Codice: Seleziona tutto
Target.Offset(0, 1).Select


Non avrai difficolta’, guardando anche l’ help ondine del vba, a modificare a piacimento la destinazione; ma se hai bisogno siamo qua.

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

Postdi corindone » 07/12/07 13:05

Credo di aver capito. Mi sa che ci prenderò facilmente gusto a qst cose :D ;) .
Grazie infinite.
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

Postdi corindone » 10/12/07 12:24

Confermo, ci sto prendendo gusto (compatibilmente col tempo che mi rimane da dedicare a queste cose).

Qualcuno mi può indicare delle risorse con cui possa iniziare seriamente a cimentarmi con vba per excel?
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

Postdi Anthony47 » 11/12/07 03:01

Personalmente non ho nulla da suggerire, giacche’ quello che so e’ il risultato di “vari” anni di uso di excel, con esigenze sempre complesse.
Molte cose le puoi imparare anche solo registrando macro, e poi lavorando per modificarle.

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

Postdi corindone » 12/12/07 11:19

Un'altra curiosità.
E' possibile incollare una determinata immagine in una cella "x" semplicemente posizionandosi con il cursore in una determinata cella "y"? Ed è poi possibile, spostandosi in una diversa cella "z", far comparire sempre nella cella "x" un'altra immagine che sostituisca la precedente?
corindone
Newbie
 
Post: 9
Iscritto il: 28/11/07 11:18
Località: Perugia

PrecedenteProssimo

Torna a Applicazioni Office Windows


Topic correlati a "EXCELL Richiamare Immagini":


Chi c’è in linea

Visitano il forum: Nessuno e 51 ospiti