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.
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
...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.
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.
===================================
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
Uffaaa... allora così è meglio no?!
=SOSTITUISCI(INDIRIZZO(1;RIF.RIGA();4);1;"")
E :-)
ci provo anch'io
Function LetteraA1(n As Long) As String
LetteraA1 = Replace(Cells(1, n).Address(False, False), "1", "")
End Function
saluti
r
che poi è la traduzione di quanto proposto da plinius
saluti
r
--
---------------------------
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.
>> 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
> ===================================
> 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
non ho il 2007 ... quindi non so cosa risponderti.
ciao
r
Qualcosa non va:
DecTo26(26) -> A@
DecTo26(52) -> B@
Bye!
Scossa
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
però è più corta :-)
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
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
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
beh l'ha detta prima plinius ... con le paternità questo 3d nno ci hai
azzeccato molto :-)
ciao
r
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
********************
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.
> -----------------------------
> 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
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
> 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
> 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
> Sì, in effetti...
> Questa dovrebbe andar meglio.
OK, ora ci siamo :-)
Tutte soluzioni interessanti, sia la "tua" che quella di Plinius.
Bye!
Scossa