Bart prova con questa soluzione, è un po' più generica, ma non è completa.
Come non detto, c'era un errore (ed anche grosso!!!), questa funziona
sicuramente sui seguenti casi:
34
'33.4
'32.3
'33.223.44,33
233,333,333
Su altri non ho provato...
Ciao!
Emanuele.
REM ***** BASIC*****
REM MODULO 1
option explicit
Sub Che_Digerisce_Quasi_Tutto_e_Lo_Converte_In_Numeri()
Dim a As String
Dim b As String
Dim c As String
Dim d AS String
Dim e As String
Dim f As String
Dim g As Integer
Dim Tipo As Double
Dim Tipo2 As String
dim oFoglio As Object
Dim oMycell As Object
Dim oMyRange As Object
Dim NumCol As Integer
Set oFoglio = ThisComponent.Sheets.GetByName("Sheet1")'Il nome va
cambiato con il nome del foglio
'd = InputBox("Immettere la lettera della Colonna da convertire (es.
A)","Immissione dati")
'e = InputBox("Immettere il numero della riga che inizia la colonna (es.
4)","Immissione dati")
'f = InputBox("Immettere il numero della riga che Finisce la colonna
(es. 35)","Immissione dati")
'Questa serie di input per poter determinare il range da convertire
'a = d + e + ":" + d + f
a = getRange()
d = getColonna(a)
e = getRigaIniziale(a)
f = getRigaFinale(a)
oMyRange = oFoglio.getCellRangeByName(a).getRangeAddress()
NumCol = oMyRange.StartColumn ' definisce il numero della colonna
For g = Val(e) to Val(f) ' Inizia il ciclo
Tipo = oFoglio.getCellByPosition(NumCol, g - 1).Value
Tipo2 = oFoglio.getCellByPosition(NumCol, g - 1).String
if Tipo <> 0 Then ' Se è un numero si limita a formattare
'la cella
oMycell = oFoglio.getCellRangeByName(d + LTrim(Str(g)))
oMycell.NumberFormat = 4 'Valore ##.##0,00
Else ' Altrimenti 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
Dim iPosizionePrimoPunto as integer
Dim iPosizionePrimaVirgola as integer
iPosizionePrimoPunto = InStr(Tipo2, ".")
iPosizionePrimaVirgola = InStr(Tipo2, ",")
if (iPosizionePrimoPunto = 0 and iPosizionePrimaVirgola = 0)
then
'Non ci sono nè virgole nè punti
'Potrebbe contenere del testo
'Ci sono varie cose da fare...
else
if iPosizionePrimoPunto = 0 then
'Ci sono solo virgole
msgbox InStr(iPosizionePrimaVirgola + 1, Tipo2, ",")
if InStr(iPosizionePrimaVirgola + 1, Tipo2, ",")
> 0 then
'C'è più di una virgola, allora sarà un
separatore di migliaia
'Lo rimuovo
Tipo2 = join(split(Tipo2, ","), "")
else
'Cè solo una virgola
if (((len(Tipo2) -
iPosizionePrimaVirgola) < 3) or _
((len(Tipo2) -
iPosizionePrimaVirgola) > 4)) then
'La virgola ha meno di due o più di
4 alla sua destra,
'allora è quasi certamente un
separatore di decimali
'Quindi non facciamo niente
else
'La virgola ha esattamente 3
cifre alla sua destra,
'può essere un separatore di
decimali, ma anche un
'separatore di migliaia, non
posso decidere cosa fare...
end if
end if
end if
if iPosizionePrimaVirgola = 0 then
if InStr(iPosizionePrimoPunto + 1, Tipo2, ".") >
0 then
'Cè più di un punto, allora sarà un
separatore di migliaia
'Lo rimuovo
Tipo2 = join(split(Tipo2, "."), "")
else
'C'è un solo punto
if (((len(Tipo2) - iPosizionePrimoPunto)
< 3) or _
((len(Tipo2) - iPosizionePrimoPunto)
> 4)) then
'Il punto ha meno di due o più di 4
alla sua destra,
'allora è quasi certamente un
separatore di decimali
'Allora sostituiamo il punto con una
virgola
Tipo2 = join(split(Tipo2, "."), ",")
else
'Il punto ha esattamente 3 cifre
alla sua destra,
'può essere un separatore di
decimali, ma anche
'un separatore di migliaia, non
posso decidere cosa fare...
end if
end if
end if
if ((iPosizionePrimoPunto > iPosizionePrimaVirgola)
and _
(iPosizionePrimaVirgola > 0)) then
'Ragionevolmente il punto sarà il separatore dei
decimali
'Togliamo le virgole come separatore delle migliaia
Tipo2 = join(split(Tipo2, ","),"")
'Sostituiamo il punto con la virgola come
separatore dei decimali
Tipo2 = join(split(Tipo2, "."),",")
end if
if ((iPosizionePrimoPunto < iPosizionePrimaVirgola)
and _
(iPosizionePrimoPunto > 0)) then
'Ragionevolmente la virgola sarà il separatore
dei decimali
'Togliamo i punto come separatori delle migliaia
Tipo2 = join(split(Tipo2, "."),"")
'E la virgola la lasciamo alsuo posto
end if
end if
oFoglio.getCellByPosition(NumCol, g - 1).setValue(cDbl(Tipo2))
oMycell = oFoglio.getCellRangeByName(d + LTrim(Str(g)))
oMycell.NumberFormat = 4
end if
Next
end sub
function getColonna(ByVal sA as string) as string
dim sASplit() as string
sASplit() = split(sA, ".")
sASplit() = split(sASplit(1), "$")
getColonna = sASPlit(1)
end function
function getRigaIniziale(ByVal sA as string) as string
dim sASplit() as string
sASplit() = split(sA, ".")
sASplit() = split(sASplit(1), ":")
sASplit() = split(sASplit(0), "$")
getRigaIniziale = sASPlit(2)
end function
function getRigaFinale(ByVal sA as string) as string
dim sASplit() as string
sASplit() = split(sA, ".")
sASplit() = split(sASplit(1), ":")
sASplit() = split(sASplit(1), "$")
getRigaFinale = sASPlit(2)
end function
'********************************************************
'********************************************************
'********************************************************
'REM MODULO 2
Global oRangeSelectionListener As Object
Global sA as string
function getRange() as string
sA = ""
TestRangeSelection
do
wait 100
loop while sA = ""
getRange = sA
end function
Sub TestRangeSelection()
oDocView = ThisComponent.currentController
If Not IsNull(oRangeSelectionListener) Then
oDocView.removeRangeSelectionListener(oRangeSelectionListener)
End If
oRangeSelectionListener = createUnoListener("oDocView_" , _
"com.sun.star.sheet.XRangeSelectionListener")
oDocView.addRangeSelectionListener (oRangeSelectionListener)
Dim mArgs(2) As New com.sun.star.beans.PropertyValue
mArgs(0).Name = "InitialValue"
mArgs(0).Value = "A1"
mArgs(1).Name = "Title"
mArgs(1).Value = "My Title"
mArgs(2).Name = "CloseOnMouseRelease"
mArgs(2).Value = True
oDocView.startRangeSelection(mArgs())
End Sub
sub oDocView_done(oEvent)
'questa routine viene chiamata dal documento
'dopo che l'utente ha finito di selezionare il range
sA = oEvent.RangeDescriptor
oEvent.source.removeRangeSelectionListener(oRangeSelectionListener)
End Sub
sub oDocView_aborted(oEvent)
'questa routine viene chiamata dal documento
'se l'utente non ha selezionato nessun range
oEvent.source.removeRangeSelectionListener(oRangeSelectionListener)
End Sub
sub oDocView_disposing(oEvent)
'questa routine viene chiamata dal documento
'in caso di dipartita del compianto listener
End Sub
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]