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

VBA e nome colonne su righe

222 views
Skip to first unread message

Luca

unread,
Jul 18, 2010, 9:09:39 AM7/18/10
to
Ciao a tutti,
ho la necessità di scrivere il nome delle colonne sulle righe.

Cioè su tutte le celle della colonna "A" partendo da "A1" devo scrivere

A
B
C
D
...
...
AA
AB
AC
...
...
ecc.

avete qualche idea su come fare?

Cioè se so che la cella "A29" contiene la stringa "AC" come faccio a
calcolarmi facilmente il valore della cella successiva che sarà "AD"?

Grazie in anticipo.

Scossa

unread,
Jul 18, 2010, 10:09:28 AM7/18/10
to
On 18 Lug, 15:09, Luca <nos...@nospam.com> wrote:
>
> avete qualche idea su come fare?

Questo codice (credo di Mauro), dato un numero di colonna restituisce
la(e) lettera(e) relativa(e):

'------------------------------------------
Public Function LettCol(ByVal ColTrg As Long) As String

If ColTrg > 26 Then
LettCol = _
Chr(Int((ColTrg - 1) / 26) + 64) & _
Chr(((ColTrg - 1) Mod 26) + 65)
Else
LettCol = Chr(ColTrg + 64)
End If

End Function
'------------------------------


Questa variazione invece vuole come argomento (facoltativo) un reange,
se omesso prende la cella attiva:

'-------------------------------
Public Function LettRifCol(Optional ByVal Target As Range) As String

Dim ColTrg As Long

If Target Is Nothing Then
ColTrg = ActiveCell.Column
Else
ColTrg = Target.Column
End If
If ColTrg > 26 Then
LettRifCol = _
Chr(Int((ColTrg - 1) / 26) + 64) & _
Chr(((ColTrg - 1) Mod 26) + 65)
Else
LettRifCol = Chr(ColTrg + 64)
End If

End Function

'-------------------------------------

Fai sapere se hai risolto, grazie.

Bye!
Scossa

plinius

unread,
Jul 18, 2010, 11:49:31 AM7/18/10
to

"Luca" <nos...@nospam.com> ha scritto nel messaggio
news:4c42fd1b$0$40293$4faf...@reader2.news.tin.it...

...oppure, senza far ricorso al VBA, copia in A1:
=SINISTRA(INDIRIZZO(1;RIF.RIGA();4);CONFRONTA(1;--VAL.NUMERO(--STRINGA.ESTRAI(INDIRIZZO(1;RIF.RIGA();4);RIF.RIGA($A$1:$A$4);1));0)-1)
matriciale (da confermare con CONTROL+MAIUSC+INVIO)
poi trascina verso il basso finché serve.

Se l'elenco non iniziasse dalla riga 1 ma, per esempio, dalla riga 10,
dovresti aggiungere una paio di "-9"
=SINISTRA(INDIRIZZO(1;RIF.RIGA()-9;4);CONFRONTA(1;--VAL.NUMERO(--STRINGA.ESTRAI(INDIRIZZO(1;RIF.RIGA()-9;4);RIF.RIGA($A$1:$A$4);1));0)-1)

Ciao,
E.


plinius

unread,
Jul 18, 2010, 12:08:04 PM7/18/10
to

"plinius" <punto.l...@LEVARElibero.it> ha scritto nel messaggio
news:foF0o.191274$9f6.3...@twister1.libero.it...

>
> "Luca" <nos...@nospam.com> ha scritto nel messaggio
> news:4c42fd1b$0$40293$4faf...@reader2.news.tin.it...
>> Ciao a tutti,
>> ho la necessità di scrivere il nome delle colonne sulle righe.
>>
>> Cioè su tutte le celle della colonna "A" partendo da "A1" devo scrivere
>>
>> A
>> B
>> C
>> D
>> ...
>> ...
>> AA
>> AB
>> AC
>> ...
>> ...
>> ecc.
>>
>> avete qualche idea su come fare?
>>
>> Cioè se so che la cella "A29" contiene la stringa "AC" come faccio a
>> calcolarmi facilmente il valore della cella successiva che sarà "AD"?
>>
>> Grazie in anticipo.
>>

L'avevo scritta senza fissare la riga a 1 ed ero costretto a testare
l'inizio della parte numerica.
Invece così è ben più snella:
=SINISTRA(INDIRIZZO(1;RIF.RIGA();4);LUNGHEZZA(INDIRIZZO(1;RIF.RIGA();4))-1)
e non è matriciale

Ciao,
E.


Bruno Campanini

unread,
Jul 18, 2010, 2:45:59 PM7/18/10
to
"Luca" <nos...@nospam.com> wrote in message
news:4c42fd1b$0$40293$4faf...@reader2.news.tin.it...

===================================
Public Function DecTo26(ByVal n As Long) As String
Dim S As String
Do: S = Chr(n Mod 26 + 64) & S
n = Int(n / 26)
Loop Until n = 0
DecTo26 = S
End Function
===================================

Bruno

plinius

unread,
Jul 18, 2010, 3:06:20 PM7/18/10
to

"plinius" <punto.l...@LEVARElibero.it> ha scritto nel messaggio
news:EFF0o.80143$Ua.1...@twister2.libero.it...

Uffaaa... allora così è meglio no?!
=SOSTITUISCI(INDIRIZZO(1;RIF.RIGA();4);1;"")

E :-)


r

unread,
Jul 18, 2010, 6:29:23 PM7/18/10
to
On 18 Lug, 15:09, Luca <nos...@nospam.com> wrote:

ci provo anch'io

Function LetteraA1(n As Long) As String
LetteraA1 = Replace(Cells(1, n).Address(False, False), "1", "")
End Function

saluti
r

r

unread,
Jul 18, 2010, 6:37:47 PM7/18/10
to
> r- Nascondi testo citato
>
> - Mostra testo citato -

che poi è la traduzione di quanto proposto da plinius
saluti
r

Mauro Gamberini

unread,
Jul 19, 2010, 1:00:54 AM7/19/10
to
> Questo codice (credo di Mauro)
>
...di Norman...

--
---------------------------
Mauro Gamberini( che vi legge sempre, sappiatelo...;-) )
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads

__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 5290 (20100718) __________

Il messaggio è stato controllato da ESET NOD32 Antivirus.

www.nod32.it


Bruno Campanini

unread,
Jul 19, 2010, 6:12:11 AM7/19/10
to
"r" <robb...@gmail.com> wrote in message
news:7cd00f1d-674e-4a05...@e5g2000yqn.googlegroups.com...

>> ci provo anch'io
>>
>> Function LetteraA1(n As Long) As String
>> LetteraA1 = Replace(Cells(1, n).Address(False, False), "1", "")
>> End Function
>>
>> saluti
>> r- Nascondi testo citato
>>
>> - Mostra testo citato -
>
> che poi è la traduzione di quanto proposto da plinius
> saluti
> r

Formule "cinesi", valide fino alla riga 16384
e non oltre.

Bruno

Bruno Campanini

unread,
Jul 19, 2010, 6:12:56 AM7/19/10
to
"Bruno Campanini" <brun...@libero.it> wrote in message
news:4c434bef$0$12126$4faf...@reader4.news.tin.it...

> ===================================
> Public Function DecTo26(ByVal n As Long) As String
> Dim S As String
> Do: S = Chr(n Mod 26 + 64) & S
> n = Int(n / 26)
> Loop Until n = 0
> DecTo26 = S
> End Function
> ===================================
>
> Bruno

In tempo di crisi, tiriamo la cinghia:


==============================
Public Function DecTo26(ByVal n As Long) As String

Do: DecTo26 = Chr(n Mod 26 + 64) & DecTo26


n = Int(n / 26)
Loop Until n = 0

End Function
===============================

Bruno

r

unread,
Jul 19, 2010, 7:00:27 AM7/19/10
to
On 19 Lug, 12:12, "Bruno Campanini" <bruno...@libero.it> wrote:
> "r" <robb....@gmail.com> wrote in message

non ho il 2007 ... quindi non so cosa risponderti.
ciao
r

Scossa

unread,
Jul 19, 2010, 7:21:36 AM7/19/10
to
On 19 Lug, 12:12, "Bruno Campanini" <bruno...@libero.it> wrote:
> In tempo di crisi, tiriamo la cinghia:
> ==============================
> Public Function DecTo26(ByVal n As Long) As String
> Do: DecTo26 = Chr(n Mod 26 + 64) & DecTo26
>     n = Int(n / 26)
> Loop Until n = 0
> End Function
> ===============================
>

Qualcosa non va:

DecTo26(26) -> A@
DecTo26(52) -> B@


Bye!
Scossa

r

unread,
Jul 19, 2010, 7:25:04 AM7/19/10
to
On 19 Lug, 12:12, "Bruno Campanini" <bruno...@libero.it> wrote:
> "Bruno Campanini" <bruno...@libero.it> wrote in message

quanto spreco ...


Public Function DecTo26(ByVal n As Long) As String

Do While n: DecTo26 = Chr(n Mod 26 + 64) & DecTo26
n = n \ 26
Loop
End Function
:-)

Scossa

unread,
Jul 19, 2010, 7:44:20 AM7/19/10
to
On 19 Lug, 13:25, r <robb....@gmail.com> wrote:
> quanto spreco ...
> Public Function DecTo26(ByVal n As Long) As String
> Do While n: DecTo26 = Chr(n Mod 26 + 64) & DecTo26
>     n = n \ 26
> Loop
> End Function

Non è che funzioni meglio:

decto26(26) -> A@ anzichè Z
decto26(52) -> B@ anzichè BZ

Bye!
Scossa

r

unread,
Jul 19, 2010, 8:04:46 AM7/19/10
to

però è più corta :-)

Scossa

unread,
Jul 19, 2010, 8:17:17 AM7/19/10
to
On 19 Lug, 14:04, r <robb....@gmail.com> wrote:
>
> però è più corta :-)
>

LOOOLLLL!

Bye!
Scossa

r

unread,
Jul 19, 2010, 9:41:49 AM7/19/10
to

ops ... 16384 è il numero di colonne del 2007 :-)
ma scusa che te ne fai della funzione se non hai più colonne?
cioè ... anche avendo l'intestazione dell'ipotetica colonna
16384+1 ... a che ti serve?

ciao
r

Scossa

unread,
Jul 19, 2010, 10:37:26 AM7/19/10
to
On 19 Lug, 15:41, r <robb....@gmail.com> wrote:
>
> ops ... 16384 è il numero di colonne del 2007 :-)
> ma scusa che te ne fai della funzione se non hai più colonne?
> cioè ... anche avendo l'intestazione dell'ipotetica colonna
> 16384+1 ... a che ti serve?

Infatti!

Resta inoltre il fatto che nè la funzione proposta da Bruno, nè la tua
*semplificazione*, funziona correttamente, a meno di modifiche che,
credo, la renderebbero *complicata* quanto quella di Norman.

Bye!
Scossa

r

unread,
Jul 19, 2010, 10:54:38 AM7/19/10
to

beh per il 2007 manco quella funziona ... o sbaglio?

Scossa

unread,
Jul 19, 2010, 4:50:09 PM7/19/10
to
On 19 Lug, 16:54, r <robb....@gmail.com> wrote:
>
> beh per il 2007 manco quella funziona ... o sbaglio?

Non credo, ma è per quello che fra tutte preferisco la tua soluzione:

Function LetteraA1(n As Long) As String
LetteraA1 = Replace(Cells(1, n).Address(False, False), "1", "")
End Function

si adegua alla versione in uso :-)

Bye!
Scossa

r

unread,
Jul 19, 2010, 5:14:30 PM7/19/10
to

beh l'ha detta prima plinius ... con le paternità questo 3d nno ci hai
azzeccato molto :-)
ciao
r

Scossa

unread,
Jul 19, 2010, 5:16:57 PM7/19/10
to
On 19 Lug, 23:14, r <robb....@gmail.com> wrote:
> beh l'ha detta prima plinius ...

Ma io mi riferivo alla versione VBA :-)

con le paternità questo 3d nno ci hai
> azzeccato molto :-)

Eh lo sai che coi nomi non vado molto d'accordo.

Bye!
scossa

plinius

unread,
Jul 20, 2010, 1:08:40 PM7/20/10
to

"r" <robb...@gmail.com> ha scritto nel messaggio
news:d268e6d5-c29b-4005...@g19g2000yqc.googlegroups.com...

********************

Strano ma vero... questa UDF
-----------------------------
Function rifcol(n As Long, Optional ex As String) As String
n = n - 1
rifcol = Chr(n Mod 26 + 65) & ex
n = n \ 26
If n > 0 Then rifcol = rifcol(n, rifcol)
End Function
-----------------------------

è 9 volte più veloce dell'altra
-----------------------------
Sub prova()
Dim k As Long, i As Long, j As Long, a1 As String, a2 As String
Dim tm0 As Single, tm1 As Single, tm2 As Single
tm0 = Timer
For k = 1 To 1000
For i = 1 To 256
j = i
a1 = Replace(Cells(1, j).Address(False, False), "1", "")
Next
Next
tm1 = Timer
For k = 1 To 1000
For i = 1 To 256
j = i
a2 = rifcol(j)
Next
Next
tm2 = Timer
Debug.Print tm1 - tm0, tm2 - tm1
End Sub
-----------------------------

I tempi, sul mio PC, sono dell'ordine di 3,875 secondi e 0,453125 secondi

E.


Scossa

unread,
Jul 20, 2010, 1:25:58 PM7/20/10
to
On 20 Lug, 19:08, "plinius" <punto.linea...@LEVARElibero.it> wrote:

> -----------------------------
> Function rifcol(n As Long, Optional ex As String) As String
> n = n - 1
> rifcol = Chr(n Mod 26 + 65) & ex
> n = n \ 26
> If n > 0 Then rifcol = rifcol(n, rifcol)
> End Function
> -----------------------------

Ciao Plinius,

complimenti! bellissima ricorsiva.
Inoltre non ha limiti al numero:
per esempio 1.000.000 -> BDWGN


Bye!
Scossa

plinius

unread,
Jul 20, 2010, 1:30:17 PM7/20/10
to

"Scossa" <scos...@gmail.com> ha scritto nel messaggio
news:7b7036c1-c30a-460e...@w12g2000yqj.googlegroups.com...

Grazie :-)
...anche se continuo a pensare che per quello scopo specifico non valga la
pena di scomodare il VBA e =SOSTITUISCI(INDIRIZZO(1;RIF.RIGA();4);1;"") sia
la via più immediata e sbrigativa.
Ciao,
Enrico


Bruno Campanini

unread,
Jul 24, 2010, 8:33:56 AM7/24/10
to
"Scossa" <scos...@gmail.com> wrote in message
news:850d238b-e959-4bc7...@r27g2000yqb.googlegroups.com...

> Qualcosa non va:
>
> DecTo26(26) -> A@
> DecTo26(52) -> B@

Sì, in effetti...
Questa dovrebbe andar meglio.

===============================
Public Function DecTo26(n As Long) As String
Dim S As String

Do While n


n = n - 1

S = Chr(n Mod 26 + 65)
DecTo26 = S & DecTo26


n = n \ 26
Loop

End Function
===============================

Bruno

Bruno Campanini

unread,
Jul 24, 2010, 8:58:37 AM7/24/10
to
"Bruno Campanini" <brun...@libero.it> wrote in message
news:4c4addc4$0$31378

> Sě, in effetti...


> Questa dovrebbe andar meglio.
>
> ===============================
> Public Function DecTo26(n As Long) As String
> Dim S As String
>
> Do While n
> n = n - 1
> S = Chr(n Mod 26 + 65)
> DecTo26 = S & DecTo26
> n = n \ 26
> Loop
>
> End Function
> ===============================

Non č farina del mio sacco.
Č una rielaborazione di una formula in C++

Bruno

Scossa

unread,
Jul 25, 2010, 7:57:58 AM7/25/10
to
On 24 Lug, 14:33, "Bruno Campanini" <bruno...@libero.it> wrote:

> Sì, in effetti...
> Questa dovrebbe andar meglio.

OK, ora ci siamo :-)

Tutte soluzioni interessanti, sia la "tua" che quella di Plinius.

Bye!
Scossa

0 new messages