Emanuele ha scritto:
L'output!
Nel caso sia numero, dipende dai settaggi di OO e da come è impostato
l'SO... e in ogni caso non mi sembra rappresenti un problema.
Se il SO è impostato in italiano (o per lo meno in modo che la virgola
sia il separatore decimali) no. ^_^
Per non aver problemi di questo genere sarebbe da modificare...e non so
di preciso come...
Non vorrei prendere l'ennesimo svarione... ma una volta che è convertito
in numero la sua visualizzazione dipende solo dai settaggi!
Per questo ipotizzavo il piano B, ovvero la form dove l'utente potesse
scrivere il ruolo di punti e virgole...
Sì, potrebbe essere un'idea.
Vediamo se ho capito.
All'inizio chiedi all'utente: "In questo foglio cosa ti aspetti sia il
separatore dei decimali?" Opzioni: punto e virgola.
Qualcosa del genere...
Dopo di che vai a controllare all'interno del foglio.
Continuiamo con l'esempio, mettiamo che hai scelto "punto", quindi se
trovi un numero tipo "5,555.44" lo converti in "5555,44" (perché la
virgola è il separatore di decimali del sistema).
Ora se trovi ad esempio "5.555,44" cosa fai?
Tu all'inizio hai detto che nel foglio ti aspetti che i decimali siano
separati con un punto, ma qui è il contrario: te ne freghi e "lo
converti" in numero lasciandolo com'è o lo tratti come un'errore perché
non è quello che ti aspettavi?
Se è stato stabilito che il range ha il punto come separatore decimale
inevitabilmente la stringa '5.555,44 e da mantenere come testo!
Sto solo cercando di capire per evitare di partire a spron battuto per
poi scoprire di aver capito il contrario. :-)
No no, hai capito bene! Ma non sono del tutto certo che l'idea sia
buona! :-)
Per questo vorrei ci riflettissi ancora un momento.. e vorrei anche
sentire l'opinione di Lido.
Ma credo che una variabile che contenga quell'informazione tu sappia
bene come utilizzarla...
Sai che non ne son tanto sicuro... ^_^
Io speravo di si! :-)
In realtà bisogna rinunciare a del sudato codice... e questo - mi rendo
conto - è seccante!
- eliminare gli spazi...
(Anzi qui mi dicevi che c'era un problema....)
Ciò che mi è venuti in mente è che se si eliminano gli spazi "a priori"
(su "Tipo2" per chi ha letto la sub), e poi questo risulta non essere
una stringa convertibile hai perso lo spazio che faceva parte
"dell'informazione".
Ovviamente in quel caso occorre recuperare la stringa originale!
La dove dici che Tipo2 = Cell.string si aggiunge
Tipo_0 = Tipo2 così si conserva la stringa originale per quell'uso.
(non so se l'hai capito, ma tendo ad essere molto
pignolo...)
La pignoleria in questi casi è cosa buona e giusta!
:-)
allego la tua macro "tal quale" con la sola aggiunta della inputbox...
ciao
Bart
REM ***** BASIC *****
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 CON LA SOLA AGGIUNTA DELLA MSGBOX E INPUTBOX
' 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()
IF msgbox (" Hai selezionate questo range... " & CHR$(10)_
& "Eseguo la conversione in numeri di queste celle?" & CHR$(10)_
& "(Il testo originale non verrà modificato) PROSEGUO?..." & ""
,36, "") = 6 then
InputVal = InputBox("I decimali sono definiti da virgole o
punti? ",_
"Scelta del simbolo usato per definire i
decimali", "VIRGOLA")
if InputVal = "VIRGOLA" then
InputVal = ","
else
InputVal = "."
end if
print InputVal
else
exit sub
end if
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]