Humm... non spieghi in che senso non ti funziona, ma immagino che ti sorprenda il fatto che non riesci a mettere in Apice l' esponente.
Purtroppo questo e' normale, in quanto una function non puo' manipolare il formato delle celle; per quello che ne so e' un limite invalicabile, quindi se vuoi proprio ottenere l' effetto devi usare i caratteri unicode corrispondenti ai simboli che vuoi rappresentare; un po' come avevamo fatto tempo fa con la Function chemical (ricordi? Vedi
viewtopic.php?f=26&t=95492&p=547433#p547369)Come difficolta' residua c' e' che la codifica dei superscript non e' sequenziale; se 0=2070(hex), 4=2074, 5=2075 etc i superscript di 1-2-3 sono rispettivamente 00B9, 00B2 e 00B3
Mi sembra anche che il tuo algoritmo sbagli di una grandezza (es 0,0012345 viene tradotto in 1,2345 . 10-4), che sia ambiguo sui numeri positivi (es 22,3456 viene tradotto con 22,3456 . 10-0, una volta corretto l' errore dell' esponente), che vada in crisi con valori negativi e che soprattutto mandi in crisi il pc se myVal e' Zero.
Cio' detto la mia Function Expo e' la seguente:
- Codice: Seleziona tutto
Function Expo(ByVal myVal As Double, Optional ByVal myDecimal As Long = 15) As String
'by Anthony47, vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=96534
'Trasforma un numero in una stringa rappresentante la sua notazione scientifica
'Uso:
'=Expo(ilNumero[;NumeroDecimali])
'
'Se NumeroDecimali e' omesso verranno presentati i decimali presenti, ma max 14
' (e' il limite di excel...)
'
'RICHIEDE la presenza anche della Function Superscr
'
Dim GSign As String, Sign As String, Espon As String
Dim Posit As Long, I As Long, Fatt As Long
'
'Gestione positivo/negativo
If myVal < 0 Then GSign = "-": myVal = Abs(myVal)
'Gestione valore 0
If myVal = 0 Then Expo = "0,0": Exit Function
'Gestione segno potenza
If myVal < 1 Then Sign = ChrW(8315) 'Else Sign = ChrW(8314) '8314="+"
'
'Gestione numeri superiori a 10
Posit = 0
Do Until myVal < 10#
myVal = myVal / 10#
Posit = Posit + 1: DoEvents
Loop
'
'Gestione numeri inferiori a 1
Fatt = 0
Do Until myVal >= 1#
myVal = myVal * 10#
Fatt = Fatt + 1: DoEvents
Loop
'
'Esporta risultati
Espon = (Fatt + Posit)
Expo = GSign & Left(myVal, myDecimal + 2)
If Espon > 0 Then
Expo = Expo & " * 10" & Sign & Superscr(Espon)
End If
End Function
Function Superscr(ByVal Esponente As Long) As String
'restituisce una stringa con caratteri unicode corrispondente al valore
' "Esponente" in superscript
' Max 9 digit!
'
If Esponente > 9 Then UStr = Superscr(Int(Esponente / 10))
Esponente = Esponente Mod 10
Select Case Esponente
Case 1
Superscr = ChrW(185)
Case 2
Superscr = ChrW(178)
Case 3
Superscr = ChrW(179)
Case Else
Superscr = ChrW(8304 + Esponente)
End Select
Superscr = UStr & Superscr
End Function
Uso:
-inserire in un Modulo standard del vba (non un modulo di foglio) e poi usare una formula del tipo
- Codice: Seleziona tutto
=Expo(ilNumero[;NumeroDecimali])
Se NumeroDecimali e' omesso verranno presentati i decimali presenti, max 14
(e' il limite di excel...)
Notate che il codice di sopra contiene DUE funzioni; la Function Expo, che fa la conversione di cui stiamo parlando ma si appoggia alla Function Superscr. Questa seconda e' quella che realizza la conversione dell' esponente in caratteri "superscript", e puo' anch' essa essere usata il formule del tipo
- Codice: Seleziona tutto
=Superscr(Numero)
che restituiranno una stringa con quel numero in superscript, anche in formule piu' articolate quali
- Codice: Seleziona tutto
="E=MC"&Superscr(2)
Ricordate che non tutti i font supportano bene i caratteri superscript unicode; se la resa non e' decorosa cercate un altro font (es Calibri, oppure anche Arial Unicode)
Ciao.