Sono stato via due giorni e voi intanto avete poltrito... :-)
MA devo proprio fare tutto da me? :-)
HAA! ho capito... eravate impegnati ad annullare le "ricevute di
ritorno"... allora vi perdono! :-)
Intanto ho pensato a come rigenerare la macro degenerata... :-)
Probabilmente il tutto può essere ricondotto sole due situazioni:
1) la macro riconosce un numero, oppure riesce a convertire una stringa
in un numero
2) la macro trova una stringa nella quale non riesce a riconoscere un
numero in tal caso duplica la stringa e la segna in rosso.
Allo stato attuale del codice direi che la situazione 1 copre ormai
buona parte dei casi che si possono incontrare... o meglio tutti i casi
che ho realmente incontrato sono stati correttamente interpretati e
correttamente convertiti.
Il caso ambiguo citato nei commenti ( 55'4444 ) darebbe del filo da
torcere ad avvocati, CTP e CTU... figuriamoci ad una macchina!
Se fosse possibile riconoscerlo e NON covertirlo (ma solo copiarlo come
stringa) sarebbe la soluzione ottimale.... ma non vedo come...
Poi, ripeto, io non ho ancora incontrato casi del genere...
Ricadono invece nel caso 2 tutte le stringhe vere... cioè le parole e le
frasi che - in ogni caso - non devono essere convertite.
Fa eccezione il caso di '$ 3.200, '€ 345,34, etc ... ovvero le
situazioni dove ai numeri (in formato testo) è rimasto appiccicato il
segno di valuta.
Questi casi sono facilmente risolvibili con un cerca/sostituisci... ma
se nel range abbiamo più valute diverse potrebbe diventare complicato.
Ritenete si debba ancora pensare a convertirli? Oppure ci fermiamo qui?
Per l'Addon... cosa facciamo?
Qualcuno pensa sia utile?
Oppure si "pubblica" la macro sul wiki e ci scordiamo della cosa...
(...almeno fino a quando qualcuno scopre un caso generalizzato di
malformattazione...8-) )
In ogni caso io ho pasticciato l'ultima versione di Emanuele con qualche
modifica discutibile.
Adesso funziona come dicevo sopra.
Ho anche aggiunto una progressbar e una msgbox quando termina... (su
range di migliaia di celle metteva ansia...)
Rimane da risolvere l'avvio... nel senso che l'utente, prima di azionare
la macro, deve selezionare il range di celle... e di questo - forse -
dovrebbe esserne informato...
fatemi sapere
Bart
(io intanto l'inserisco nell'aggiornamento di Ultimus)
REM ***** BASIC *****
Sub Che_Digerisce_Quasi_Tutto_e_Lo_Converte_In_Numeri()
' Converte da numeri in formato stringa
' a nuneri "veri"
' copiandoli su una nuova colonna a lato
' versione del 07/06/06
' da azionare dopo aver selezionato
' il range di celle da convertire
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 oSelections as object
Dim oMycell As Object
Dim oMyRange As Object
Dim NumCol As Integer
dim cell as object
Dim h As Integer
Dim i As Integer
Dim l As String
Dim iPosizionePrimoPunto as integer
Dim iPosizionePrimaVirgola as integer
dim sPaginaRiferimento as string
dim oTextSearch as object
dim aSearchResult as object
Dim aSrcOpt As New com.sun.star.util.SearchOptions
oTextSearch = CreateUnoService(_
"com.sun.star.util.TextSearch")
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)
Dim oBarra As Object
oBarra = _
thisComponent.GetCurrentController.GetFrame.CreateStatusIndicator '''
oBarra.Start(" Inizio la Conversione", Val(f))
For g = Val(e) to Val(f) ' Inizia il ciclo
oBarra.setValue(g)'''
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
aSearchResult = oTextSearch.searchForward(Tipo2, 0,Len(Tipo2))
if aSearchResult.subRegExpressions = 0 then
if InStr(Tipo2, "'") > 0 then
Tipo2 = join(split(Tipo2,"'"),"")
Tipo2 = Trim(Tipo2)
end if
iPosizionePrimoPunto = InStr(Tipo2, ".")
iPosizionePrimaVirgola = InStr(Tipo2, ",")
if (iPosizionePrimoPunto = 0_
and iPosizionePrimaVirgola = 0) then
'*****NUOVO COMMENTO*****
'Non ci sono virgole,
'non ci sono punti,
'non ci sono apici,
'non ci sono lettere,
'cosa è rimasto?
'Se non rimane altro qui
'dovrebbero esserci solo numeri...
'errore_stringa(oMycell,Tipo2)
Copia_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
else
errore_stringa(oMycell, Tipo2)
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
' Questa va fatta in caso di bisogno
End Select
Next
oBarra.End
msgbox " La conversione in numeri è "_
& "terminata... "& CHR$(10) & CHR$(10)_
& "Le eventuali stringhe che non sono riuscito "_
& "ad interpretare le ho copiate tali e quali, "_
& "ma ""segnandole"" con sfondo in rosso! "_
& "( molto rosso... :-) )"
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,0,0)
'end if
End Sub
Sub Copia_Stringa(oMycell,Tipo2)
on error goto gest_errore
oMycell.setValue(cDbl(Tipo2))
oMycell.NumberFormat = 4
exit sub
gest_errore:
' lo so che è una porcata...
oMycell.setString(Tipo2)
oMycell.CellBackColor = RGB(255,0,0)
'
End Sub
function contieneTesto(byRef sTesto as string) as boolean
dim sPaginaRiferimento as string
dim oTextSearch as object
Dim aSrcOpt As New com.sun.star.util.SearchOptions
oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
With aSrcOpt
searchFlag = com.sun.star.util.SearchFlags.REG_EXTENDED
algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
searchString = lCase(".[A-Za-zéèòàçìù]")
End With
oTextSearch.setOptions(aSrcOpt)
aSearchResult = oTextSearch.searchForward(sTesto, 0,Len(sTesto) )
if aSearchResult.subRegExpressions > 0 then
v = true
end if
end function
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]