Separa per Luogo



  • Separa per Luogo
    di Mick (utente non iscritto) data: 24/12/2015 15:27:48

    Ciao a tutti,

    vi chiedo cortesemente un aiuto:

    E' possibile creare una macro che partendo da una lista con nome, cognome, età e luogo di nascita, mi crei un elenco in foglio2 di tutte le persone nate in una città. Cioè, tipo se le persone sono nate a Milano, in Foglio2 mi riporti nome,cognome, età luogo di nascita?

    Ho provato ad allegare un file per cercare di farmi capire meglio!

    Grazie!



  • di mabolsie data: 24/12/2015 15:43:35

    Ciao Mick, si si può fare, allora io farei cosi : con un ciclo FOR EACH scansiono, confrontando la variabile dichiarata per il ciclo con la colonna dove c'è il valore da trovare se la variabile del ciclo trova nella cella il valore di confronto uguale scatena una condizione IF THEN nella quale c'è il codice che copia i valori che vuoi e li incolla nel foglio che vuoi.
    Chiaro ?, buon lavoro.

    Ciao Max



  • di Mick (utente non iscritto) data: 24/12/2015 16:00:23

    Ciao,

    onestamente non sono granchè nello scrivere codice: Inizio con una cosa del genere:

    Sub PROVA()
    Worksheets("Foglio2").Name = "MILANO"
    Worksheets("Foglio3").Name = "GENOVA"

    For Each cell In Worksheets("Foglio1").[D:D]
    If cell = "MILANO" Then



    End Sub



  • di alfrimpa data: 24/12/2015 17:15:19

    Ciao Miki

    Potresti provare con la sottostante macro inserita nel file (MIki.xlsm che ho allegato) avendo cura di creare preventivamente tanti fogli quante sono le città.

    Questo è solo un primo approccio da adattare poi alle tue reali necessità.

    Fai sapere.

    Alfredo 
     
    Sub Macro1()
    Dim rng As Range
    Dim cel As Range
    Dim ur As Long
    Dim lr As Long
    Dim FGL As String
    Set rng = Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).Row)
    For Each cel In rng
        FGL = cel.Offset(0, 3).Value
        ur = Worksheets(FGL).Cells(Rows.Count, 1).End(xlUp).Row
        Range("A" & cel.Row & ":" & "d" & cel.Row).Copy Destination:=Worksheets(FGL).Range("A" & ur + 1)
    Next cel
    End Sub






  • di Mick (utente non iscritto) data: 24/12/2015 17:34:02

    Ciao, ...e grazie!

    Ti chiedo una cosa: Io per una serie di motivi avrei proprio bisogno di inserire un codice del genere,
    For Each cell In Worksheets("Foglio1").[D:D]

    If cell = "MILANO" or
    If cell = "ROMA" ecc.
    Then
    proprio perchè devo inserire un pò di nomi di città...
    Praticamente se le celle hanno un determinato nome di città allora devo andare a copiarle in foglio2...

    E' possibile inserire questo nella macro?



  • di alfrimpa data: 24/12/2015 17:41:08

    Ciao Mick

    Io adotterei un altro approccio.

    Sempre tramite macro mi creerei un elenco univoco di città poi sulla base di questo elenco aggiungerei tanti fogli denominati ciascuno con il nome della città e poi proseguirei con la macro che ho postato prima.

    Solo che in questo periodo natalizio è un po' difficile trovare un po' di tempo......

    Appena posso cerco di farlo.

    Alfredo





  • di Mick (utente non iscritto) data: 24/12/2015 17:47:50

    Grazie dell'aiuto. Gentilissimo.

    Io intanto provo ad andare avanti a buttare giù qualcosa.

    Ciao!



  • di alfrimpa data: 25/12/2015 12:32:35

    Ciao Mick

    Ti ho allegato file (Mick2.xlsm) nel quale ho inserito la sottostante macro che:

    1) Dalla colonna D del Foglio1 estrae l'elenco delle città univoche (ossia prese una sola volta).
    2) Aggiunge alla cartella tanti fogli quanti sono queste città e ad ognuno di essi dà il nome della citta
    3) Effettua la suddivisione dei nominativi del foglio1 e li smista sui relativi fogli di pertinenza.

    Ovviamente quando si lancia la macro nella cartella di lavoro ci deve essere solo il foglio1 (volendo si può modificare la macro inserendo nuovo codice affinché ogni volta che la si lancia prima di creare i nuovi fogli elimini quelli precedenti tranne il foglio1).

    Fai sapere

    Alfredo   
     
    Sub SuddividiPerFogli()
    Dim i As Integer
    Dim CL As Range, Intervallo As Range, Elenco As New Collection
    Dim Valori As Variant
    Dim rng As Range
    Dim cel As Range
    Dim ur As Long
    Dim lr As Long
    Dim FGL As String
    Worksheets("Foglio1").Select
    Set Intervallo = Range("d1", Range("d1").End(xlDown))
    On Error Resume Next
    For Each CL In Intervallo
        Elenco.Add CL.Value, CStr(CL.Value)
    Next
    On Error GoTo 0
    For i = 1 To Elenco.Count
        ThisWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
    Next
    For i = 1 To Elenco.Count
        Sheets(i + 1).Name = Elenco(i)
    Next i
    For i = 2 To Sheets.Count
        Sheets(i).Cells(1, 1).Value = "NOME"
        Sheets(i).Cells(1, 2).Value = "COGNOME"
        Sheets(i).Cells(1, 3).Value = "ETA"
        Sheets(i).Cells(1, 4).Value = "LUOGO"
    Next i
    Worksheets("Foglio1").Activate
    Set rng = Range("a1:a" & Cells(Rows.Count, 1).End(xlUp).Row)
    For Each cel In rng
        FGL = cel.Offset(0, 3).Value
        ur = Worksheets(FGL).Cells(Rows.Count, 1).End(xlUp).Row
        Range("A" & cel.Row & ":" & "d" & cel.Row).Copy Destination:=Worksheets(FGL).Range("A" & ur + 1)
    Next cel
    End Sub
    






  • di Mick (utente non iscritto) data: 25/12/2015 15:12:31

    Ciao, io ti ringrazio...però voglio provare a chiederti un ulteriore cortesia:
    Mettiamo che io debba separare le citta solo per Città Italiana (Foglio2) o Città Straniera (Foglio3).
    E' possibile inserire nella Macro una specie di codice del tipo:
    Sheets("Foglio2").Name = "CITTA' ITALIANA"
    Sheets("Foglio3").Name = "CITTA' ESTERA"
    For Each cell In Worksheets("Foglio1").[D:D]
    If cell = "MILANO" or cell = "GENOVA" or cell = "BARI" or cell = "PAVIA"
    then "vado a copiare le celle in uno dei 2 fogli"
    Ovviamente dovrei io prima inserire nel codice tutti i nomi delle città, so che sto riducendo tutto il lavoro che mi hai proposto, ma per una serie di motivi ho capito che è preferibile agire così.

    Ancora Grazie!



  • di alfrimpa data: 25/12/2015 15:41:22

    Quindi tu devi raggruppare le città italiane in un foglio e quelle straniere in un altro?

    Se è così dovresti aggiungere a fianco delle città una colonna che ti indichi se la città è straniera oppure italiana e sulla base di quest'ultima operare la suddivisione.

    In questo caso le cose si semplificano notevolmente.

    Ho capito bene?

    Alfredo

    P.S. Magari se ti costruisci una tabella di tutte le città con a fianco indicato se trattasi di italiana o straniera con un CERCA.VERT sul foglio1 puoi ricavare il relativo dato per ogni città (non so se sono stato chiaro).





  • di Mick (utente non iscritto) data: 25/12/2015 16:14:30

    ...più che altro , io vorrei proprio inserire direttamente nella Macro i nomi delle città anche se l'idea di aggiungere la colonna è corretta. Praticamente mi viene fornito un xls con diciamo una ventina di nomi di città (nel mio caso son sempre quelle) e preferirei non aggiungere una colonna, anche perchè so che i nomi delle città saran sempre quelle di volta in volta e quindi potrei inserirle direttamente nella macro.
    Praticamente mi piacerebbe proprio fare così (non so se la sintassi è corretta):
    For Each cell In Worksheets("Foglio1").[D:D]
    If cell = "MILANO" or cell = "GENOVA" or cell = "BARI" or cell = "PAVIA" (inserisco tutti i nomi delle città italiane)
    then copiare il "record" in "CITTA' ITALIANA",
    else copiare il "record" in CITTA' STRANIERA".



  • di alfrimpa data: 25/12/2015 16:28:17

    Ciao Mick

    Non è necessario inserire tutte le città nella macro.

    Se sono sempre le stesse puoi postare l'elenco delle città qui?

    Poi cercherò di costruire il tutto sulla base di questo elenco.

    Ti aspetto.

    Alfredo





  • di Mick (utente non iscritto) data: 25/12/2015 16:44:39

    Ciao!

    Le città italiane sono MILANO, GENOVA, BARI, PAVIA, TRENTO, ROMA, NAPOLI, PALERMO, CAGLIARI, UDINE, TORINO, BOLZANO, VERONA, CREMONA, LECCO, MONZA.
    Le città straniere sono solo LONDRA, BERLINO E MADRID.
    Se riesci a darmi solo l'incipit per partire e soprattutto come copiare "i record" nei fogli poi cerco di arrangiarmi, non perdere troppo tempo per me...

    Grazie!



  • di alfrimpa data: 28/12/2015 12:44:56

    Ciao Mick

    Perdona il ritardo ma riprendersi dalle abbuffate natalizie non è impresa facile

    Comunque ti ho allegato nuovo file (Mick3.xlsm) dove, con la sottostante macro viene effettuata la suddivisione tra città italiane ed estere.

    Fai sapere se era quello che volevi.

    Alfredo  
     
     1 Sub Macro1()
     2 Dim rng As Range
     3 Dim cel As Range
     4 Dim ur As Long
     5 Dim lr As Long
     6 Set rng = Range("D1:D" & Cells(Rows.Count, 1).End(xlUp).Row)
     7 Application.ScreenUpdating = False
     8 For Each cel In rng
     9   lr = Worksheets("ESTERE").Cells(Rows.Count, 1).End(xlUp).Row
    10  ur = Worksheets("ITALIANE").Cells(Rows.Count, 1).End(xlUp).Row
    11  If cel.Value = "LONDRA" Or cel.Value = "BERLINO" Or cel.Value = "MADRID" Then
    12      Range("A" & cel.Row & ":" & "d" & cel.Row).Copy Destination:=Worksheets("ESTERE").Range("A" & lr + 1)
    13      Else
    14      Range("A" & cel.Row & ":" & "d" & cel.Row).Copy Destination:=Worksheets("ITALIANE").Range("A" & ur + 1)
    15  End If
    16 Next cel
    17 Application.ScreenUpdating = True
    18 MsgBox "Operazione effettuata"
    19 Set rng = Nothing
    20 Set cel = Nothing
    21 End Sub
    






  • di Mick (utente non iscritto) data: 28/12/2015 16:56:25

    ...beh ERA PROPRIO QUELLO CHE VOLEVO!!! Non posso che ringraziarti.
    Per una persona che sta provando a capirci qualcosa ...ed è molto lontana dal riuscirci ti chiedo anche: Potresti spiegarmi praticamente come funziona la Macro?
    Application.ScreenUpdating = False e True ho capito a cosa serve.
    Set rng = Range("D1:D" & Cells(Rows.Count, 1).End(xlUp).Row) // Inserisce di volta in volta nella variabile rng il valore della colonna D?
    Ma lr e ur?
    Praticamente ti chiedo se mi puoi "tradurre in italiano" la Macro per vedere se riesco ad arrangiarmi. In caso di modifiche del file originale mi piacerebbe essere in grado autonomamente di inserire delle modifiche.

    Ciao!



  • di alfrimpa data: 29/12/2015 10:43:05

    Ciao Mick

    Cercherò di essere il più chiaro possibile.

    Le istruzioni dalla 2 alla 5 sono sono le dichiarazioni delle variabili; in vba oltre ai classici tipi di variabili (Integer, Long, Double, String etc.) è possibile avere della variabili oggetto come Range, Worksheet ove è possibile memorizzare interi oggetti di Excel come intervalli, fogli o anche intere cartelle di lavoro.

    Le variabili si impostano in due modi; se non sono variabili oggetto si usa la sintassi:

    nome variabile = istruzioni

    diversamente si utilizza il comando Set in questo modo

    Set nomevariabile = istruzioni

    Con la istruzione n. 6 faccio proprio questo; memorizzo nella variabile oggetto rng l'intervallo che va dalla cella D1 all'ultima cella piena della colonna D.

    Con l'istruzione n. 7 disabilito l'aggiornamento dello schermo evitando lo "sfarfallio" dello stesso.

    Con l'istruzione n. 8 inizia un ciclo For Each (sarebbe troppo lungo qui parlare dei cicli e ce ne sono di vario tipo)

    Con le istruzioni n. 9 e 10 imposto nelle variabili lr e ur il numero dell'ultima riga piena della colonna A dei fogli "ESTERE" ed "ITALIANE".

    Con le istruzione n. 11 12 dico se il valore di ogni cella dell'intervallo rng è uguae a "LONDRA" o "BERLINO" o "MADRID" copiami le colonne dalla A alla D (con riga della cella) sul foglio "ESTERE" alla prima riga vuota.

    Altrimenti, con l'istruzione n 14 fai lo stesso ma nel foglio "ITALIANE".

    Con l'istruzione 15 chiudo l'istruzione If e con la 16 il ciclo For Each.

    Con la 17 riabilito l'aggiornamento dello schermo, con la 18 lancio un messaggio "Operazione effettuata" e con la 19 e la 20 "distruggo" (anche se io per dimenticanza non lo faccio mai) le variabili oggetto in precedenza dichiarate.

    Direi che è tutto e spero sia per te di non difficile comprensione. In ogni caso ti consiglierei di munirti di un buon manuale di VBA perché come avrai intuito ti si apre un "mondo".

    Se hai domande non hai che da chiedere.

    Alfredo





  • di Mick (utente non iscritto) data: 29/12/2015 17:50:37

    Ciao! Grazieeeee per tutte le info, almeno adesso riesco a capire.

    Ti chiedo. Ho allegato il file (PROVA1), perchè non riesco a capire una cosa:

    Ho provato a variare delle cose, cambiando la colonna su cui effettuare la ricerca (piccole modifiche semplicemente per vedere se avevo capito come la macro lavora) e inserendo come città estere new york e buenos aires.
    Non capisco perchè ma new york me la mette in estere mentre buenos aires continua a finire nelle italiane, ma io nella macro ho proprio inserito:
    If cel.Value = "BUENOS AIRES" Or cel.Value = "NEW YORK" Then
    Dov'è che sto sbagliando?

    Poi come mai nei fogli estere e italiane l'inserimento delle città parte sempre dalla Riga2?
    Ho provato a modificare in questo punto:
    Range("A" & cel.Row & ":" & "c" & cel.Row).Copy Destination:=Worksheets("estere").Range("A" & lr + 1)
    ma se metto + 0, mi mette solo 1 riga

    Ancora Grazie!!!



  • di Mick (utente non iscritto) data: 29/12/2015 18:20:28

    Incredibile!!! Forse ho capito io.
    Buenos Aires aveva tipo degli spazi a destra e quindi non mi riconosceva "BUENOS AIRES" perchè era "BUENOS AIRES "

    E' possibile eliminare in automatico tutti gli spazi dopo il nome della città?



  • di alfrimpa data: 29/12/2015 19:20:39

    Ciao Mick

    Prova a modificare l'istruzione alla riga 11 come vedi sotto.

    Per quanto riguarda l'altro problema è per questo che ho inserito nei fogli "ITALIANE ed "ESTERE" un'intestazione dei campi.

    Alfredo 
     
    11  If cel.Value = "LONDRA" Or cel.Value = "BERLINO" Or cel.Value = "MADRID" Then
    
    11  If Trim(cel.Value) = "LONDRA" Or cel.Value = "BERLINO" Or cel.Value = "MADRID" Then






  • di Mick (utente non iscritto) data: 29/12/2015 22:58:50

    Ciao,

    If Trim(cel.Value) funziona perfettamente, mentre alla fine per cancellare la prima riga ho utilizzato un semplice:
    Sheets("estere").Select
    Rows("1:1").Select
    Selection.Delete Shift:=xlUp

    Che dire...Ti ringrazio enormemente per l'aiuto che mi hai dato.

    Grazie ancora e alla prossima. Ciao!