Condividi:        

[Excel] Ricerca Doppioni e Ricopia Dati

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] Ricerca Doppioni e Ricopia Dati

Postdi sax » 02/03/07 00:02

Ho provato a creare una macro in VBA con scarsi risultati il mio problema è il seguente

ho una lista di nominativi nel file "Modello"

Data A7
Cognome nel range A15:A44
Nome nel Range D15:D44


la macro dovrebbe verificare quanti doppioni ci sono nella lista, prelevare i nominativi, copiarli in un altro File "Riepilogo" ed inserire
nella colonna A il cognome, nella colonna B il nome e nelle colonne vicine (in corrispondenza delle date inserite nella riga 1)
il numero di doppioni, il tutto per creare uno schema tipo Il Diagramma Gant del programma Project ma più semplficato come nel file di esempio ch eho inviato
Il file Modello Viene Generato ogni giorno quindi ogni giorno il file dovra copiare i dati con la data differente nel file "Riepilogo".
la data nel file Riepilogo, se possibile, si dovrebbe creare automaticamente all'attivazione della macro prelevandola dal file Modello.
Il File modello Può assumere anche altri nome file in quando ha all'interno delle macro che gli fanno assumere un altro nominativo
Ho allegato un file per essere più chiaro
http://freefilehosting.net/download/MTEzODUy

Grazie
Sax
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Sponsor
 

Postdi Anthony47 » 04/03/07 23:50

Ciao Sax,
mi sembra, dal Modello e Riepilogo che hai pubblicato, che il problema non sia limitato a contare i doppioni ma contare tutte le occorrenze di un certo nominativo (che e’ anche piu’ semplice del contare i doppioni); se cosi’ non fosse non capisco tutti quegli 1 che ci sono nel Riepilogo sotto le date 28-Feb e 1-Mar; salvo che poi al 2-Mar non si vedono piu’ ne’ gli “1” ne’ i “2”. Puoi chiarire?
Sempre nel Riepilogo, c’ e’ un “Somma presenze” che e’ palesemente la somma tra tutti i valori in tabella, e poi un “Totale giorni” che immagino sia il conteggio di quante volte quel nominativo ha una o piu’ presenze. Puoi confermare?
Infine, come sempre quando non "afferro", raccomando di descrivere “che cosa” si vuole fare, non solo “come” si pensa di farlo: a volte si puo’ aiutare ancora di piu’.
Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi sax » 05/03/07 12:38

Ciao Anthny48
e grazie per l'interessamento
se ci fai caso nella lista presente nel MODULO nelle celle A15 D15
di "Alfredo - Da Vinci" il 28 02 07 ce ne sono solo 3
invece di "Alfredo - Fernando" sempre nella stessa data ve ne è 1 solo
di "Emanuele -Fernando" ce ne sono 2
ecc
nella data 01 03 07 vi era presente solo 1 "Alfredo - Da Vinci"
nella data 02 03 07 vi erano 3 "Alfredo - Fernando" e 4 "Emanuele - Giobbe"

Sempre nel Riepilogo, c’ e’ un “Somma presenze” che e’ palesemente la somma tra tutti i valori in tabella, e poi un “Totale giorni” che immagino sia il conteggio di quante volte quel nominativo ha una o piu’ presenze. Puoi confermare?


Nel Riepilogo vi è una somma e serve a sommare tutte le celle che avranno i doppioni e un totale giorni che è il conteggio di qunte volte quel nominativo ha più presenze

Ovviamente nel Modulo Cambierà ogni giorno la data e le persone quindi nel riepilogo si dovranno inserire i doppioni nella data esatta se è presente o creare una colonna con la nuova data

Probabilmente adesso è più chiaro tutto
Saluti
Sax
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi Anthony47 » 06/03/07 01:49

Allora io propongo di procedere in questo modo:
1)-Nel file RIEPILOGO crei un foglio “Analitico” che sara’ popolato con i dati prelevati dai singoli Modelli. Intesti su riga 1 la colonna A con ”Nominativo” e la B con “Data”.
2)-Per importare i dati useremo la seguente macro, che inserirai su Modulo2 del vba:
Codice: Seleziona tutto
Sub popola()
ThisWorkbook.Activate
Sheets("Analitico").Select
Imp_Da = "Modello.xls"                          ‘<<<<<--- CAMBIARE SE NECESSARIO
'Summary_Wb = ActiveWindow.Caption
Windows(Imp_Da).Activate

Range("A1").End(xlDown).Select
Data_Mod = Selection.Value

Selection.End(xlDown).Select
Prima_Riga = Selection.Row
Last_Row = Range("A65536").End(xlUp).Row

For I = Prima_Riga - 1 To Last_Row
Application.ScreenUpdating = False
Windows(Imp_Da).Activate
C_val = Range("A1").Offset(I, 0).Value & " - " & Range("A1").Offset(I, 3).Value  ‘<<<<< Vedi NOTA
ThisWorkbook.Activate
Range("A65536").End(xlUp).Offset(1, 0).Activate
ActiveCell.Value = C_val
ActiveCell.Offset(0, 1).Value = Data_Mod
Next I

Application.ScreenUpdating = True
Sheets("Riepilogo").Select
ActiveSheet.PivotTables("Tabella_pivot1").PivotCache.Refresh
End Sub

Eventualmente assegna un tasto di scelta rapida alla macro.
NOTA: la macro riportera’ sul file RIEPILOGO.xls, nel foglio Analitico, i nominativi in formato “Nome – Cognome”; se si preferisce il formato “Cognome – Nome” modificare l’ istruzione evidenziata in
Codice: Seleziona tutto
C_val = Range("A1").Offset(I, 3).Value & " - " & Range("A1").Offset(I, 0).Value


3)-Apri il file Modello e lancia la macro Popola(); la macro andra’ in errore alla fine perche’ non c’ e’ ancora la tabella pivot: dai Fine per terminare.
4)-Pulisci completamente il foglio Riepilogo del file RIEPILOGO.xls
5)-Vai sul foglio Analitico, seleziona le colonne A:B, e attiva un Rapporto tabella pivot; come layout sceglierai:
>nell’ area Righe: Nominativo
>nell’ area Colonne: Data
>nell’ area Dati: “Conteggio di” Data
>Chiudi il layout con Ok
>Scegli di generare la tabella sul foglio Riepilogo, a partire dalla cella C3; termina con Ok.

6)-Clicca col tasto dx nella tabella, seleziona “Opzioni tabella”, togli la spunta alle voci “Totali complessivi per colonne” e idem “per righe”, togli anche la spunta a “Salva i dati con il layout della tabella” e mettila su “Aggiorna all’ apertura”. Chiudi con Ok.

A questo punto dovrebbe aver calcolato le occorrenze di ogni nominativo sotto la colonna Data, e la tabella sara’ aggiornata man mano che nei giorni successivi altri elenchi verranno importati; per vedere l’ effetto, puoi ripetere piu’ volte l’ importazione da macro dello stesso file, cambiando a mano la data del foglio Modello, a simulare piu’ giorni di dati.

Nelle colonne A e B calcoleremo Somma presenza e Totale giorni; poiche’ il primo nominativo dovrebbe essere in C5, scriveremo in A5 la formula
Codice: Seleziona tutto
=SE(C5="";"";SOMMA(D5:IV5))
e in B5
Codice: Seleziona tutto
=SE(C5="";"";CONTA.SE(D5:IV5;">0"))

Copia queste due formule e incollale in verticale per un numero sufficiente di righe, tenendone qualcuna di riserva.
Inserisci i titoli di colonna A e B e se vuoi abbellisci con le fincature.

Per assicurarsi che le date uscirano in ordine crescente, attiva la visualizzazione del layout, poi doppioclick sulla voce Data (nell’ area Colonne), scegliere “Avanzate”, scegliere “Crescente” e come Campo da utilizzare seleziona Data; chiudi con Ok, Ok; se vuoi, ripeti l’ operazione per ordinare anche i Nominativi in ordine crescente.

Cosi’ ti puo’ andare?

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

Postdi sax » 06/03/07 15:28

Ok
La Macro che mi hai proposto collegata con la tabella pivot funziona perfettamente,
ho dovuto modificare qualcosa, che forse sta creando qualche problema.
intanto ho fatto in modo che la macro sia sul file modello, apra il file riepilogo e poi lo richiuda, poi ho definito esattamente le celle del file modello che interessano, in quanto nel file che utilizzo vi sono altre celle piene e quindi il risultato non era proprio quello corretto.
il primo problema che mi si è presentato è che il risultato delle due celle unite (per intenderci la variabile C_val ) presenta solo la colonna A
il secondo problema, ma questo se non sbaglio mi si è presentato anche prima di modificarlo è che alcune celle presentavano solo il trattino, probabilmente perchè le celle vuote in reatà non sono vuote ma il risultato di altre macro

Codice: Seleziona tutto
Sub popola()

Workbooks.Open Filename:="s:\Ricerca Doppioni\Riepilogo.xls"

Sheets("Analitico").Select

ThisWorkbook.Activate

Range("A7").Select
Data_Mod = Selection.Value

Range("A14").Select
Prima_Riga = Selection.Row
Last_Row = Range("A44").Row

For I = Prima_Riga - 1 To Last_Row
Application.ScreenUpdating = False
ThisWorkbook.Activate
C_val = Range("A1").Offset(I, 0).Value & " - " & Range("A1").Offset(I, 3).Value

Windows("Riepilogo Trasferte.xls").Activate

Range("A65536").End(xlUp).Offset(1, 0).Activate
ActiveCell.Value = C_val
ActiveCell.Offset(0, 1).Value = Data_Mod
Next I

Application.ScreenUpdating = True
Sheets("Riepilogo").Select
ActiveSheet.PivotTables("Tabella_pivot1").PivotCache.Refresh

    Windows("Riepilogo Trasferte.xls").Activate
    ActiveWorkbook.Save
    ActiveWindow.Close
End Sub

inoltre ho notato che le celle dei nomi del modello hanno degli spazi dopo il nome, si puo fare in modo che si eliminino?
Grazie

Sax
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi Anthony47 » 06/03/07 20:07

Bene le modifiche al codice per adattarlo alle esigenze.
Ho capito che hai messo la macro nel file Modello; mentre non ho capito se il secondo file si chiama “Riepilogo.xls” o “Riepilogo trasferte.xls”, visto che usi ambedue i nomi nelle istruzioni; ??
Per i problema
il risultato delle due celle unite (per intenderci la variabile C_val ) presenta solo la colonna A

L’ istruzione C_val = etc etc concatena la colonna A, il “trattino”, la colonna D; non mi vengono idee sul perche’ possa mancare il “trattino” o la cella D. Eventualmente commenta (con un “apostrofo” a inizio linea) l’ istruzione Application.ScreenUpdating = False ed esegui passo passo (F8 per eseguire uno step; F9 per mettere e togliere break; F5 per eseguire fino al break o fino alla fine).
Poi dici:
alcune celle presentavano solo il trattino, probabilmente perchè le celle vuote in reatà non sono vuote ma il risultato di altre macro

Questo possiamo gestirlo inserendo nel ciclo For/Next il controllo sulla lunghezza del contenuto della colonna A:
Codice: Seleziona tutto
For I = Prima_Riga - 1 To Last_Row
If Len(Range("A1").Offset(I, 0).Value) = 0 then Goto skippa   '<<< Aggiunta 1

E poi:
Codice: Seleziona tutto
skippa:                      '<<< Aggiunta 2
Next I
Windows("Riepilogo Trasferte.xls").Activate            '<<< Aggiunta 3 (dubbio sul nome file!)


Infine
ho notato che le celle dei nomi del modello hanno degli spazi dopo il nome, si puo fare in modo che si eliminino?

Usa
Codice: Seleziona tutto
C_val = Trim(Range("A1").Offset(2, 0).Value) & " - " & Trim(Range("A1").Offset(2, 3).Value)



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

Postdi sax » 07/03/07 08:16

Va Molto Meglio
Ho cambiato l'istruzione IF
Codice: Seleziona tutto
C_val = Trim(Range("A1").Offset(I, 0).Value) & " - " & Trim(Range("A1").Offset(I, 3).Value)
If C_val = " - " Then GoTo skippa   '<<< Aggiunta 1

in modo tale che se la variabile c_val assumeva quel valore " - " skippava
invece il modo chemi avevi consigliato tu non so il perchè non funzionava bene probabilmente perchè le celle assumono dei valori anche se vuoti il trim probabilmente elimina quegli spazi ed il risultato è accettato dall'istruzione logica if.

invece per quanto riguarda la colonna "D"non viene vista!!
l'istruzione Offset, se non ho capito male con valore (I,0) prende come riferimento la prima colonna a partire dalla riga 14, mentre (I,3) prende la quarta, quindi la "D" ?

Grazie
Sax
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi sax » 07/03/07 11:18

Anthony48 Grazie mille per tutto
ho risolto il problema nel seguente modo
Codice: Seleziona tutto

C_ditta = Trim(Range("A1").Offset(I, 0).Value)
C_dest = Trim(Range("D1").Offset(I, 0).Value)

C_val = C_ditta & " - " & C_dest
C_ditta = Trim(Range("A1").Offset(I, 0).Value)
C_dest = Trim(Range("D1").Offset(I, 0).Value)


Sax
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi sax » 07/03/07 11:20

ops Anthony47
sax
Utente Junior
 
Post: 93
Iscritto il: 20/05/06 19:34

Postdi Anthony47 » 07/03/07 19:12

Hai saggiamente risolto il controllo delle celle vuote e aggirato lo strano problema del .Offset(I, 3), che continuo a pensare dovrebbe puntare alla colonna D.

Ciao, alla prossima.
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Ricerca Doppioni e Ricopia Dati":


Chi c’è in linea

Visitano il forum: raimea e 16 ospiti