Condividi tramite

excel macro nome intervallo

Anonimo
2019-12-06T14:29:53+00:00
<br>ho una serie di tabelle simili per struttura e funzione, tranne, per alcune di esse, per il numero di righe, che quindi può variare. La tabella-tipo è composta di 13 righe oltre le intestazioni.
<br>ogni volta che debbo inserire una nuova tabella, con una macro la inserisco copiando la tabella -tipo presente nell’intervallo C24:H36.<br><br><br><br><br>Quindi compilo i vari campi e successivamente debbo aggiornare i vari intervalli (evidenziati in rosso) che di volta in volta variano per numero di righe o, possono non essere valorizzati.<br><br><br><br>In sequenza con la macro, seleziono l’intervallo D56: D1000, copio i dati in A56, dove devo eliminare i trattini copia, ordinare i dati in ordine alfabetico, eliminare i duplicati e allinearli a sinistra.<br><br><br><br>Successivamente, devo selezionare ogni singolo intervallo (zona rossa), eliminare i trattini, ordinare i dati per ordine alfabetico e assegnare il nome allo stesso copiando, ad esempio, il contenuto della cella E55 in alto a sinistra<br> e quindi dando invio. Così per i restanti 3 intervalli.<br><br><br><br>Il PROBLEMA, è che il nome dell’intervallo che attribuisco con la macro varia ad ogni nuovo inserimento di Tabella e quindi di fatto la macro non fa altro che sovrascrivere i precedenti nomi di intervallo.<br><br><br><br><br>In altri termini, per rimanere alle prime due Tabelle riportate nel foglio Ridenominatore (C55:H80), alla fine se la macro funzionasse correttamente, dovrei avere il seguente risultato:<br><br><br><br> <br><br><br><br>Intervallo “PROVA_sub1” (E56:E66);<br>Intervallo “PROVA_sub2” (F56:F57); Intervallo “PROVA_oggetto”(G56:G58); Intervallo “PROVA_tipodoc” (H56); ….. Intervallo “IMMOBILI.A_tipodoc” (H69:H77) <br><br><br><br><br><br><br><br>La macro che ho provato a scrivere è “Denominatore_AggiornaItemAssegnaNomeIntervalli”<br><br><br><br>C’è una soluzione? Come fare in modo che il nome assegnato di volta in volta ad ogni singolo intervallo sia quello presente in E55 – H55?<br><br><br><br>Grazie anticipatamente<br><br><br><br>Link file: https://www.dropbox.com/s/4alm8b3y8nd20yx/DESK%20Ridenominatore%20File%2004.12.2019.xlsm?dl=0<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>****
Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

8 risposte

Ordina per: Più utili
  1. Anonimo
    2019-12-07T12:25:16+00:00

    Buongiorno,

    Diciamo che forse sono riuscito a capire cosa intendi fare e per questo ti propongo una soluzione grezza anche se l'intera macro andrebbe rivista.

    Il nome lo puoi prendere da E55, F55, G55, H55 semplicemente inserendolo all'interno della macro al parametro Name:= (o il primo parametro della funzione)

    nella tua macro aggiornaitem c'e' tutta la procedura che scorre i vai intervalli e a ognuno gli da un nome, basta sostituirla con questo ciclo for

        Dim nome As String
        Dim val As Range
        Dim namedRange As Range
        
        For Each val In Range("E55:H55")
            nome = val
            'controlla che effettivamente ci siano dati prima di assegnare l'intervallo
            If val.Offset(11, 0).End(xlUp).Row < val.Offset(1, 0).Row Then
                MsgBox "Non sono presenti dati nel range " & val.Address & " " & val
            Else
                Set namedRange = Range(val.Offset(1, 0), val.Offset(11, 0).End(xlUp))
                ActiveWorkbook.Names.Add nome, namedRange
            End If
        Next val
    

    Saluti,

    Daniele

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-12-07T09:32:32+00:00

    grazie per la chiarezza e la pazienza. 

    il prossimo step sarebbe quello di selezionare gli intervalli (4) 

    Intervallo “PROVA_sub1” (E56:E66); Intervallo “PROVA_sub2” (F56:F57); Intervallo “PROVA_oggetto”(G56:G58); Intervallo “PROVA_tipodoc” (H56); ….. Intervallo “IMMOBILI.A_tipodoc” (H69:H77) assegnando ad ognuno il nome presente rispettivamente in E55 / F55 / G55 / H55. 

    Il problema più grande (ovviamente per me) da superare è rappresentato dal fatto che i 4 nomi afferenti ai 4 intervalli, ogni volta che inserisco una nuova tabella con un nuovo Item cambiano. quindi se ora seleziono l'intervallo E56:E66 assegnandogli il nome "Prova_sub1", l'inserimento successivo di una nuova tabella "sovrascrive" l'intervallo assegnandogli lo stesso nome. ciò che non va bene

    quindi si tratterebbe di usare un comando che quando copia il nome presente in E55, lo modifichi ad ogni nuova tabella.

    grazie ancora

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-12-07T00:09:00+00:00

    Purtroppo non mi e' molto chiaro ancora ora.... 

    Punto primo perché il codice e' molto incasinato e non si capisce cosa tu voglia fare cerchiamo di procedere per punti come ho già scritto mantenendo una logica fisica, mi dilungo un po nella spiegazione per darti qualche concetto di programmazione.

    Per prima cosa crea un nuovo Modulo dove andremmo a scrivere il codice, pulito, che ci serve (tasto destro sulla cartella moduli -> Inserisci -> Modulo

    Di nuovo, per una questione di pulizia del codice rinomina questo Modulo in "Main" ed elimina invece tutti gli altri moduli vuoti, altrimenti ogni volta c'e' da impazzire per trovare le funzioni.

    Main sta per funzione principale.

    Dentro Main creiamo appunto la funzione da cui tutto avrà inizio e dichiariamo alcune costanti che ci serviranno come:

    Il nome del foglio dove e' presente la tabella standard

    il range dove e' presente la tabella standard

    la prima cella in cui andremmo ad inserire la tabella standard

    la larghezza della tabella standard

    e la lunghezza della tabella standard

    Const nomeFoglioTabStandard = "Ridenominatore"
    Const addressTabStandard As String = "C24:H36"
    Const firstElencoCell = "C55"
    Const larghezzaTabStandard = 6
    Const lunghezzaTabStandard = 13
    
    Public Sub Start()
        
    End Sub
    

    Ora qui andiamo a scrivere cosa vogliamo fare, penso che la prima cosa che tu debba fare da quanto scritto sia quello di creare lo spazio per la tabella standard nell'elenco, poi copiare la tabella standard nell'elenco, benissimo allora diciamoglielo chiaro e tondo dentro alla Sub start scrivi:

    Public Sub Start()
        CreaSpazioPerNuovaTabella
        CopiaTabellaStandardInElenco
    End Sub
    

    Le funzioni CreaSpazioPerNuovaTabella e CopiaTabellaStandardInElenco ancora non esistono quindi andiamo quindi a crearle, potremmo in realtà scrivere prima tutte le altre operazioni da fare, ma ancora non le ho capite quindi facciamo questo passaggio, questa e' la funzione che sposta le righe giù di 13, per farlo, partendo dalla prima cella utile (che e' C55) utilizza l'offset della lunghezza e della larghezza della tabella che andremmo a inserire e sposta tutto in giu di tante righe quante dichiarate in cima, in questo caso sono 13 per 6, bisogna mettere -1 perche l'offset parte sempre da 0

    Sub CreaSpazioPerNuovaTabella()
        'Troviamo il range da spostare aggiungendo alla cella iniziale la larghezza e la lunghezza (-1 perche parte da 0)
        Set rngDaSpostare = Sheets(nomeFoglioTabStandard).Range(Range(firstElencoCell), Range(firstElencoCell).Offset(lunghezzaTabStandard - 1, larghezzaTabStandard - 1))
        
        'Crea lo spazio
        rngDaSpostare.Insert Shift:=xlDown
    End Sub
    

    Mi spiego meglio, se dopo fatto set rngDaSpostare scrivi "rngDaSpostare.Select" vedrai che ti verra selezionato uno spazio pari a 6x13 celle che sono quelle che poi vengono sposate in giu. 

    Ora la prossima operazione e' quella di copiare la tabella standard all'inizio dell'elenco (C55)

    Sub CopiaTabellaStandardInElenco()
        Dim rngTabStandard As Range
        
        'Dichiariamo il range della tabella standard
        Set rngTabStandard = Sheets(nomeFoglioTabStandard).Range(addressTabStandard)
        
        'Copia la tabella
        rngTabStandard.Copy
        
        'Incolla la tabella nello spazio appena creato
        Range(firstElencoCell).PasteSpecial xlPasteAll
    End Sub
    

    Come vedi in alto ci sono le dichiarazioni dei range, facilmente accessibili e modificabili se in futuro cambi qualcosa e piu le cose vengono semplificate, piu velocemente saranno modificabili e il lavoro sara piu facile da eseguire una volta creata una buona base.

    Se e' quello il tuo scopo ora hai la funzione per farlo, solo a questo punto, se tutto funziona, fai la prossima mossa (che pero purtroppo non ho capito quale sia) seguendo la stessa procedura, cosa vorresti fare una volta creata la nuova tabella?

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2019-12-06T15:17:34+00:00

    la tabella c24:h36 è presente nel foglio Ridenominatore. Occorre scoprire le righe nascoste

    come pure è nascosta la colonna A

    non sono in grado di scrivere una macro. vero, ho utilizzat il registratore.

    la nuova tabella da copiare va copiata in C54:H67, sempre nello stesso foglio (ridenominatore), praticamente inserendo 13 nuove righe, formattandole come quelle da 24 a 36 e quindi "spingendo" verso il basso le tabelle presistenti

    Spero di esserti d'aiuto

    grazie

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2019-12-06T14:47:10+00:00

    Ciao,

    Sono Daniele un consulente indipendente Microsoft e cercherò di aiutarti.

    Il file che hai inserito e' un po incasinato e il problema descritto non molto chiaro

    Tra l'altro in nessuno dei fogli presenti in C24:H36 e' presente una tabella e le macro sono tutte scritte tramite il registratore di macro.

    Cerchiamo di fare una cosa per volta, da quello che ho capito devi copiare una tabella in un nuovo foglio, giusto? Dove lo esegui questo in quale macro/modulo?

    La risposta è stata utile?

    0 commenti Nessun commento