Potremmo scartare le ipotesi in cui ci siano €, $ etc.
Questi con cerca&sostituisci si eliminano e basta!
E' stata una mia scelta non entrare nel merito, perchè quando ci son di
mezzo le lettere è un po' più complicato e forse è meglio vedere caso
per caso...
Comunque il posto dove puoi manipolarle è commentato! ;-)
Rimane questa è una lista ragionevole di possibilità:
'1500.256 fallisce trasformandolo in data
In effetti se leggi i commenti nella macro questa situazione l'ho
lasciata in sospeso perchè potrebbe essere sia separatore deidecimali
sia uno di migliaia...
Nel caso che porti come esempio è quasi certamente un separatore di
decimali, ma in 15.394 cos'è?
15 mila 394 oppure 15,394?
Quindi bisogna mettere ulteriori controlli, oppure fare in modo di
chiedere all'utente cosa fare.
'1'500.2 fallisce bloccando la macro
e via così con tutte le conbinazioni con l'apostrofo a delimitare le
centinaia...
Già, avevi citato solo virgola e punto e io non avevo considerato
l'apostrofo...
ma anche questi, come € e $ si possono tirare via con un cerca e
sostituisci senza incasinare i numeri... e magari anche via macro
facendolo come prima operazione su ogni cella!
Qualcosa ho fatto. ;-)
(analizza solo le colonne)
:-)
Se e quando riuscirai a estrarre anche le righe da quel rangeAddress
mi avrai risolto un bel problema...
(Non vale selezionare/attivare il range per poi farglielo leggere
un'altra volta...) :-)
In realtà ho scritto che legge solo le colonne perchè poi la macro aveva
un unico ciclo for e non avevo voglia di modificarla troppo! :-)
(svogliato...)
Se guardi in fondo al primo modulo ho messo 4 function che fanno proprio
quello che vuoi sull'indirizzo restituito dal listener.
Si chiamano "getColonnaIniziale", getColonnaFinale", getRigaIniziale" e
"getRigaFinale" ed a tutte dei passare la stringa restituita dal
listener come argomento.
Fonti da cui ho trovato spunto:
http://www.oooforum.org/forum/viewtopic.phtml?t=9762
http://www.oooforum.org/forum/viewtopic.phtml?t=24353
che Paolo ha suggerito nella lista dev-it,
Grande Paolo!!
Concordo!
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
a = getRange()
d = getColonnaIniziale(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).Value
Tipo2 = oFoglio.getCellByPosition(NumCol, g).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
if InStr(Tipo2, "'") > 0 then
Tipo2 = join(split(Tipo2,"'"),"")
Tipo2 = Trim(Tipo2)
end if
Dim h As Integer
Dim i As Integer
Dim l As String
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
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 getColonnaIniziale(ByVal sAddress as string) as string
dim cellRange as object
dim currentSheet as object
dim column as object
currentSheet = ThisComponent.CurrentSelection.getSpreadSheet()
cellRange = currentSheet.getCellRangeByName(sAddress)
column = cellRange.getColumns()
getColonnaIniziale = column.elementNames(0)
end function
function getColonnaFinale(ByVal sAddress as string) as string
dim cellRange as object
dim currentSheet as object
dim column as object
currentSheet = ThisComponent.CurrentSelection.getSpreadSheet()
cellRange = currentSheet.getCellRangeByName(sAddress)
column = cellRange.getColumns()
getColonnaFinale = column.elementNames(column.getCount() - 1)
end function
function getRigaIniziale(ByVal sAddress as string) as string
dim cellRange as object
dim currentSheet as object
dim row as object
currentSheet = ThisComponent.CurrentSelection.getSpreadSheet()
cellRange = currentSheet.getCellRangeByName(sAddress)
row = cellRange.getRows()
getRigaIniziale = cellRange.RangeAddress.StartRow
end function
function getRigaFinale(ByVal sAddress as string) as string
dim cellRange as object
dim currentSheet as object
dim row as object
currentSheet = ThisComponent.CurrentSelection.getSpreadSheet()
cellRange = currentSheet.getCellRangeByName(sAddress)
getRigaFinale = cellRange.RangeAddress.EndRow
end function
REM **** Modulo 2 ********
Global oRangeSelectionListener As Object
Private sAddress as string
function getRange() as string
sAddress = ""
TestRangeSelection
do
wait 100
loop while sAddress = ""
getRange = sAddress
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
sAddress = 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]