Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Assegnazione nomi con VBA

595 views
Skip to first unread message

enzo

unread,
Sep 17, 2003, 7:44:06 AM9/17/03
to
Salve!
Vorrei risolvere un piccolo (!) problema di VB.
In Excel se si assegna un nome ad un gruppo di celle (es."pippo"= A1:A103) e
successivamente si inseriscono altre celle nel gruppo, il nome si adegua e
comprende nel range le nuove celle (es: inserendo 5 celle, "pippo"=
A1:A108).
nel caso si copiasse il range "pippo" e lo si incollasse in A104 (nel primo
caso) il nome non si adegua.
Dovendo, mediante una macro, riordinare un database che é stato aggiornato
con l'inserimento o l'eliminazione di righe e riscrivere il numero d'ordine
contenuto nel range "pippo", é possibile fare in modo che il nome venga
comunque riassegnato al nuovo range?
Spero di essere stato comprensibile.
Grazie


Tiziano Marmiroli

unread,
Sep 17, 2003, 8:00:31 AM9/17/03
to

Io non ho capito.

--
Tiziano Marmiroli
Microsoft MVP - Office

enzo

unread,
Sep 17, 2003, 9:08:17 AM9/17/03
to

> > Spero di essere stato comprensibile.
>
> Io non ho capito.

... e se non hai capito tu! ... chissà cosa ho detto (ho offeso qualcuno?)

Comunque ci riprovo!
Ho un database (range "elenco" = B3:C100) con le intestazioni nella riga 3
(in B3 il testo "N." ed in C3 il testo "NOMINATIVO".
Da B4 a B100 i numeri da 1 a 97 (range "N.") e da C4 a C100 dei nomi in
ordine alfabetico.

Il seguente codice, associato ad un pulsante, provvede a riordinare il
database in ordine alfabetico ed a ripristinare l'esatta successione dei
numeri d'ordine:

Private Sub CmdOrdina_Click()
Application.Goto Reference:="Elenco"
Selection.Sort Key1:=Range("C4"), Order1:=xlAscending, Header:=xlGuess,
_
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
n = 1
For Each cell In Range("N.")
cell.Value = n
n = n + 1
Next
End Sub

Aggiornando il database, capita talvolta di dover inserire o cancellare dei
nominativi inserendo o eliminando righe all'interno del database.
Inserendo pochi nominativi per volta, non c'è nessun problema ma, allorchè
ho pensato di utilizzare questa applicazione per un altro database molto più
consistente, ho pensato di copiare le righe da 4 a 100 per incollarle più
volte in successione.
La sgradita sorpresa é stata quella di provare che il codice continuava a
funzionare perfettamente ma solo sui range "N." ed "Elenco" originali.
Da qui la curiosità di saper come fare per assegnare il nome "N."
direttamente dal codice.

Spero almeno di aver fatto un passo avanti nella formulazione delle domande
:)
Grazie
Enzo

Tiziano Marmiroli

unread,
Sep 17, 2003, 4:37:47 PM9/17/03
to
Il Wed, 17 Sep 2003 13:08:17 GMT, enzo ha scritto:


> La sgradita sorpresa é stata quella di provare che il codice continuava a
> funzionare perfettamente ma solo sui range "N." ed "Elenco" originali.
> Da qui la curiosità di saper come fare per assegnare il nome "N."
> direttamente dal codice.

Cerca nella guida in linea "Proprietà CurrentRegion" e "Proprietà
Resize".

'A occhio' potrai usare qualcosa tipo:

ActiveWorkbook.Names.Add Name:="archivio", RefersTo:=Range("archivio").Resize(Range("archivio").CurrentRegion.Rows.Count)

ActiveWorkbook.Names.Add Name:="N.", RefersTo:=Range("Elenco").Cells(1).Offset(1, 0).Resize(Range("Elenco").Rows.Count - 1).Select

Tiziano Marmiroli

unread,
Sep 17, 2003, 4:52:25 PM9/17/03
to
Il Wed, 17 Sep 2003 20:37:47 GMT, Tiziano Marmiroli ha scritto:

> ActiveWorkbook.Names.Add Name:="N.", >RefersTo:=Range("Elenco").Cells(1).Offset(1, >0).Resize(Range("Elenco").Rows.Count - 1).Select

C'e' un .Select di troppo:

ActiveWorkbook.Names.Add Name:="N.",RefersTo:=Range("Elenco").Offset(1, 0).Resize(Range("Elenco").Rows.Count - 1, 1)

enzo

unread,
Sep 18, 2003, 1:58:12 AM9/18/03
to
É perfetto cosě:

Private Sub CmdOrdina_Click()
ActiveSheet.Names.Add Name:="N.", RefersTo:=Range("Elenco").Offset(1,


0).Resize(Range("Elenco").Rows.Count - 1, 1)

Application.Goto Reference:="Elenco"
Selection.Sort Key1:=Range("C4"), Order1:=xlAscending, Header:=xlGuess,
_
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
n = 1
For Each cell In Range("N.")
cell.Value = n
n = n + 1
Next
End Sub

Avevo intuito che occorresse far riferimento al range "elenco" per poi
spostarsi sulla selezione adiacente ma, inutile dirlo, non sono capace.
Sei impagabile come sempre.
Grazie
Enzo

"Tiziano Marmiroli" <t.mar...@mvps.org> ha scritto nel messaggio
news:gqhhmvca4f9qij0se...@4ax.com...

0 new messages