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]

Rispondere a