L'altra mail l'hai mandata al mio indirizzo, quindi non è arrivata in
lista...
Comunque non è un problema.

>> A me sembra che sia a buon punto
>> L' ho provata in vari modi e non si è mai inciampata
> Inciampa ancora... in situazioni importanti e normali (non in quelle
> estreme...)!
> '5.555 non lo converte e nemmeno
> '2

Piccola dimenticanza... ^_^

>> Daltronde, Bart, se ti aspetti qualcosa di perfetto, questa sub non
>> la userai mai
> Per i casi che avevo sotto i ferri ultimamente funzionava benissimo
> una macro di quelle "superate" (ma vai a sapere adesso qual'era... :-)  )
>
> Alla perfezione non aspiro, ma a quel risultato della macro "superata"
> si!

Ad ogni modo, dei casi da te indicati nel file al momento 2, 3 e 4 ora
li converte.
Non ricordavo avessi parlato di spazi, quindi non li avevo considerati
(mi deve essere sfuggito), ora converte sia quello che hai messo tu
"5,555 " (spazio alla fine), sia eventuali "55 555" (ho semplicemente
fatto in modo che prima di ogni verifica elimina ogni spazio presente
nella stringa).
Per il 2% ho fatto in modo che lo riconosca come testo ed ora lo copia
intatto.
Quello che resta in sospeso è: "389'5,65", secondo te come dovrebbe
essere convertito?
Situazioni simili le ho lasciate in sospeso, perché in verità non vedo
una soluzione "pulita"...
In quel numero c'è sicuramente un errore di battitura, ma in ogni caso
io non so dire dove sia: può essere una virgola di troppo come può
essere l'apice di troppo.
In questi casi devi decidere tu cosa preferisci.

> Una domanda: il codice dentro la mail è identico a quello allegato in
> .bas?

Sì, nella mail la vedi solo perché il programma di posta lo mette in
coda al messaggio.

> Scusa il ritardo con cui rispondo, ma visti i risultati "diversi" che
> si ottenevano ho rigirato un po' lecose...

Siccome non son riuscito a capire bene cosa avevi cambiato e come, son
ritornato a quella che ti ho inviato.

> In questo modo il codice potrebbe stare dentro... senza aggiungere le
> complicazioni del taglia/incolla e del taglia a 72 caratteri con
> codice senza rientri...
> (La macro è ormai troppo complessa per continuare ad incollare il
> codice nella mail.)

Non son sicuro che tutti gradiscano ritrovarsi l'odt come allegato, il
txt è comunque (anche se di poco) più leggero.
Inoltre se apri l'allegato in un notepad qualunque anche i rientri non
hanno alcun problema ;-)


Ciao!
Ema.
Sub Che_Digerisce_Quasi_Tutto_e_Lo_Converte_In_Numeri()
        ' Converte da numeri in formato stringa
        ' a nuneri "veri"
        ' copiandoli su una nuova colonna a lato
        ' versione del 13/06/06
        ' da azionare dopo aver selezionato
        ' il range di celle da convertire
        Dim d As long
        Dim e As long
        Dim f As long
        Dim g As long
        Dim Tipo As Double
        Dim Tipo2 As String
        dim oFoglio As Object
        dim oSelections as object
        Dim oMycell As Object
        Dim oMyRange As Object
        Dim NumCol As Integer
        dim cell as object
        Dim h As Integer
        Dim i As Integer
        Dim l As String
        Dim iPosizionePrimoPunto as integer
        Dim iPosizionePrimaVirgola as integer
        
        dim sPaginaRiferimento as string
        dim oTextSearch as object
        dim aSearchResult as object
        dim iContienePunti as integer
        dim iContieneVirgole as integer
        dim iContieneApici as integer
        Dim aSrcOpt As New com.sun.star.util.SearchOptions
        oTextSearch = CreateUnoService(_
        "com.sun.star.util.TextSearch")
        
        Set oFoglio =_
        ThisComponent.Sheets.getByName(_
        ThisComponent.currentcontroller.activesheet.name)
        oSelections = ThisComponent.getCurrentSelection()
        oMyRange=oSelections.getRangeAddress()
        d = oMyRange.StartColumn 'getColonnaIniziale(a)
        e = oMyRange.StartRow 'getRigaIniziale(a)
        f = oMyRange.EndRow 'getRigaFinale(a)
        NumCol = oMyRange.StartColumn ' definisce il numero della colonna
        oFoglio.Columns.insertbyindex(d+1,1)
        
        Dim oBarra As Object
        oBarra = _
        thisComponent.GetCurrentController.GetFrame.CreateStatusIndicator '''
        oBarra.Start("  Inizio la Conversione", Val(f))
        
        
        For g = Val(e) to Val(f) ' Inizia il ciclo
                
                oBarra.setValue(g)'''
                
                
                Cell = oFoglio.getCellByPosition(NumCol, g)
                oMycell = oFoglio.getCellByPosition(NumCol+1, g )
                
                Select Case Cell.Type
                        Case com.sun.star.table.CellContentType.VALUE
                                ' Se è un valore si limita a copiarlo e 
formattare la cella
                                Tipo = Cell.Value
                                oMycell.setValue(Tipo)
                                oMycell.NumberFormat = 4 'Valore ##.##0,00
                        Case com.sun.star.table.CellContentType.TEXT
                                ' Se è di tipo testo fa una serie di controlli 
per determinare
                                ' che tipo di stringa è
                                ' se trova dei caratteri di testo o delle celle 
vuote
                                ' salta alla cella dopo
                                Tipo2 = Cell.String
                                if not contieneTesto(Tipo2) then
                                        Tipo2 = Trim(Tipo2)
                                        Tipo2 = join(split(Tipo2, " "), "")
                                        iContienePunti = contieneSimboli(Tipo2, 
".")
                                        iContieneVirgole = 
contieneSimboli(Tipo2, ",")
                                        iContieneApici = contieneSimboli(Tipo2, 
"'")
                                        if (iContienePunti > 0) and 
(iContieneVirgole > 0) and (iContieneApici > 0) then
                                                'Ci sono tutti e tre i simboli: 
non so cosa fare...
                                                errore_stringa(oMycell,Tipo2)
                                        end if
                                        
                                        if (iContienePunti > 0) and 
(iContieneVirgole > 0) and (iContieneApici = 0) then
                                                'Ci sono solo virgole e punti
                                                if getPosLastSymbol(Tipo2, ",") 
> getPosLastSymbol(Tipo2, ".") then
                                                        'l'ultima virgola sta 
più a destra dell'ultimo punto
                                                        if iContieneVirgole > 1 
then
                                                                'C'è più di una 
virgola, non so cosa fare
                                                                
Errore_Stringa(oMycell,Tipo2)
                                                                else
                                                                        'C'è 
una sola virgola copio la stringa
                                                                        
'Controllare la posizione
                                                                        if 
controllaPosizione(Tipo2, ",", ".") then
                                                                                
Copia_Stringa(oMycell,Tipo2)
                                                                                
else
                                                                                
        Errore_Stringa(oMycell,Tipo2)
                                                                        end if
                                                        end if
                                                        else
                                                                'l'ultima 
virgola sta più a sinistra dell'ultimo punto
                                                                if 
iContienePunti > 1 then
                                                                        'C'è 
più di un punto, non so cosa fare
                                                                        
Errore_Stringa(oMycell,Tipo2)
                                                                        else
                                                                                
'C'è un solo punto copio la stringa
                                                                                
'Controllare la posizione
                                                                                
if controllaPosizione(Tipo2, ".", ",") then
                                                                                
        Tipo2 = join(split(Tipo2, ","), "")
                                                                                
        Tipo2 = join(split(Tipo2, "."), ",")
                                                                                
        Copia_Stringa(oMycell,Tipo2)
                                                                                
        else
                                                                                
                Errore_Stringa(oMycell,Tipo2)
                                                                                
end if
                                                                end if
                                                end if
                                        end if
                                        if (iContienePunti > 0) and 
(iContieneVirgole = 0) and (iContieneApici > 0) then
                                                'Ci sono solo punti ed apici
                                                if getPosLastSymbol(Tipo2, ".") 
> getPosLastSymbol(Tipo2, "'") then
                                                        'l'ultimo punto sta più 
a destra dell'ultimo apice
                                                        'Controllare la 
posizione
                                                                if 
controllaPosizione(Tipo2, ".", "'") then
                                                                        Tipo2 = 
join(split(Tipo2, "."), ",")
                                                                        Tipo2 = 
join(split(Tipo2, "'"), "")
                                                                        
Copia_Stringa(oMycell,Tipo2)
                                                                        else
                                                                                
Errore_Stringa(oMycell,Tipo2)
                                                                end if
                                                        else
                                                                'l'ultimo apice 
sta più a destra dell'ultimo punto,
                                                                'non so cosa 
fare...
                                                                
Errore_Stringa(oMycell,Tipo2)
                                                end if
                                        end if
                                        if (iContienePunti = 0) and 
(iContieneVirgole > 0) and (iContieneApici > 0) then
                                                'Ci sono solo virgole ed apici
                                                if getPosLastSymbol(Tipo2, ",") 
> getPosLastSymbol(Tipo2, "'") then
                                                        'l'ultima virgola sta 
più a destra dell'ultimo apice
                                                        'Controllare la 
posizione
                                                        if 
controllaPosizione(Tipo2, ",", "'") then
                                                                Tipo2 = 
join(split(Tipo2, "'"), "")
                                                                
Copia_Stringa(oMycell,Tipo2)
                                                                else
                                                                        
Errore_Stringa(oMycell,Tipo2)
                                                        end if
                                                        else
                                                                'l'ultimo apice 
sta più a destra dell'ultima virgola,
                                                                'non so cosa 
fare...
                                                                
Errore_Stringa(oMycell,Tipo2)
                                                end if
                                        end if
                                        if (iContienePunti > 0) and 
(iContieneVirgole = 0) and (iContieneApici = 0) then
                                                'Ci sono solo punti
                                                'Controllare la posizione
                                                if iContienePunti > 1 then
                                                        'Ci sono molti punti
                                                        if 
controllaPosizione(Tipo2, "", ".") then
                                                                
Copia_Stringa(oMycell,Tipo2)
                                                                else
                                                                        
Errore_Stringa(oMycell,Tipo2)
                                                        end if
                                                        else
                                                                'C'è un solo 
punto
                                                                if 
controllaPosizione(Tipo2, "", ".") then
                                                                        Tipo2 = 
join(split(Tipo2, "."), "")
                                                                        
Copia_Stringa(oMycell,Tipo2)
                                                                        else
                                                                                
if controllaPosizione(Tipo2, ".", "") then
                                                                                
        Tipo2 = join(split(Tipo2, "."), ",")
                                                                                
        Copia_Stringa(oMycell,Tipo2)
                                                                                
        else
                                                                                
                Errore_Stringa(oMycell,Tipo2)
                                                                                
end if
                                                                end if
                                                end if
                                        end if
                                        if (iContienePunti = 0) and 
(iContieneVirgole > 0) and (iContieneApici = 0) then
                                                'Ci sono solo virgole
                                                'Controllare la posizione
                                                if iContieneVirgole > 1 then
                                                        'Ci sono molte virgole
                                                        if 
controllaPosizione(Tipo2, "", ",") then
                                                                Tipo2 = 
join(split(Tipo2, ","), "")
                                                                
Copia_Stringa(oMycell,Tipo2)
                                                                else
                                                                        
Errore_Stringa(oMycell,Tipo2)
                                                        end if
                                                        else
                                                                'C'è una sola 
virgola
                                                                if 
controllaPosizione(Tipo2, ",", "") then
                                                                        
Copia_Stringa(oMycell,Tipo2)
                                                                        else
                                                                                
if controllaPosizione(Tipo2, "", ",") then
                                                                                
        Tipo2 = join(split(Tipo2, ","), "")
                                                                                
        Copia_Stringa(oMycell,Tipo2)
                                                                                
        else
                                                                                
                Errore_Stringa(oMycell,Tipo2)
                                                                                
end if
                                                                end if
                                                end if
                                        end if
                                        if (iContienePunti = 0) and 
(iContieneVirgole = 0) and (iContieneApici > 0) then
                                                'Ci sono solo apici
                                                'Controllare la posizione
                                                if controllaPosizione(Tipo2, 
"", "'") then
                                                        
Copia_Stringa(oMycell,Tipo2)
                                                        else
                                                                
Errore_Stringa(oMycell,Tipo2)
                                                end if
                                        end if
                                        if (iContienePunti = 0) and 
(iContieneVirgole = 0) and (iContieneApici = 0) then
                                                'apparentemente non c'è niente 
che non vada, quindi la copiamo
                                                Copia_Stringa(oMycell,Tipo2)
                                        end if
                                        else
                                                Errore_Stringa(oMycell,Tipo2)
                                end if
                        Case com.sun.star.table.CellContentType.EMPTY
                                'MsgBox("                   Dice la particella 
di sodio                  "_
                                '& CHR$(10) & CHR$(10)  & "                   
CA NON CI STA NISCIUNO!")
                        Case com.sun.star.table.CellContentType.FORMULA
                                ' Questa va fatta in caso di bisogno
                End Select
        Next

        oBarra.End
        msgbox "    La conversione in numeri è "_
        & "terminata... "& CHR$(10) & CHR$(10)_
        & "Le eventuali stringhe che non sono riuscito "_
        & "ad interpretare le ho copiate tali e quali, "_
        & "ma ""segnandole"" con sfondo in rosso! "_
        & "( molto rosso... :-)  )"
end sub

Function getPosLastSymbol(sText as string, sChar as string) as integer
        dim lI as long
        for lI = len(sText) to 0 step -1
                if mid(sText, lI, 1) = sChar then
                        getPosLastSymbol = lI
                        exit function
                end if
        next lI
End Function

Function sequenzaMigliaia(sTesto as string, sExpDec as string, sExpMig as 
string) as boolean
        Dim iSimbPos as integer

        if sExpDec = "" then
                iSimbPos = len(sTesto) - 3
                else
                        iSimbPos = len(sTesto) - 3 - (len(sTesto) - 
InStr(sTesto, sExpDec)) - 1'len(sTesto) - 4
        end if
        do while (mid(sTesto, iSimbPos, 1) = sExpMig)
                iSimbPos = iSimbPos - 4
                if iSimbPos <= 0 then exit do
        loop
        if iSimbPos <= 0 then
                sequenzaMigliaia = true
                exit function
                else
                        sequenzaMigliaia = false
                        exit function
        end if
End Function

Function controllaPosizione(sTesto as string, sExpDec as string, sExpMig as 
string) as boolean
'       Dim iSimbPos as integer
'       Dim bSembraOk as boolean

        if sExpDec = "" and sExpMig = "" then
                controllaPosizione = false
                exit function
        end if
        if sExpDec = "" and not(sExpMig = "") then
                controllaPosizione = sequenzaMigliaia(sTesto, sExpDec, sExpMig)
        end if
        if sExpMig = "" and not(sExpDec = "") then
                if mid(sTesto, len(sTesto) - 3, 1) = sExpDec then
                        controllaPosizione = false
                        exit function
                        else
                                controllaPosizione = true
                                exit function
                end if
        end if
        if not(sExpMig = "") and not(sExpDec = "") then
                controllaPosizione = sequenzaMigliaia(sTesto, sExpDec, 
sExpMig)' and bSembraOk)
        end if
End Function

Sub errore_stringa(oMycell, Tipo2)
'If MsgBox("Non riesco ad interpretare "& "questa stringa...--> "& _
'"' " & Tipo2 & " '" & CHR$(10) & _
'"  Proseguo copiando il testo tal quale ?" & "" ,36, "") = 6 then
oMycell.setString(Tipo2)
oMycell.CellBackColor = RGB(255,0,0)
'end if
End Sub

Sub Copia_Stringa(oMycell,Tipo2)
on error goto gest_errore
oMycell.setValue(cDbl(Tipo2))
oMycell.NumberFormat = 4
exit sub
 gest_errore:
 ' lo so che è una porcata...
 oMycell.setString(Tipo2)
oMycell.CellBackColor = RGB(255,0,0)
'
End Sub

function contieneTesto(sTesto as string) as boolean
        dim sPaginaRiferimento as string
        dim oTextSearch as object
        
        dim aSearchResult as object
        Dim aSrcOpt As New com.sun.star.util.SearchOptions
        
        oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
        
        With aSrcOpt
                .searchFlag = com.sun.star.util.SearchFlags.REG_EXTENDED
                .algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
                .searchString = ".[A-Za-zéèòàçìù%&]"
        End With
        oTextSearch.setOptions(aSrcOpt)

        'L'asterisco serve come trucco per evitare che se il testo è il primo 
carattere
        'il aSearchResult.subRegExpressions sia comunque uguale a zero
        aSearchResult = oTextSearch.searchForward("*" & sTesto, 0,Len(sTesto)+1)
        if aSearchResult.subRegExpressions > 0 then
                contieneTesto = true
        end if
end function

function contieneSimboli(sTesto as string, sSimbolo as string) as integer
        Dim sPaginaRiferimento as string
        Dim iCount as integer
        Dim oTextSearch as object
        Dim aSearchResult as object
        Dim aSrcOpt As New com.sun.star.util.SearchOptions

        oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")

        With aSrcOpt
                .searchFlag = com.sun.star.util.SearchFlags.REG_EXTENDED
                .algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
                if sSimbolo = "." then
                        .searchString = "\" & sSimbolo 'sMigSep & ".*" & 
sDecSep '"'\.[^ ]
                        else
                                .searchString = sSimbolo
                end if
        End With
        oTextSearch.setOptions(aSrcOpt)

        'L'asterisco serve come trucco per evitare che se il testo è il primo 
carattere
        'il aSearchResult.subRegExpressions sia comunque uguale a zero
        aSearchResult = oTextSearch.searchForward("*" & sTesto, 0,Len(sTesto)+1)
        
        if aSearchResult.subRegExpressions > 0 then
                iCount = iCount + 1
        end if
        contieneSimboli = iCount
end function

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Rispondere a