Bart Aimar ha scritto:
> > ( 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?
> ...
> Cosa ne pensate?
Nel codice che ti riporto sotto ce l' ho messe vedi un po tu come usarle
> Ancora "Ottimo" !!! :-), ma sono riuscito ad incepparla su una stringa
> mista sul tipo:
> "Pippo ha 1350,00 €"
> ...ovvero un testo che contiene quei caratteri dà
> errore...
Il problema è che se c' è un punto o una virgola dove potrebbe averli
un numero reale il codice lo tratta come tale anche se gli altri caratteri
sono lettere, di conseguenza lo copia e cerca di formattarlo come un
numero, da qui l' errore
Ho aggiunto un ciclo for next per testare se nella stringa ci sono caratteri
dalla a alla z, se ci sono procede come nei casi in cui non riesce a tradurli
Come vedrai ho modificato un po il codice originale
In parole povere agisce così
Tutte le volte che riesce a interpretare una stringa come un possibile
numero chiama la sub Copia_Stringa(), negli altri casi chiama errore_stringa()
> Ancora non abbiamo un paracadute per tutti i casi che non riesce a
> tradurre...
Ci stiamo avvicinando sempre più
> Allo scopo ho provato a ri-mettere on error, con un msgbox che avvertiva
> del fatto chiedendo se proseguire,
La gestione degli errori ce la mettiamo in seguito per quei casi veramente
strani, il caso sopra deve poter essere gestito correttamente
> Propenderei per un rosso meno intenso... :-)
Con oMycell.CellBackColor = RGB(225,225,225) il colore lo puoi scegliere
da solo variando l' intensità dei colori primari rosso, verde e blu ( con i
valori sopra il colore è bianco)
> 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...
Come non detto
> Formato strano... due punti?
>
> a che serve?
> Spiegati meglio...
Se c' è serve a incasinarci di più
Quando l' ho visto per la prima volta anch' io sono rimasto un po perplesso
Ora ti spiego con un piccolo esempio
Prendiamo un numero, esempio 123,12
Se si scrive in una cella con il tastierino numerico, per la virgola usiamo il
punto, OOo lo converte in virgola perchè il punto del tastierino è un
separatore dei decimali, fin qui tutto OK
Ora proviamo a scrivere lo stesso numero con la tastiera
Se si usa la virgola come separatore dei decimali, tutto Ok
Se, invece si usa il punto( qualcuno dirà: perchè usare il punto?
Poi mi spiegherò) quello che viene fuori è appunto un numero così
123.12.00, sembrerebbe una cosa strana, invece non lo è
questo è un formato orario, 123 sono le ore 12 i minuti 00 i secondi
Se si cerca di formattare questo numero nel formato #.##0.00
ti da un valore di 5.13, sempre più divertente, questi sono i giorni che
corrispondono al numero sopra
Ma non è finita qui
Si passa alla cella sotto e questa volta si scrive 123,12 con la virgola
si preme Invio e ... magia il numero diventa 2954.52.48
Per farla breve, anche la cella sotto e diventata "orario" e ha interpretato
123,12 come giorni e li ha trasformati in ore ... e anche la cella sotto ... a
anche ......
A questo punto tiriamo le somme
Quando importi un numero da un' altro prezzario e questo numero ha come
separatore dei decimali un punto una volta che finisce in una cella OOo come
lo interpreta? Converte il punto in virgola, converte il numero in una stringa
oppure in orario?
Se lo dovesse convertire in orario sarà un problema a tirarci fuori il numero
originale
Sotto ti riporto il codice e scusatemi tutti se sono stato un po troppo lungo
Ciao
Lido
REM ***** BASIC *****
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
'on error goto errore_stringa
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)
oMycell = oFoglio.getCellByPosition(NumCol+1, 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
oMycell.setValue(Tipo)
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
u = 0
v = 0
For z = 65 to 90
u = InStr(Tipo2 , Chr(z))
v = v + u
Next
'Questo ciclo serve a individuare caratteri, dalla a alla z,
'nella variabile Tipo2, ogni volta che ne trova uno somma la
'posizione a v in modo che se v è a 0 siamo sicuri che non c' è
'nessun carattere, v viene testata sotto da Elseif
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???
errore_stringa(oMycell,Tipo2)
Elseif v > 0 Then
errore_stringa(oMycell,Tipo2)
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, ","), "")
Copia_Stringa(oMycell,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
Copia_Stringa(oMycell,Tipo2)
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...
errore_stringa(oMycell,Tipo2)
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, "."), "")
Copia_Stringa(oMycell,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, "."), ",")
Copia_Stringa(oMycell,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...
errore_stringa(oMycell,Tipo2)
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, "."),",")
Copia_Stringa(oMycell,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
Copia_Stringa(oMycell,Tipo2)
end if
end if
Case com.sun.star.table.CellContentType.EMPTY
MsgBox(" Dice la particella di sodio "_
& CHR$(10) & CHR$(10) & " CA NON CI STA NISCIUNO!")
Case com.sun.star.table.CellContentType.FORMULA
' Quuesta va fatta in caso di bisogno
End Select
Next
end sub
Sub errore_stringa(oMycell, Tipo2)
If MsgBox("Non riesco ad interpretare "& "questa stringa...--> "& _
"' " & Tipo2 & " '" & CHR$(10) & " Proseguo copiando il testo tal quale ?" &
_
"" ,36, "") = 6 then
oMycell.setString(Tipo2)
oMycell.CellBackColor = RGB(255,100,100)
end if
End Sub
Sub Copia_Stringa(oMycell,Tipo2)
oMycell.setValue(cDbl(Tipo2))
oMycell.NumberFormat = 4
End Sub
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]