Excel Forum Per condividere esperienze su Microsoft Excel

Assegnare automaticamente nomi in sequenza corretta a Range uguali tra loro

  • Messaggi
  • OFFLINE
    missKlaPP
    Post: 6
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 03/07/2020 18:47
    Assegnare automaticamente nomi in sequenza corretta a Range uguali tra loro
    Saluti a tutti! Avrei bisogno di un aiutino....

    Ho un foglio con circa 4000 righe con i dati di operatori fra cui maschi, femmine, tornitori, fresatori, saldatori, ecc.
    Ogni operatore ha dedicate per sé 47 righe. In queste righe ho scritto anche le qualifiche e il sesso, e al loro fianco faccio inserire con formula una "X" in base alla qualifica o al sesso prendendo i dati da un altro foglio.

    Ora vorrei creare un'area con nome estesa le 47 righe di ciascun operatore, nominando il range con la sua qualifica o il sesso, 'leggendo' le "X" che sono accanto alle qualifiche. Ho fatto delle prove copiando codice qua e là ma non riesco ad ottenere un risultato corretto.

    Il problema è che nel foglio c'è un maschio, poi 3 femmine, poi un saldatore, poi un altro maschio, ecc. in ordine di cognomi, e quando creo i nomi dei range con macro, non mi vengono in sequenza. P. es. viene "maschio1" poi salta le femmine ma il secondo maschio me lo nomina "maschio6" perché tiene conto dei controlli intermedi sugli altri operatori. Questo crea problemi alla macro che cerca p. es. tutti i nomi "maschio-" per nasconderli, perché si ferma se il numero del suffisso non è in sequenza...

    Come posso fare per avere i nomi dei range con il numero del suffisso in sequenza corretta a seconda della qualifica, tipo "maschio001", "maschio002" ecc. anche se in mezzo ci sono altri 'non maschi'?

    Questo è quello che ho fatto... 😖

        Sub Area_nomi()            'assegna un nome a ciascuna specializzazione
        Riga = 1                   'decido da quale riga iniziare, in questo caso dalla riga 1

        For N = 1 To 90            'ora decido a quanti intervalli assegnare un nome, quindi 90 in questo caso

                nome = Cells(Riga + 4, 27).Value    'imposto la variabile "nome" come da colonna "Label"

                ActiveWorkbook.Names.Add Name:=nome, RefersTo:=Sheets(1).Range(Rows(Riga), Rows(Riga + 46))     'definisco le righe intere come intervallo, per  facilitare l'esecuzione del successivo comando 'Nascondi'

            Riga = Riga + 47        'incremento di 47 il valore di riga, così il prossimo intervallo inizierà 48 righe più in basso

        Next                        'ripeto il ciclo N volte

        End Sub


    [Modificato da missKlaPP 03/07/2020 18:57]
  • ABCDEF@Excel
    00 03/07/2020 19:36
    Cancella i nomi (mettili fasulli) ed allega il files
    Devi decidere, cosa desideri dividere maschi<<<>>>femmine
    Se non è prioritario, dividerei per mansioni. In base alla mansione puoi avere saldatori =S1,S2 oppure T1,T2 ecc ecc (anche col nome S1_Pippo)
    Faccio un ex...
    Sub test()
    Dim ur, x, nome, S, T, F, vS, vT, vF
    ur = Range("A" & Rows.Count).End(xlUp).Row
    vS = 1
    vT = 1
    vF = 1
    For x = 1 To ur Step 47
        IF Cells(x + ??, ??)= "saldatori" then
            nome = Cells(x + 4, 27).Value & "_" & vS
            ActiveWorkbook.Names.Add Name:=nome, RefersTo:=Sheets(1).Range(Rows(x), Rows(x + 46))
            vS = vS + 1
        elseIF Cells(x + ??, ??)= "tornitori" then
            nome = Cells(x + 4, 27).Value & "_" & vT
            ActiveWorkbook.Names.Add Name:=nome, RefersTo:=Sheets(1).Range(Rows(x), Rows(x + 46))
            vT = vT + 1
        elseIF Cells(x + ??, ??)= "fresatori" then
            nome = Cells(x + 4, 27).Value & "_" & vF
            ActiveWorkbook.Names.Add Name:=nome, RefersTo:=Sheets(1).Range(Rows(x), Rows(x + 46))
            vF = vF + 1
    End If
    Next x
    End Sub
    [Modificato da ABCDEF@Excel 03/07/2020 19:39]
  • ONLINE
    by sal
    Post: 5.974
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 04/07/2020 06:56
    Ciao non credo sia corretto definire le qualifiche o altri elementi con righe devi trasformarle in colonne, molto più semplice da gestire, esempio



    mettendo un filtro sulla qualifica avrai immediatamente tutti i tornitori o altro e non andando a cercarli ogni 47 righe.

    forse ti sei sbagliato e definirle righe, comunque un esempio vale più di mille parole.

    inoltre quando vorrai un report per righe dall'elenco in colonne puoi trasformarlo in righe con una macro

    Ciao By Sal [SM=x423051]
    [Modificato da by sal 04/07/2020 07:00]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    missKlaPP
    Post: 6
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 04/07/2020 20:15
    Grazie delle vostre considerazioni!
    Allego il file draft...

    Il format è da mantenere così a causa di compatibilità grafica con altre vecchie schede...

    Grazie del vs aiuto...
    Ciao, Franco.😏
  • ABCDEF@Excel
    00 05/07/2020 03:13
    Onestamente non Ti capisco, creare dei Nomi per poi "nasconderli"
    Pensavo che Ti servisse per una ricerca più veloce dell'area. Comunque per informazione, prima di crearli bisogna cancellare i presenti per evitare errori. Fatto (con molti dubbi di quello che hai richiesto), ho messo solo le sigle (puoi mettere le parole), mà suggerisco che il "tutto" non sia con troppi caratteri. L'allegato è incompleto riga54 non è donna/maschio, se ci sono due mansioni le scrive.
    Option Explicit
        Sub EliminaNomi() ' http://ennius.altervista.org/vba/vba103.php
        Dim G, X As Integer
        X = ActiveWorkbook.Names.Count  'con X otteniamo il numero di quanti nomi sono nel workbook
            For G = X To 2 Step -1      'si inizia un ciclo a scalare, usando G come contatore del ciclo
                ActiveWorkbook.Names(G).Delete   'e si cancella il nome il cui numero indice ? uguale al contatore (G)
            Next
        End Sub
    Sub Prova()
    Dim ur As Long, X As Long, Maschio, Donna, Nome As String
    Call EliminaNomi
    ur = Range("B" & Rows.Count).End(xlUp).Row
    For X = 1 To ur Step 47
        If Cells(X + 6, 14) = "X" Or Cells(X + 6, 20) = "X" Then
            Nome = ""
            If Cells(X + 6, 14) = "X" Then Nome = "M_": Maschio = Maschio + 1 ' Nome = "Maschio_"
            If Cells(X + 6, 20) = "X" Then Nome = "D_": Donna = Donna + 1 ' Nome = "Donna_"
            If Cells(X + 9, 14) = "X" Then Nome = Nome & "T_"
            If Cells(X + 9, 20) = "X" Then Nome = Nome & "F_"
            If Cells(X + 12, 7) = "X" Then Nome = Nome & "M_"
            If Cells(X + 12, 10) = "X" Then Nome = Nome & "S_"
            If Cells(X + 12, 17) = "X" Then Nome = Nome & "E_"
            If Cells(X + 6, 14) = "X" Then
                Nome = Nome & Format(Maschio, "000")
            Else
                Nome = Nome & Format(Donna, "000")
            End If
            'Se desideri usa tutta la riga ...Range(Rows(x), Rows(x + 46))
            ActiveWorkbook.Names.Add Name:=Nome, RefersTo:=Sheets("Foglio1").Range(Cells(X, 2), Cells(X + 46, 23))
        End If
    Next X
    MsgBox "Fatto"
    End Sub

    Aggiungo il codice per nascondere donna oppure maschio
    Sub Nascondi_Maschio()
    Dim ur As Long, X As Long
    ur = Range("B" & Rows.Count).End(xlUp).Row
        For X = 1 To ur Step 47
            If Cells(X + 6, 14) = "" Then
                Range(Rows(X), Rows(X + 46)).EntireRow.Hidden = True
            End If
        Next
    MsgBox "Fatto"
    End Sub
    Sub Nascondi_Donna()
    Dim ur As Long, X As Long
    ur = Range("B" & Rows.Count).End(xlUp).Row
        For X = 1 To ur Step 47
            If Cells(X + 6, 20) = "" Then
                Range(Rows(X), Rows(X + 46)).EntireRow.Hidden = True
            End If
        Next
    MsgBox "Fatto"
    End Sub
    Sub Scopri_tutto()
        Cells.EntireRow.Hidden = False
    End Sub
  • OFFLINE
    missKlaPP
    Post: 7
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 05/07/2020 11:15
    Grazie ABCDEF, appena riesco provo il codice che mi hai gentilmente postato.

    In realtà l'obiettivo che vorrei raggiungere è quello di utilizzare una UserForm che ho preparato per mostrare o solo i maschi, o solo le femmine, o solo i saldatori, o solo... ecc.
    In questo senso intendo 'nascondere', cioè vorrei mostrare solo determinate specializzazioni in base alle richieste fatte sulla UserForm.

    Grazie, provo e poi ti dico...
    B.G.
  • OFFLINE
    missKlaPP
    Post: 8
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 05/07/2020 11:52

    Eccomi:

    1- La macro va molto bene, grazie! La "EliminaNomi" però mi cancella le interruzioni di stampa che invece desideravo mantenere...

    2- Le aree che vorrei creare dovrebbero essere 'sovrapposte', nel senso che per ogni qualifica oppuse sesso ci sia un'area con quel nome. Allego uno screenshot di cosa vorrei ottenere...

    Grazie...

  • ABCDEF@Excel
    00 05/07/2020 15:30
    Se lo scopo finale è di nascondere/filtrare/selezionare le Aree, Ti sconsiglio d'usare i NOMI. Ex. Dal Tuo allegato tramite VBA, vedo:...For G = X To 1 Step -1...Cells(G, 26) = Names(G)
    =Dati1!$B$2:$K$85---un collegamento al foglio Dati
    =Foglio1!$B$2:$W$3---uno all'area del Titolo
    =#NAME?---uno indefinito con errore, a seguire la stampa e gli altri
    Ragionandoci sopra, a quale scopo creare due/tre NOMI per la medesima Area???

    Tutto questo si può fare usando solo il VBA (ho pensato a dove mettere i bottoni ed infatti mi era venuto in mente l'Userform). Adesso una domanda importante..., abbiamo definito di dividere tra Uomini/Donne OK. Ora desideri dividerli pure trà le varie Mansioni? OK. Mà cosa serve il Numero.000? Non è meglio usare il Cognome/Nome? EX Marco_Magazzino + Elena_Magazzino. Vedo come fare?
    Ps. Rinominando/Eliminando Sheets("2020-03"), il codice Sub copia() non funzionerà più.
  • OFFLINE
    missKlaPP
    Post: 9
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 05/07/2020 16:07
    Beh, usavo i NOMI perché mi sembrava più facile poi richiamare il nome e poterlo filtrare con un 'visualizza/nascondi'... ma se c'è un altro modo per dire al VBA "mostrami SOLO tutti i maschi" oppure "mostrami SOLO tutti i tornitori" va bene lo stesso, anzi meglio 😁😁 io non ne sò certo per ottenerlo...

    Il Numero.000 mi sembrava necessario perché credo non si possa assegnare lo stesso NOME a diversi Range...

    Per quanto riguarda i Range di 47 righe, vorrei poterli filtrare e di conseguenza visualizzare indipendentemente tra loro, un filtro per ciascuna "X" se maschio, OPPURE se femmina, OPPURE se tornitore (maschi e femmine), OPPURE se saldatore (maschi e femmine insieme) ecc. Se possibile, quando cerco p. es. gli Elettricisti mi si devono visualizzare TUTTI gli Elettricisti, indifferentemente se uomini o donne...

    Ok, farò in modo di non cambiare il nome del foglio "2020-03" tanto è solo un appoggio temporaneo.

    Grazie mille...🤠
  • ABCDEF@Excel
    00 06/07/2020 01:11
    Da provare....
    Per aprire l'userform premi CTRL+MAIUS+A
    Se selezioni da Listbox lo visualizza, se premi OK nasconde gli "altri"
    Per vedere tutto, il tasto oppure apri userform e chiudi tramite la X

    Ps. Per tutte le formule similari...(Valter non funzionava)
    Se non metti Falso potrebbe non funzionare.
    =SE(CERCA.VERT(C287;Dati1!$A$3:$J$90;5;FALSO)="OK";"X";"")
    [Modificato da ABCDEF@Excel 06/07/2020 06:38]
  • OFFLINE
    missKlaPP
    Post: 10
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 13/07/2020 00:03
    Re:
    ABCDEF@Excel, 06/07/2020 01:11:

    Da provare....
    Per aprire l'userform premi CTRL+MAIUS+A
    Se selezioni da Listbox lo visualizza, se premi OK nasconde gli "altri"
    Per vedere tutto, il tasto oppure apri userform e chiudi tramite la X

    Ps. Per tutte le formule similari...(Valter non funzionava)
    Se non metti Falso potrebbe non funzionare.
    =SE(CERCA.VERT(C287;Dati1!$A$3:$J$90;5;FALSO)="OK";"X";"")



    Perfetto! Funziona ottimamente! Grazie mille dell'aiuto, per me fondamentale... anche dell'aggiornamento della formula 👌

    Un'ulteriore domanda: dopo la selezione, come posso fare per stampare con "Microsoft print to PDF" le specializzazioni rimaste visibili? Ho impostato correttamente le interruzioni di pagina, ma ovviamente la numerazione delle pagine non è in sequenza, per cui la stampante stampa anche le pagine bianche "nascoste"...

    C'è un modo per conoscere le pagine attualmente visibili e far stampare solo quelle? 😵

  • ABCDEF@Excel
    00 14/07/2020 16:40
    >>>C'è un modo per conoscere le pagine attualmente visibili e far stampare solo quelle?
    Non capisco, in teoria se selezioni qualsiasi cosa, ex "Maschi" a monitor vedi solo loro e puoi stampare. In quale caso Ti stampa Aree differenti? Non vorrei che Tu avessi selezionato tutto ed inserito col NOME = Stampa. Ho trovato un metodo per selezionare le Aree desiderate, se Ti interessa devo modificare gran parte del codice.

    Ps. A riguardo "Microsoft print to PDF", Ti interessa stampare un PDF oppure salvare un PDF? Aggiungerei un bottone che in base alla scelta, salva con nome =scelta+data (non potrai salvare due files con la stessa "scelta+data" ogni giorno
  • OFFLINE
    missKlaPP
    Post: 11
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 14/07/2020 18:08
    E' vero, a monitor posso vedere solo le persone in base alle caratteristiche che ho selezionato, ma poi quando vado a verificare le interruzioni di pagina non si chiamano "pagina 1", "pagina 2", ecc in sequenza ma ci sono i salti di numerazione in base alle persone nascoste... tipo "pagina 7", "pagina 12", "pagina 23", ecc.

    Per cui quando poi vado a stampare, PDF o stampante che sia, mi stampa tutte le pagine dalla 1 in poi in sequenza, incluse quelle che sono state nascoste (che stampa come fogli bianchi)...

    Quindi pensavo ad un codice che mi rilevasse i numeri delle sole pagine visibili, cioè quelle che risultano effettivamente a video quando visualizzo "interruzioni di pagina", e poi dicesse alla stampante: Stampami le pagine 7, 12, 23, ecc. (che sono solo quelle visibili).

    Microsoft to PDF perché al bisogno vorrei poter passare ai colleghi le schede in pdf con le specializzazioni richieste, va bene anche raggruppate in un unico file che p. es. viene formato dalle pagg. 7, 12, 23, xx, xx, ecc. e questa stampante virtuale in pdf mi piace perché permette di replicare esattamente cosa c'è a video (effetti grafici inclusi), questione di gusti 😁😁😁

    Però, se devi apportare molte modifiche non voglio impegnarti troppo, mi sarebbe sufficiente capire come costruire codice che appunto 'legga' le interruzioni di pagina attualmente visibili, e le invii alla stampante per la stampa. Va bene anche che non sia integrato con il codice precedente, ma una macro a sé stante da attivare su pulsante singolo.

    Grazie mille....
  • ABCDEF@Excel
    00 14/07/2020 19:06
    Sul files allegato non esistono le interruzioni di pagina ???

    Suggerisco dal files originale (con tutti visibili) d'avviare il Registratore, stampare (per ex le pagine 5, 10, 15). Fermare il registratore ed allegare il VBA prodotto (anche se non lo userò).

    Ps. Se invece creo il Foglio(Stampa) e copio tali dati su quello. Sarebbe più facile stampare/creare un PDF. Non conosco Microsoft to PDF se alleghi un foglio creato con copia/incolla (effetti grafici inclusi), vorrei provare a salvarlo come PDF tramite VBA
  • OFFLINE
    missKlaPP
    Post: 12
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 14/07/2020 19:27
    Ok, ti rimando il file che mi avevi modificato, però ho notato una cosa strana: quando ho provato a selezionare p. es. "tornitori", le interruzioni di pagina erano correttamente in sequenza progressiva, 1, 2, 3, ecc.
    Mentre quando ho allineato manualmente le interruzioni di pagina in base al format del modulo, la numerazione è cambiata, con il problema che ti dicevo prima cioè le pagine con numerazione discontinua...
  • OFFLINE
    missKlaPP
    Post: 13
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 14/07/2020 19:39
    Nel mio excel non c'è la possibilità di stampare 'a salti', ma c'è solo "da" - "a"...
    Vedi screen
  • ABCDEF@Excel
    00 15/07/2020 14:17
    Eppure mi sembrava che si potesse tempo fà, ma forse erano dei PDF
    Quel NOME "Area di Stampa", Ti fà stampare tutte le righe nascoste. Quello lo devi usare solo per stampare tutti i lavoratori.
    Le interruzione di pagina sono un problema, non puoi toglierle e usando solo l'area A1:W47 allargando/restrigendo per farlo rientrare in una pagina unica?
    Non hai corretto le formule con Falso

    Comunque Ti allego un files provvisorio (prova il tasto Multi Stampa, Multi PDF crea diversi files nella directory dove è presente questo files), devo finire Unico_PDF
    Ps se va bene, devi eliminare Userform1 + Modulo2

    Edit. Mà sul files originale, il foglio (attualmente il Foglio1) si chiama proprio con questo nome?
    Mi puoi dire tutti i nomi dei fogli sull'originale?
    [Modificato da ABCDEF@Excel 15/07/2020 20:10]
  • OFFLINE
    missKlaPP
    Post: 14
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 16/07/2020 16:13
    Buongiorno, i nomi dei fogli originali sono proprio "Foglio1", "Dati1", e "2020-03".

    Non ho corretto le formule sul foglio 'draft' sul quale stai lavorando, ma ho fatto tesoro dei tuoi consigli e sull'originale ho prontamente corretto...😄

    "Le interruzione di pagina sono un problema, non puoi toglierle e usando solo l'area A1:W47 allargando/restrigendo per farlo rientrare in una pagina unica?"
    Ok, ma le 'schede' sono più di una per ciascuna selezione, e non potendo compattare più di una scheda per pagina devo necessariamente dimensionare la scheda in modo che riempia tutta la pagina A4. Il solo modo che io conosco è sistemare le interruzioni di pagina (le linee blu) in modo tale che una scheda appunto riempia l'intera pagina, e poi stamparle tutte di fila.
  • ABCDEF@Excel
    00 16/07/2020 19:11
    Io non vedo nessun foglio 'draft', scrivo il VBA col "Foglio1"

    Grazie ad un'esperto (che mi ha indicato il modo d'eseguire), questo è il massimo che posso fare.
    Per colpa delle (interruzioni di pagina ed celle unite) tutto è stato più complicato.
    1) Ogni bottone che premi crea un foglio, Ti verrà chiesto Si/No
    2) Si = Apre Userform, dove premi PDF o *Stampa*, il foglio poi verrà eliminato
    3) No = Non viene eliminato (sino alla chiusura del files), oppure tramite bottone
    4) In Sub Auto_Close (determinati fogli), non "verranno" eliminati

    Nei 2 bottoni *Stampa* (non testati) ci sono due righe verdi, presumo sia la 2°

    NB. Esiste in Modulo2, Sub Crea_Foglio(), cosa fà? (Poi decidi se usarlo)
    Ex: Se in Dati1, cella A3:Axx scrivi 100 nomi ed in colonna(L) = X
    Ricrea il Foglio1 (terra-terra, se inserisci le formule solo in B1:B47), eventuali modifiche diciture (annate), mà soprattutto se aumenti/diminuisci l'altezza delle righe. Il VBA ricrea (B1:B47) per tutti i Nomi=X con la stessa "altezza"(sul mio Pc ci mette 5m). A riguardo il nome "Area di stampa" in Foglio1, Tu devi controllare le interruzioni di pagina (il VBA adegua solo il range...da fare)

    Ps. Non testato al 100%, sperò che non ci siano errori
    Pps. Mi rimane un "particolare" che devo rivedere (con la Sub combo)

    Edit (tolto all'allegato) dammi tempo che riallego
    Sub Crea_Foglio() non funziona bene, appena riesco allego il vba
    [Modificato da ABCDEF@Excel 17/07/2020 14:12]
  • ABCDEF@Excel
    00 17/07/2020 14:13
    Dovrebbe essere a posto (tranne la stampa)
  • OFFLINE
    missKlaPP
    Post: 15
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 17/07/2020 19:09
    Re:
    ABCDEF@Excel, 17/07/2020 14:13:

    Dovrebbe essere a posto (tranne la stampa)



    Direi che è perfetto!

    Tutto molto chiaro, e soprattutto adatto alle mie necessità...

    Grazie di cuore, ABCDEF! Perdonami se ti ho stressato, e buon proseguimento! 😉
  • OFFLINE
    missKlaPP
    Post: 16
    Registrato il: 12/06/2020
    Età: 60
    Utente Junior
    Office 365
    00 20/07/2020 10:39
    PS: in relazione alla stampa, allego il codice che ho composto, in parte tuo in parte trovato in giro, che permette all'utente di scegliere quale stampante usare.

    Ho dimensionato la pagina A4 in modo che i margini facessero rientrare l'intera scheda nella pagina (come mi sembra mi avevi suggerito tu), poi ho chiesto di selezionare solo le CELLE interessate, non le righe intere; in questo modo mi stampa solo le schede visibili SENZA le pagine bianche fra una scheda e l'altra...

    Metto il codice, se può essere utile. Ciao e buona giornata.

    Private Sub CommandButton16_Click()
    On Error GoTo finito
    Dim nome, rg As Object
    Dim ur As Long
    Worksheets("Foglio1").Activate
    ur = Range("B" & Rows.Count).End(xlUp).Row
    Set rg = Columns("C:C").Find(nome, LookIn:=xlValues, LookAt:=xlWhole)
    If Not rg Is Nothing Then
        Range(Cells(1, 1), Cells(ur, 23)).Select
    End If
                 If Application.Dialogs(xlDialogPrinterSetup).Show Then
                      ActiveWindow.RangeSelection.PrintOut
                 End If
    Range("A1").Select
    finito:
    End Sub