Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel] - "Dirottare" comando Incolla

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

[Excel] - "Dirottare" comando Incolla

Postdi maxmula » 13/10/09 14:50

Ciao a tutti,
In un foglio di calcolo ho un'area in cui l'utente può incollare dei valori copiati altrove.
Vorrei però evitare che questi faccia un banale CTRL-V o Incolla da menu di Excel, in quanto questo modificherebbe la formattazione delle celle in questione.
In pratica, vorrei "costringere" l'utente a fare un Incolla-Speciale/Valori...

Per la scorciatoia CTRL-V posso usare il metodo Application .OnKey, ma come posso fare per intercettare l'Incolla "normale" dato da menu Modifica (o da menu contestuale) e di conseguenza eseguire al suo posto quello "speciale" ?

Grazie in anticipo,
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Sponsor
 

Re: [Excel] - "Dirottare" comando Incolla

Postdi Anthony47 » 13/10/09 17:45

Non e' semplice, nella mia valutazione, impedire all' utente di usare comandi di sistema; se hai una certa preparazione sul vba fai una ricerca su google con la stringa "force paste special" (comprese le virgolette), troverai diverse proposte.
Alcuni suggerimenti:
1) usi una macro di evento Worksheet_Change per intercettare le modifiche introdotte sul foglio di lavoro, poi verifichi se la modifica riguarda una delle tue celle significative, se SI riapplichi la formattazione specifica di quella cella.
2) ti crei un "foglio ombra" nascosto, con le formattazioni volute; poi con l' evento worksheet_change scopri il foglio ombra e lo attivi, copi la cella modificata, torni sul foglio originale, fai un copia-speciale-formato, nascondi il foglio ombra.
3) proteggi il foglio e forzi l' utente a lavorare con pulsanti e macro che fanno solo quello che tu hai in mente.

Una qualche semplificazione si potrebbe forse fare intercettando solo il Copia/Incolla, ma rimarrebbe sempre il problema del taglia/incolla.
Se usi una macro di Worksheet_Change ricorda che anche la formattazione provoca un "change", quindi in testa alla tua macro inserirai un Application.EnableEvents = False e in coda, prima di uscire, un Application.EnableEvents = True.

Per impedire l' uso di Contr-c e Contr-v puoi piu' semplicemente creare due macro che non fanno niente (del tipo sub pippo1()/End Sub) e poi associare Contr-c e Contr-v come tasti di scelta rapida per queste due macro.

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13894
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] - "Dirottare" comando Incolla

Postdi maxmula » 14/10/09 16:50

Saggio come sempre! :)

Alla terza avevo già pensato ma l'ho scartata perchè vorrei che l'utente abbia anche la possibilità di digitare personalmente i dati.

Ho provato a modificare il comportamento dei comandi Cut&Paste come indicato in questo forum: http://www.mrexcel.com/forum/showthread.php?t=56674
Però queste funzioni interferivano con altre nel mio foglio (le mie "opere" sono sempre piene di routine che fanno cose... :P)... per cui ho eliminato anche quella.

Alla fine ho usato un mix tra le tue 1) e 2):

- Ho copiato i formati nelle due celle K2 e K3, non visibili all'utente (da buon perfezionista ho anche usato una formattazione a leggibilità facilitata, con 2 colori alternati...)

- Ho messo la seguente funzione in un normale Modulo:

Codice: Seleziona tutto
Function RIVELA_PREC()
    'TIENE TRACCIA DELLA CELLA PRECEDENTEMENTE SELEZIONATA
    Static PREC
    'Stop
    ADDR = ActiveCell.AddressLocal
   
    RIVELA_PREC = PREC
    PREC = ADDR
   
End Function


- Ho definito i seguenti eventi per il mio foglio di calcolo:

Codice: Seleziona tutto
Private Sub Worksheet_Activate()
    A = RIVELA_PREC     'In questo modo abbiamo sempre una cella "precedente"
End Sub

'--------------------------------------------------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
    Static CHANGE_STATUS As Boolean     'questo serve per impedire che la macro si auto-chiami all'infinito...
                                        'ovvero fino all'esaurimento della memoria dello stack!
   
    If CHANGE_STATUS = True Then GoTo FINE
       
    CHANGE_STATUS = True
    ADDR = ActiveCell.AddressLocal
    R = Range(ADDR).Row
    C = Range(ADDR).Column
    If C = 2 And R >= 6 Then
        Range("K2:K3").Copy
        Range("B6:B105").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    End If
    Range(ADDR).Select
   
FINE:
End Sub

'--------------------------------------------------------------------------------------------

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
    If Application.CutCopyMode <> 0 Then GoTo FINE     'Così evita di interferire con l'operazione Incolla.
   
   A = RIVELA_PREC
    ActiveSheet.Unprotect
    RIGA = Range(ActiveCell.AddressLocal).Row
    COL = Range(ActiveCell.AddressLocal).Column
   
    Range("E6:G65536").Interior.ColorIndex = xlNone
    ActiveSheet.ClearArrows
    ...
    '(qui la routine fa altre cose, tipo modificare colori di sfondo e visualizzare frecce...)
    ...

    ActiveSheet.Protect
   
    CHANGE_STATUS = False
   
FINE:
   
End Sub



In pratica, quando incollo, parte la worksheet_change che ripristina i formati salvati nelle celle K2 eK3.
Che dire, sembra che funzioni.

Come al solito... GRAZIE PER LE DRITTE!

MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] - "Dirottare" comando Incolla":


Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti