Bart Aimar ha scritto:
> [EMAIL PROTECTED] ha scritto:
> > ho preferito: if isnumeric(Tipo2) then
> >
> > in quanto nel primo caso zero è comunque un numero e quindi deve
> > essere copiato...a meno che vuoi trattarlo come caso particolare
>
> Funzionano entrambe! Ma isnumeric mi sembra più corretto.
Avevo pensato anch' io a isnumeric(), ma in determinate circostanze
mi dava dei problemi
Allora ho pensato di rilevare il tipo di cella invece che il tipo del
contenuto della cella con la proprietà Type
Bozza di codice:
For g = Val(e) to Val(f) ' Inizia il ciclo
Cell = oFoglio.getCellByPosition(NumCol, g)
Select Case Cell.Type
Case com.sun.star.table.CellContentType.VALUE
... Codice per la manipolazione dei numeri
Case com.sun.star.table.CellContentType.TEXT
... Codice per la manipolazione delle stringhe
End Select
Next
( Altre due proprietà della cella a titolo informativo
com.sun.star.table.CellContentType.EMPTY
com.sun.star.table.CellContentType.FORMULA )
> > 2) a questo pezzo: <code> For g = Val(e) to Val(f) ' Inizia il ciclo
> >.....
> > ho preferito: <code> For g = Val(e) to Val(f) ' Inizia il ciclo ...
>
> Anche "rifa:" è un brutto espediente... meglio la tua soluzione!
Questo risolve anche il problema del goto
Non c' è bisogno neanche di
if not(Tipo = "" or Tipo2 = "") then
perchè viene elaborato solo stringhe o valori le celle vuote "passano oltre"
Sotto riporto la sub con le modifiche
REM ***** BASIC *****
Sub Che_Digerisce_Quasi_Tutto_e_Lo_Converte_In_Numeri()
' versione buona del 27/05/06
' da azionare con range pre-selezionato
' modificata con inserimento colonna
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 oMycell As Object
Dim oMyRange As Object
Dim NumCol As Integer
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)
For g = Val(e) to Val(f) ' Inizia il ciclo
'***************************************************************
Cell = oFoglio.getCellByPosition(NumCol, 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
'***************************************************************
oFoglio.getCellByPosition(NumCol+1, g ).setValue(Tipo)
oMycell = oFoglio.getCellByPosition(NumCol+1, g )
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 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 ne virgole ne punti
'Potrebbe contenere del testo
'Ci sono varie cose da fare...
' QUALI???
oFoglio.getCellByPosition(NumCol+1, g ).setString(Tipo2)
oMycell = oFoglio.getCellByPosition(NumCol+1, g )
oMycell.CellBackColor = 16711680 ' = 4 'Valore ##.##0,00
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
oFoglio.getCellByPosition(NumCol+1, g ).setValue(cDbl(Tipo2))
oMycell = oFoglio.getCellByPosition(NumCol+1, g )
oMycell.NumberFormat = 4
end if
'****************************************************
End Select
'****************************************************
Next
end sub
> > Gli ho fatto colorare di rosso lo sfondo della cella, puoi fare
> > quello che ritieni più opportuno.
>
> Ottimo! Credo gli aggiungerò uno stop; e l'utente potrà scegliere se
> proseguire o fermarsi a controllare l'anomalia...
> (perché indubbiamente si tratta di una anomalia...)
Perchè non far apparire un piccolo dialogo con tre caselle di testo
Nella prima appare la voce a cui si riferisce l' eventuale valore strampalato
Nella seconda il suddetto valore
La terza vuota per immettere il valore corretto che verrà copiato, sempre se
di valore si tratta
Vari pulsanti per le azioni da intraprendere
Ciao
Lido
PS Nell' importazione dei listini in OOo ti è mai capitato di trovare dei
numeri appena copiati (per intenderci prima di darli in pasto alla sub che
digerisce tutto) formattati così: ##0.00.00 ?
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]