Forse sono stato frainteso
La mia non voleva certo essere una soluzione definitiva
non credo si possa risolvere il problema sollevato da te
con "quattro" linee di codice ne tanto meno con una formula
nelle celle
Credo che ti abbia tratto in inganno il nome che ho dato alla
macro
La mia voleva essere una battuta provocatoria per stimolare il
sano principio di competizione che fa parte di un buon numero di umani
(forse questa parte è un po meno di quanto credo io)
Sfida (se di sfida si può parlare) accettata!
Bart prova con questa soluzione, è un po' più generica, ma non è
completa. E' solo uno scheletro su cui costruire quello che ti serve.
Tra l'altro ho integrato anche la selezione del range (analizza solo le
colonne) che Paolo ha suggerito nella lista dev-it, magari in maniera
non ottimale, ma sembra funzionare egregiamente.
Attenzione, io ho usato due moduli separati (la separazione è indicata
da un commento), dovrebbe funzionare anche in uno solo, ma c'è da
spostare una variabile globale all'inizio del modulo.
Non faccio particolari controlli sugli input, quindi attenzione agli
errori!!
Potrebbero essere rimaste delle variabili dimensionate che non
servono...alcune le ho eliminate, altre potrebbero essermi sfuggite.
Ultima cosa: non l'ho testato in situazioni particolari, quindi potrebbe
essere necessario aggiustare qualche numero... ;-)
Ciao!
Emanuele.
[CODICE]
'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
'd = InputBox("Immettere la lettera della Colonna da convertire (es.
A)","Immissione dati")
'e = InputBox("Immettere il numero della riga che inizia la colonna (es.
4)","Immissione dati")
'f = InputBox("Immettere il numero della riga che Finisce la colonna
(es. 35)","Immissione dati")
'Questa serie di input per poter determinare il range da convertire
'a = d + e + ":" + d + f
a = getRange()
d = getColonna(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 - 1).Value
Tipo2 = oFoglio.getCellByPosition(NumCol, g - 1).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
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(Val(Tipo2))
oMycell = oFoglio.getCellRangeByName(d + LTrim(Str(g)))
oMycell.NumberFormat = 4
end if
Next
end sub
function getColonna(ByVal sA as string) as string
dim sASplit() as string
sASplit() = split(sA, ".")
sASplit() = split(sASplit(1), "$")
getColonna = sASPlit(1)
end function
function getRigaIniziale(ByVal sA as string) as string
dim sASplit() as string
sASplit() = split(sA, ".")
sASplit() = split(sASplit(1), ":")
sASplit() = split(sASplit(0), "$")
getRigaIniziale = sASPlit(2)
end function
function getRigaFinale(ByVal sA as string) as string
dim sASplit() as string
sASplit() = split(sA, ".")
sASplit() = split(sASplit(1), ":")
sASplit() = split(sASplit(1), "$")
getRigaFinale = sASPlit(2)
end function
'**************************************************
'**************************************************
'**************************************************
'Modulo 2
Global oRangeSelectionListener As Object
Global sA as string
function getRange() as string
sA = ""
TestRangeSelection
do
'Con questo comando non utilizza il processore inutilmente
'e 100 millisecondi non è nemmeno percettibile come ritardo.
wait 100
loop while sA = ""
getRange = sA
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
sA = 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]