Cortesemente vorrei sapere come si calcola il resto del seguente numero per 97: =resto(330542811101000000123456182900;97) ho provato per alcuni giorni ma non ci sono riuscito
La domanda ha due risposte:
1) Con le funzioni di excel NON SI PUO' FARE;
Il problema non e' la mancanza di una funzione idonea (che esiste: RESTO(Dividendo;Divisore), ma la strutture stessa di rappresentazione dei dati di excel. Infatti "Excel memorizza e calcola con 15 cifre significative di precisione" (dall' help on line, voce Precisione dei calcoli). Un numero a 30 cifre e' quindi stratosfericamente piu' alto di quanto excel puo' gestire; il che non significa che excel "non ci prova", ma che sia la rappresentazione che i calcoli sono limitati a 15 cifre significative.
Provate a digitare il numero a 30 cifre dato sopra, poi formattate la cella come "Numero" con 0 decimali, e vedrete che tutta la parte bassa e' stata sostituita da "zeri"; potete digitare numeri ben piu' grandi di 15 cifre (in effetti potete inserire valori fino a 1,79769313486231E308, cioe' 1,79769xyz moltiplicato per 10 elevato a 308; insomma un numero di 308 cifre!) ma solo i 15 digit piu' significativi saranno memorizzati e usati per i calcoli).
Con questi limiti (in effetti piu' che ragionevoli per un programma di tipo "Office"), calcolare il vero "resto" di una operazione con un operatore a 30 cifre e' quindi impossibile.
2) PERO' si puo' fare con una "user defined function" che estenda questo limite di calcolo;
Il codice per questa "cosa" e' il seguente:
- Codice: Seleziona tutto
Function StrDivid(Dividen As String, Divisor As String, Optional R_R As Boolean = True) As String
'Calcola il QUOZIENTE o il RESTO di una divisione i cui termini sono
' rappresentati da "stringhe"
' (c) by Anthony47 2008
'Uso:
' =StrDivid(Dividendo as String;Divisore as String [;Quoziente/Resto as 0/1])
' Il parametro Quoziente/Resto e' opzionale:
' 1 o mancante = Quoziente
' 0 = Resto
'
' Esempio =StrDivid("123456";"333") restituisce quoziente "370"
' mentre =StrDivid("123456";"333";0) restituisce il resto "246"
'Per convertire il risultato da stringa a valore anteporre
' "--" a StrDivid, senza apici (cioe' doppia negazione)
'
Dim Avan As String, StrRis As String
Dim LDen As Integer, LSor As Integer, I As Integer
Dim SDen As Long, VSor As Long, SubRis As Long
LDen = Len(Dividen)
LSor = Len(Divisor)
VSor = Val(Divisor)
For I = 1 To LDen
SubRis = 0
If Asc(Mid(Dividen, I, 1)) > 57 Or Asc(Mid(Dividen, I, 1)) < 48 Then
StrDivid = "#NUM!": Exit Function
End If
SDen = Val(Avan & Mid(Dividen, I, 1))
Sottr:
If SDen >= VSor Then
SDen = SDen - VSor
SubRis = SubRis + 1
End If
If SDen >= VSor Then GoTo Sottr
StrRis = StrRis & SubRis
Avan = SDen & ""
Next I
If R_R = True Then StrDivid = StrRis Else: StrDivid = Avan
End Function
Da excel, aprite il vba (l' editor delle macro) con Alt-F11; poi Menu /Inserisci /Modulo; copiate il codice dato sopra e incollatelo nel frame di dx.
A questo punto sul foglio di lavoro inserite ad esempio in A1 il Dividendo sotto forma di stringa (anteponete un "apostrofo" prima dei numeri, o formattate prima le celle come Testo), e in A2 il Divisore (idem), e scrivete la vostra formula, es
- Codice: Seleziona tutto
=StrDivid(A1;A2;0)
- Codice: Seleziona tutto
=--StrDivid(A1;A2;0)
Ovviamente potete combinare questa funzione con le altre offerte da excel; es
- Codice: Seleziona tutto
=SE(--StrDivid(A11;B11;0)>C11;Se vero; Se falso)
Ah, dimenticavo: la divisione tra il numerone dato e 97 da' come quoziente 3407657846402061856942847246 e come resto 38.
Spero di non avervi annoiati; ciao.