Bernardini Lido ha scritto:

ho preferito: if isnumeric(Tipo2) then
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
> ...zot..

Ottimo! Sembra funzionare senza problemi...

...zott...
                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

Anche questo mi sembra buono!  Adesso è quasi leggibile anche da me!!

( Altre due proprietà della cella a titolo informativo
com.sun.star.table.CellContentType.EMPTY
com.sun.star.table.CellContentType.FORMULA )

Perchè non usiamo amche queste?
Empty è uno dei casi contemplati... e già funziona, ma migliorerebbe l'eleganza del codice.

La formula è un caso finora non contemplato... ma non si può escludere di incontrarlo. Io propenderei per trattarlo come un testo come gli altri "non traducibili..."
Cosa ne pensate?

Sotto riporto la sub con le modifiche

REM  *****  BASIC  *****

Sub Che_Digerisce_Quasi_Tutto_e_Lo_Converte_In_Numeri()

Ancora "Ottimo" !!! :-), ma sono riuscito ad incepparla su una stringa mista sul tipo:
"Pippo ha 1350,00 €"
Dopo un attimo di confusione ho capito che a mandarla in crisi sono le virgole e i punti... ovvero un testo che contiene quei caratteri dà errore...

Ancora non abbiamo un paracadute per tutti i casi che non riesce a tradurre...

Allo scopo ho provato a ri-mettere on error, con un msgbox che avvertiva del fatto chiedendo se proseguire, in caso "Proseguo si!" copiava la cella e con un deprecabile goto riprendeva il For con un valore di g aggiornato... ma proprio questa parte non funziona bene... (non ho ancora capito perchè...)
Sostanzialmente funziona solo la prima volta...
quando incontra un testo anomalo la seconda volta e provoca l'atteso errore, invece di andare ad eseguire
errore_stringa apre l'editor del basic e si ferma...

Vi posto il codice ... spero abbiate soluzioni migliori della mia solita "pezza"... (che stavolta nemmeno funziona... :-( )


Gli ho fatto colorare di rosso lo sfondo della cella, puoi fare
quello che ritieni più opportuno.

Propenderei per un rosso meno intenso... :-)

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

Dialoghi?  Mmmm... la vita mi sembra già abbastanza complicata...,
ma devo ammettere che quelli che mi hai confezionato sono eccellenti.

Nella prima appare la voce a cui si riferisce l' eventuale valore strampalato
Nella seconda il suddetto valore

Credo sia meglio selezionare il testo "anomalo" direttamente sulla sheet... è più "diretto"...

La terza vuota per immettere il valore corretto che verrà copiato, sempre se di valore si tratta

Non riesco ad immaginare una situazione in cui quel testo debba essere modificato a manina... ma ma ci sono un sacco di cose che "non avrei mai immaginato"... :-)

Vari pulsanti per le azioni da intraprendere

Un coppia di pulsanti interessanti potrebbero essere:

"copia il contenuto tal quale"
"copia tutti i testi anomali del range così come sono"
(circa un "SI TUTTI" per interdenderci...)

Oppure inserire un flag da spuntare nella dialog...

Comunque direi che se è per l'importazione dei miei prezzari per Ultimus le dialog non servono... (è già quasi perfetta così (manca solo il paracadute) ), ma se invece si tratta di fare un addon bisogna parlarne...

Ma qualcuno, come addon, lo trova utile?
(non è una domanda retorica...)

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 ?

Formato strano... due punti?

a che serve?
Spiegati meglio...

ciao
Bart


Sub Che_Digerisce_Quasi_Tutto_e_Lo_Converte_In_Numeri()
' versione del 31/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)
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
rifa:
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
For g = Val(e) to Val(f) ' Inizia il ciclo
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
on error goto errore_stringa
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
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
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
exit sub
 errore_stringa:
 'oFoglio.getCellByPosition(NumCol+1, g ).setValue(Tipo2)
 oCellaProblematica = oFoglio.getCellByPosition(NumCol, g)
 ThisComponent.CurrentController.Select (oCellaProblematica)
 If MsgBox  ("Non riesco ad interpretare "_
                & "questa stringa... :-( "& CHR$(10)_
                & "  Proseguo copiando il testo tal quale ?"_
                & "" ,36, "") = 6 then
                 oFoglio.getCellByPosition(_
                        NumCol+1, g ).setString(Tipo2)
                oMycell = oFoglio.getCellByPosition(NumCol+1, g )
                oMycell.CellBackColor = 16711680
                e = g+1
                goto rifa
end if
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
end sub

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Rispondere a