Condividi:        

[EXCEL] Filtrare, copiare ed incollare con vba

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] Filtrare, copiare ed incollare con vba

Postdi arondine » 15/01/09 17:50

Innanzitutto un saluto a tutti voi da un nuovo utente.

Ora, fatte le debite presentazioni, arrivo subito al nocciolo della questione, che mi sta facendo tribolare da giorni.

Ho una lista di aziende in un foglio excel. Si tratta di aziende agricole, con indicate alcuni dati, tra cui i riferimenti catastali e la specie coltivata, nonchè la superficie in metri quadri.

Ecco un esempio del foglio di lavoro:

Nome COMUNE Foglio Numero Condotta Coltivata specie
AZIENDA 1 NEW YORK 30 45 67880 67880 Bosco
AZIENDA 1 NEW YORK 30 46 1470 1125 Bosco
AZIENDA 1 NEW YORK 30 49 1370 1370 Bosco
AZIENDA 1 NEW YORK 30 182 116710 51710 Bosco
AZIENDA 1 NEW YORK 30 182 116710 48385 Oliva da trasformazione
AZIENDA 1 NEW YORK 30 46 1470 345 Tare e incolti
AZIENDA 1 NEW YORK 30 182 116710 7000 Tare e incolti
AZIENDA 1 NEW YORK 30 182 116710 9615 Tare e incolti
AZIENDA 2 BOSTON 99 52 550 350 Fabbricati
AZIENDA 2 BOSTON 99 52 550 200 Fabbricati
AZIENDA 2 BOSTON 99 50 9870 1750 Uva da trasformazione
AZIENDA 2 BOSTON 99 50 9870 2100 Erbai misti
AZIENDA 2 BOSTON 99 50 9870 3010 Oliva da trasformazione


Ovviamente i dati sono molti di più

Allora, ecco cosa vorrei fare (utilizzando il vba per poter associare il codice ad un pulsante)

Dovrei estrarre innanzitutto le righe che corrispondono ad una determinata azienda (mettiamo AZIENDA 1).
I dati di questo filtro, (che poi devono essere modificati, soprattutto nelle colonne "specie" e "Coltivata") dovrebbero essere riportati in un altro foglio, già formattato come una specie di report utile solo per essere stampato.

Inoltre, sempre da un'altra parte di tale foglio dovrebbe essere riportato un riepilogo che indichi, per l'azienda filtrata il totale per ogni specie che è coltivata: sempre nel caso dell' AZIENDA 1, il totale a bosco, oliva da trasformazione, ecc ecc.

Ovvio che ogni ditta ha un numero di particelle (e quindi righe) diverso, nonchè anche specie diverse.

Spero di essere stato chiaro.

Qualcuno sa aiutarmi?

Grazie a tutti
arondine
Newbie
 
Post: 6
Iscritto il: 15/01/09 17:17

Sponsor
 

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi Anthony47 » 15/01/09 23:40

Ciao arondine e benvenuto nel forum
Il mio suggerimento e' che ti fai una tabella pivot, che partendo dai dati analitici ti produca una tabella di sintesi dei dati che vuoi ottenere.
Posizionerai la tabella pivot sul foglio formattato per il report, poi potrai selezionare tramite menu' a discesa di quale /quali Azienda/Aziende vuoi visualizzare i dati, ed eventualmente per quale Specie.
A spanne, per ottenere una tabella pivot significativa:
-Selezioni tutte le colonne con i dati, accertandoti che ogni colonna abbia una intestazione
-Menu /Dati /Rapporto tabella pivot; Avanti, Avanti; Layout
-Trascini il campo Nome nell' area Riga
-Trascini il campo Specie nell' area Riga, in seconda posizione
-trascini il campo Coltivata nell' area Dati, accertandoti che venga visualizzato come Somma di Coltivata (non, ad esempio Conta di..); se non e' Somma di.., doppioclick sulla scritta, scegli Somma dall' elenco, Ok.

Puoi inserire altri campi in tabella, ad esempio:
-trascina ancora il campo Coltivata, ma questa volta con la scelta "Conta di", in modo da avere anche il conteggio di quante righe appartengono a quella azienda per quella specie.

Completato il Layout, scegli di inserire la tabella in un "Foglio di lavoro esistente", quindi selezioni il foglio gia' formattato per il report, confermi con Ok.

La tabella di riepilogo puo' essere formattata secondo vari modelli; trovi il pulsante "Formatta rapporto" nella barra degli strumenti "Tabella pivot".

Il campo Nome nel rapporto avra' un menu' a tendina con cui puoi scegliere quale/quali nome/nomi vuoi visualizzare; se ti serve considera che si puo' automatizzare con una macro la selezione di un Nome, o si puo' ottenere un loop per selezionare una dopo l' altra tutte le Aziende listate; questa seconda opzione ad esempio potrebbe consentire la stampa in automatico di N rapporti uguali (a parte i dati della tabella pivot, che ovviamente sono specifici), uno per Azienda.

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

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi arondine » 16/01/09 16:58

Avevo pensato anche io ad una tabella pivot, ma essendo un file da far utilizzare anche da chi ne mastica poco di funzioni e tabelle excel, optavo proprio per un codice che svolgesse onestamente il suo lavoro e facilitasse l'utilizzo anche ai meno esperti.

Ho provato a tirarlo giù sto benedetto codice, e, ovviamente non funziona.

Mi da il seguente errore:
di run-time '1004': errore definito dall'applicazione o dall'oggetto

Ecco comunque il codice. L'sitruzione che mi segnala quando genera l'errore è :
Worksheets("Piani Colturali").Range("A" & a).Select


Codice: Seleziona tutto
Private Sub Filtra()

' incominco a definire le variabili contatori di riga e stringa
Dim n As Long
Dim k As Long
Dim contrig As Long
Dim a As String
' ora definisco quale deve essere il testo che deve ricercare nella colonna nome azienda
'(in pratica la colonna A del foglio Piani Colturali)

Worksheets("Lavorazione").Range("b1").Value = a

' Adesso cerchiamo di andare a cercare quella ditta che indicata nella cella B2 del foglio "Lavorazione"
' con il contatore n scorro le righe fino a che non trovo quella della ditta che mi serve

For n = 2 To 65536
Worksheets("Piani Colturali").Range("A" & a).Select
If ActiveCell = a Then Exit For
If ActiveCell <> a Then n = n + 1
Next


' trovata la ditta, incomincia a copiare e incollare la riga attiva in altra posizione
' fino a che non terminano i dati di questa ditta. Ecco il ciclo della variabile k

contrig = 2
For k = n To 65536
Worksheets("Piani Colturali").Range("A" & k).Select
If ActiveCell <> a Then Exit For
Activerow.Selection.Copy
Worksheets("Lavorazione").Range("A" & contrig).PasteSpecial xlPasteValues
contrig = contrig + 1
k = k + 1
Next

'ed ecco fatto

End Sub



Allora, chi sa aiutarmi a trovare l'errore??

Grazie.
arondine
Newbie
 
Post: 6
Iscritto il: 15/01/09 17:17

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi Tribuno » 16/01/09 17:58

Ciao arondine,

dopo che hai dichiarato come stringa la variabile a, non le hai dato alcun valore, infatti con
Worksheets("Lavorazione").Range("b1").Value = a

hai dato il valore a, attualmente nullo, alla cella b1 del foglio "Lavorazione". Non dovresti assegnare alla variabile a il valore della cella b1 del foglio "Lavorazione"?

Infatti quando con l'istruzione
Worksheets("Piani Colturali").Range("A" & a).Select

vuoi selezionare la cella A & a, essendo a senza valore ti da errore; oltretutto hai dichiarato a come stringa ed anche se avesse un valore ti darebbe errore.

Oppure dovevi utilizzare l'istruzione
Worksheets("Piani Colturali").Range("A" & n).Select
???

Ciao
Tribuno
Avatar utente
Tribuno
Utente Senior
 
Post: 181
Iscritto il: 22/08/08 19:24

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi Anthony47 » 17/01/09 01:01

Ciao Tribuno, bentornato.
Condivido ambedue le tue ipotesi:
-il valore di B1 (forse l' azienda da cercare) da mettere in variabile a e non viceversa
-l' uso di & n (e non & a) nella riga che va in errore.
Quindi le istruzioni corrette potrebbero essere
Codice: Seleziona tutto
a = Worksheets("Lavorazione").Range("b1").Value
Worksheets("Piani Colturali").Range("A" & n).Select

Aggiungo anche che Activerow.Selection.Copy non e' una istruzione valida (non esiste Activerow); probabilmente si vuole copiare tutta la riga corrente, che si puo' fare con
Codice: Seleziona tutto
ActiveCell.EntireRow.copy


Insisto con arondine perche' valuti l' ipotesi della tabella pivot; la tabella viene solo "usata" dagli utenti del foglio dopo che e' stata impostata e corredata di macro.
A livello di prova, genera (non sul foglio del report ma su un nuovo foglio) una tabella pivot alimentata dai tuoi dati, poi fai doppioclick su uno dei risultati: ti si aprira' un nuovo foglio con l' elenco delle righe che corrispondono a quella sintesi.
Bene, considera che con la macro che segue puoi:
-dopo esserti selezionato su un campo valido della tabella pivot
-generare l' analitico corrispondente
-copiarlo sul foglio report (?), con l' istruzione Worksheets("Lavorazione").Range("A" & contrig) presa dalla tua macro
Codice: Seleziona tutto
Sub PvtExpd()
'
SWs = ActiveSheet.Name
contrig = 2
On Error Resume Next
Selection.ShowDetail = True
If ActiveSheet.Name = SWs Then
MsgBox ("Non e' stata creata un foglio riepilogo, controllare la selezione e ripetere")
Exit Sub
End If
On Error GoTo 0
Selection.Copy Destination:=Worksheets("Lavorazione").Range("A" & contrig)
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
Sheets(SWs).Select
End Sub


Se il principio ti quadra si puo' inserire qualche ulteriore automazione, ad esempio l' aggiornamento automatico della tabella pivot quando selezioni il foglio che la contiene; per questo servira' una macro di Worksheet_Activate che contiene il codice ottenuto registrando una macro mentre si comanda l' aggiornamento della tabella pivot.

Spero che lo spunto ti sia utile.
Ciao, fai sapere.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi Tribuno » 18/01/09 09:25

Anthony47 ha scritto:Ciao Tribuno, bentornato.
........


Ciao Anthony e grazie, purtoppo ho avuto un mese molto pieno, adesso che mi sono liberato da questo peso (preparazione di un concorso) ho un po' di tempo in più.
Ciao e a presto.

Per arondine: concordo con Anthony sull'uso della pivot, magari associata al filtro avanzato, in modo tale da avere nello stesso foglio sia l'elenco filtrato sia un riepilogo dei dati stessi.

Ciao
Tribuno
Avatar utente
Tribuno
Utente Senior
 
Post: 181
Iscritto il: 22/08/08 19:24

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi arondine » 20/01/09 15:55

Tribuno ha scritto: Per arondine: concordo con Anthony sull'uso della pivot, magari associata al filtro avanzato, in modo tale da avere nello stesso foglio sia l'elenco filtrato sia un riepilogo dei dati stessi.

Ciao
Tribuno


grazie per le risposte.

Ho provato a fare la tabella pivot, ma non ottengo risultati che vorrei (sicuramente sono io che sbaglio!).

Se vuoi , posso mandarti il file di esempio in questione, con il foglio "report" che ti dicevo, perchè forse è più facile da capire.

ora comunque riprovo a seguire i suggerimenti che mi avete dato riguardo il visual basic...casomai vi faccio sapere.
arondine
Newbie
 
Post: 6
Iscritto il: 15/01/09 17:17

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi arondine » 20/01/09 16:16

Allora ragazzi, pare che funzioni abbastanza bene.

Ecco cosa ho corretto del codice vba

Innanzitutto quello che mi avevate suggerito voi :

Codice: Seleziona tutto
a = Worksheets("Lavorazione").Range("b1").Value


invece di

Worksheets("Lavorazione").Range("b1").Value = a


Poi, sono andato a guardare la fase del contatore con la variabile n che doveva servire per cercare la ditta su cui lavorare, ed ecco che avevo erroneamente associato la variabile a (che è appunto una stringa) anciche quella giusta (n) relativa al ciclo for..next.

Ed ecco il codice giusto
Codice: Seleziona tutto
For n = 2 To 65536
Sheets("Piani Colturali").Select
Range("A" & n).Select
If ActiveCell = a Then Exit For
If ActiveCell <> a Then n = n + 1
Next


L'errore mi veniva generato perchè invece di mettere il codice del suddetto ciclo
Codice: Seleziona tutto
Sheets("Piani Colturali").Select
Range("A" & n).Select
era messo come
Codice: Seleziona tutto
Worksheets("Piani Colturali").Range("A" & a).Select
.

E così ho risolto.

ma sapete spiegarmi perchè Con Worksheets non funzionava, e mi dava quel fastidioso errore di debug 1004, e con sheets invece si? Quel è la differenza?

Infine, ora vorrei mettere avanti a questo codice di copia incolla, un'altra routine che mi i valori di tutte le celle che in questo foglio "lavorazione" contengono valori relativi al precedente filtraggio.

Qualche suggerimento?

E grazie ancora!
arondine
Newbie
 
Post: 6
Iscritto il: 15/01/09 17:17

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi Anthony47 » 21/01/09 00:57

Non mi e' chiaro quale istruzione ti dava errore, se era Worksheets("Piani Colturali").Range("A" & a).Select allora c' erano due motivi:
1) "A" & a che non restituiva un indirizzo valido
2) il tentativo di select su una cella non del foglio corrente
Infatti la soluzione e' stata spezzare su due linee (oltre che correggere a in n)

Se non fosse come l' ho descritta, posta ancora.

Per l' altra domanda:
Infine, ora vorrei mettere avanti a questo codice di copia incolla, un'altra routine che mi i valori di tutte le celle che in questo foglio "lavorazione" contengono valori relativi al precedente filtraggio.
purtroppo non ho capito bene, prova e ridescrivere.

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

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi arondine » 21/01/09 09:49

Anthony47 ha scritto:
Infine, ora vorrei mettere avanti a questo codice di copia incolla, un'altra routine che mi i valori di tutte le celle che in questo foglio "lavorazione" contengono valori relativi al precedente filtraggio.
purtroppo non ho capito bene, prova e ridescrivere.

Ciao.


Mi era sfuggita una parola. In pratica vorrei che ogni volta che filtro copio incollo con il presente codice, prima di farlo, mi vengano cancellati i dati relativi all'azienda precedente.
arondine
Newbie
 
Post: 6
Iscritto il: 15/01/09 17:17

Re: [EXCEL] Filtrare, copiare ed incollare con vba

Postdi Anthony47 » 21/01/09 12:27

Mi pare che quello che trovi lo copi poi su foglio "Lavorazione" da A2 in giu'.
Puoi azzerare quest' area con qualcosa come
Codice: Seleziona tutto
Worksheets("Lavorazione").Range("A2:A10000").Clearcontents
La metterai come prima istruzione del "ciclo della variabile k".
Come vedi pulisce in modo poco sofisticato fino ad A10000; puoi variare l' area modificando quel 10000 (es se sotto i dati che importi hai altre cose gia' scritte che vuoi conservare) o modificando A10000; ad esempio se vuoi pulire da col A a col D scriverai "A2:D10000".

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


Torna a Applicazioni Office Windows


Topic correlati a "[EXCEL] Filtrare, copiare ed incollare con vba":


Chi c’è in linea

Visitano il forum: Ricky0185 e 42 ospiti