2015-01-07 20 views
6

Inizierò dicendo che la mia esperienza con Excel e VBA è limitata a ciò che ho visto a scuola. Ho esperienza di programmazione, ma in altre lingue.Excel VBA Come rilevare se qualcosa è stato incollato in un foglio di lavoro

Ho un file che ricevo ogni settimana. La struttura di questo file è sempre la stessa: ID, Nome, Data, Valore compreso tra 1 e 4, dati non rilevanti.

Questi dati vengono selezionati tramite il pulsante "seleziona tutto" (angolo in alto a sinistra del foglio di lavoro, piccolo triangolo sotto il nome della cella in MS excel 2013) e quindi copiati in un altro file predefinito che rielabora i dati per mostrarli e filtrarli in fogli diversi in base al valore 1-4 e alla data.

La mia domanda: Come posso rilevare quando i dati sono stati incollati/incollati? Ho provato l'evento Worksheet.Change, ma il comando paste (CTRL + V) non attiva l'evento Change. Inoltre, come verranno copiati i dati? Aggiornerà riga per riga, cella per cella (quale direzione), ...? So che posso trovare facilmente la risposta all'ultima domanda eseguendo il debug una volta che posso rilevare il comando di copia, ma non si sa mai se qualcuno conosce la risposta.

C'è un altro, più facile (o migliore) modo di farlo?

Ulteriori dati e informazioni possono essere forniti se necessario.

Grazie per il vostro aiuto.

MODIFICA: '... è/viene copiato?' cambiato per incollare come avrebbe dovuto essere.

+0

Perché desideri sapere se i dati sono stati copiati? C'è qualche ragione specifica? Cosa vuoi ottenere? Vuoi popolare questi dati in un'altra cartella di lavoro/foglio di lavoro? –

+0

Hai visto questo: http://www.siddharthrout.com/2011/08/15/vba-excelallow-paste-special-only/? –

+0

@MaciejLos Il motivo è perché le persone che utilizzeranno il file riceveranno una grande lista di dati ogni settimana. Incolleranno questo elenco nel primo foglio di lavoro del file su cui sto lavorando e ho bisogno del file per filtrare i dati rilevanti e visualizzarli in altri fogli di lavoro basati su determinati valori per riga. RE: il tuo altro commento: l'avevo aperto prima della mia interruzione, ma non avevo finito di leggerlo. Al momento sto provando e sembra che faccia ciò che voglio. Pubblicherà la risposta se lo fa. – Nahbyr

risposta

8
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim UndoList As String 

    '~~> Get the undo List to capture the last action performed by user 
    UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1) 

    '~~> Check if the last action was not a paste nor an autofill 
    If Left(UndoList, 5) = "Paste" Then 
    'Do stuff 
    End If 
End Sub 

Questo ha fatto il trucco. Per coloro che hanno bisogno di qualcosa di simile e conoscono la dimensione della loro lista, la risposta di @MaciejLos funzionerebbe anche.

1

Worksheet_Change evento farà il lavoro se si aggiunge una formula in cella che non verrà mai sovrascritta. Diciamo che i dati sono incollati nella cella A1 e occupati 5 colonne. Quindi, immettere sotto formula nella 6. colonna e riga 1.

=COUNTBLANK(A1:A1048576) 

Ora, siete in grado di gestire/rilevare evento paste;)

+0

Funzionerebbe se non fosse per il fatto che non so quanto sarà grande l'elenco di dati che importeranno. Ho trovato una soluzione per il mio problema nel link che hai inviato in precedenza. Pubblicherà il codice. – Nahbyr