› Sviluppare funzionalita su Microsoft Office con VBA › Una piccola sfida "intuitiva"
-
AutoreArticoli
-
Visto che l'ambiente un po' langue eccovi una piccola sfida nata da un'intuizione probabilmente banale quanto inutile.
Si chiede di scrivere la sub Numero() che memorizzi nella variabile nNumero il numero 3745245841850493 (3.745.245.841.850.493) e lo mostri, integro (senza arrotondamento) in un MsgBox:
Il codice deve quindi contenere le istruzioni
Sub Numero() ''''' nNumero = nNumero + 125 MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0") ''''' End SubN.B.: la Sub deve funzionare anche con versioni vecchie di Excel (almeno fino alla 2010) a 32 bit.
Ciao Scossa così va bene
Sub Numero() nNumero = "3745245841850493" MsgBox nNumero & vbCrLf & Format(nNumero, "0,000") End SubCiao,
per evitare questa soluzione avevo già corretto la richiesta (vedi messaggio iniziale), quindi non va bene: nNumero deve essere un numero.
Buonaserata a tutti,
ci provo con questa:
Sub Numero() Dim nNumero As Variant nNumero = CDec(374524584) * 10000000 + 1850493 nNumero = nNumero + 125 MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0") End SubA presto
Mi sembra che il numero non corrisponda (3745245840185618) però la soluzione potrebbe andare.
Ma il bello deve ancora arrivare
Buonasera scossa,
ho corretto il numero caricato come decimal ... mi ero perso uno zero nel mezzo di 1850493
Sì, non avevo visto bene il codice e ho frainteso, vedio messaggio corretto sopra.
Salve
Potrebbe essere questa una delle soluzioni?
`Option Explicit Sub MsgNumero() '3745245841850493 Dim dNum As Double dNum = 3.74524584185049E+15 dNum = sNum + 125 MsgBox Format(dNum, "################") & vbLf & _ Format(dNum, "####,###,###,###,###") End Sub`Ciao,
Mario
Potrebbe essere questa una delle soluzioni?
Non mi pare corretta se usi Double hai l'arrotondamento alla decina 3.745.245.841.850.490 anziché 3.745.245.841.850.493
In realtà la soluzione è molto più semplice:
Sub Numero() Dim nNumero As Variant nNumero = CDec("3745245841850368") nNumero = nNumero + 125 MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0") End Sube ricordavo, male, che il tipo Decimal fosse a 8 byte e non 12.
Comunque non era questo il risultato che volevo ottenere
e lo scopo della sfida.Il tutto è nato perché volevo verificare quanto affermato in questa nota, in particolare
Implicit conversions of LongLong to smaller integrals are not allowed.
interpretandola come "una variabile LongLong non viene implicitamente convertita in Long o Integer"
Per cui mi serviva creare una variabile di tipo LongLong ma sugli Excel a 32 bit Dim As LongLon non è riconosciuto e la funzione di conversione
cLngLng()non è disponibile .... però c'è uno stratagemma per creare concretamente una variabile di tipo LongLong (vartype 20) ed utilizzarla: dichiararla Variant e assegnarle il valore della proprietàCells.CountLargeSub TestLongLong() Dim nNumero As Variant nNumero = Cells.CountLarge * 500000000 + 17312312 Debug.Print VarType(nNumero) Debug.Print nNumero, Format(nNumero, "#,##0") End Subsulla base della predetta nota credevo che una volta creata sarebbe bastato fare l'operazione contraria:
Sub TestLongLongRev() Dim nNumero As Variant nNumero = Cells.CountLarge * 500000000 + 17312312 Debug.Print VarType(nNumero) Debug.Print nNumero, Format(nNumero, "#,##0") nNumero = (nNumero - 17312312) / 500000000 Debug.Print VarType(nNumero) Debug.Print nNumero, Format(nNumero, "#,##0") End Subperò anche se il risultato è corretto Vartype restituisce 5 (vbDouble)
Ciao a tutti
Option Explicit Sub Numero() Dim nNumero As LongLong nNumero = "3745245841850368" '3745245841850493 nNumero = nNumero * 1 nNumero = nNumero + 125 MsgBox nNumero & vbCrLf & Format(nNumero, "0,000") End SubDim nNumero As LongLong
Excel 32 bit non consente il tipo LongLong (come precisato nel post iniziale la soluzione deve essere valida anche sui sistemi a 32 bit).
Comunque leggi tutta la mia ultima risposta.
Visto che l'ambiente un po' langue eccovi una piccola sfida
Grazie scossa
non ho letto ancora niente, voglio leggere la sfida e provare, poi leggo il resto
datemi un pochino di tempoPropongo la mia.
Adesso leggo tutto il thread
se ho contravvenuto a istruzioni gia' date, chiedo scusa da adesso.`Sub Numero() Dim nNumero '3745245841850493 nNumero = "3745245841850493" MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0") nNumero = Left(nNumero, Len(nNumero) - 3) & (Right(nNumero, 3) + 125) '3745245841850618 MsgBox nNumero & vbCrLf & Format(nNumero, "#,##0") End Sub `Edit: ho letto il thread, la risposta di scossa che invalida la mia proposta e il successivo post #51585 che utilizza CountLarge. Non e' affatto una sfida intuitiva
Non e' affatto una sfida intuitiva
Perché no?
è intuitiva perché ho avuto l'intuizione di usare la proprietà .CountLarge
è intuitiva perché ho avuto l'intuizione
Ah ok
ma tu sei di un altro pianeta e non conti
ciao,
soluzione !artigianale" per semplificare le cose. Scrive il numero con i punti delle migliaia nella msgbox, non riesco ora a scrivere anche il numero senza punti
Sub msgnumerica() Range("A1") = 3.74524584185049E+15 Range("A1").NumberFormat = "#,##0" Columns("A:A").EntireColumn.AutoFit MsgBox Range("A1").Text End SubScrive il numero con i punti delle migliaia nella msgbox,
Non va bene, c'è un arrotondamento alla decina: 3.745.245.841.850.490 anziché 3.745.245.841.850.493
ora non arrotonda
Sub msgnumerica() d = Right("3745245841850493", 3) s = Left("3745245841850493", 13) Range("A1") = s Range("A1").NumberFormat = "#,##0" & "." & d Columns("A:A").EntireColumn.AutoFit MsgBox Range("A1").Text End SubOk, ma la richiesta non era così banale; leggi i primi post (#51574 e successivi).
cosi mi pare ci siamo, non ho controllato tutte le risposte in caso ce ne sia già una simile, se possibile, cancellate questo post grazie
Sub msgnumerica() Dim c As Integer, i As Integer, ris1 As String, ris2 As String Dim num1, num2 num1 = CDec("3745245841850493") num2 = CDec("3745245841850493") + 125 l = Len(num1) For i = l To 1 Step -1 c = c + 1 ris1 = Mid(num1, i, 1) & ris1: ris2 = Mid(num2, i, 1) & ris2 If c = 3 And i > 1 Then ris1 = "." & ris1: ris2 = "." & ris2 c = 0 End If Next i MsgBox (ris1 & vbCrLf & ris2) End SubCi si potrebbe complicare la vita supponendo che il numero risultante dalla somma del primo con 125 possa avere lunghezza maggiore.....
cosi mi pare ci siamo, non ho controllato tutte le risposte .....
male, perché così ti sfugge il "perché" di questa sfida (#51585).
scossa ha scritto:
però anche se il risultato è corretto Vartype restituisce 5 (vbDouble)Che poi, a pensarci bene, non dovevo neanche meravigliarmi di questo, visto che nNumero l'ho dichiarato as Variant.
-
AutoreArticoli
