Discussione:
Formula per cambiare di segno
(troppo vecchio per rispondere)
Franz Verga
2005-11-30 14:12:53 UTC
Permalink
Mi trovo ad avere a che fare con un file estratto da AS400 in cui sono
mescolati sia costi che ricavi nella stessa colonna. L'unica cosa che
contraddistingue i vari revord come costi o ricavi è la presenza di un campo
che è valorizzato rispettivamente C (costo) o R (Ricavo) a seconda dei casi.
Attualmente per cambiare segno ai costi utilizzo un SE con la seguente
sintassi:

=SE(E2="R";V2;-V2)

Ho provato a scrivere una macro, anzi una function che fosse equivalente al
SE, per evitare ogni volta di dovere digitare (sono un po' pigro...), ma non
sono riuscito a cavare un ragno dal buco...

Non è che per caso c'è un'anima pia che mi da una mano? :-)



--
Grazie anticipatamente dell'aiuto...

Ciao

Franz Verga

------------------------------------------------
Per rispondermi traduci InVento in inglese (no maiuscole)
------------------------------------------------
Bruno Campanini
2005-11-30 20:26:04 UTC
Permalink
Post by Franz Verga
Mi trovo ad avere a che fare con un file estratto da AS400 in cui sono
mescolati sia costi che ricavi nella stessa colonna. L'unica cosa che
contraddistingue i vari revord come costi o ricavi è la presenza di un campo
che è valorizzato rispettivamente C (costo) o R (Ricavo) a seconda dei casi.
Attualmente per cambiare segno ai costi utilizzo un SE con la seguente
=SE(E2="R";V2;-V2)
Ho provato a scrivere una macro, anzi una function che fosse equivalente al
SE, per evitare ogni volta di dovere digitare (sono un po' pigro...), ma non
sono riuscito a cavare un ragno dal buco...
Ciao Franz.
Hai detto "function" ma forse intendevi una "action macro":
devi cioè cambiare il segno a dati che si trovano in V2-down.
Se così fosse:
===============================
Public Sub CR()
Dim SourceRange As Range, i, j As Long
Dim TargetRange As Range

Set SourceRange = [Sheet10!E2]
Set TargetRange = [Sheet10!V2]

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
If Not IsEmpty(SourceRange(2, 1)) Then
Set SourceRange = SourceRange.Resize _
(SourceRange.End(xlDown).Row - SourceRange.Row + 1)
End If

For Each i In SourceRange
j = j + 1
If UCase(i) = "C" Then
TargetRange(j) = -TargetRange(j)
End If
Next

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
==========================
Se ho frainteso fammelo sapere.

Ciao
Bruno
Franz Verga
2005-12-01 00:16:01 UTC
Permalink
Post by Bruno Campanini
Post by Franz Verga
Mi trovo ad avere a che fare con un file estratto da AS400 in cui sono
mescolati sia costi che ricavi nella stessa colonna. L'unica cosa che
contraddistingue i vari revord come costi o ricavi è la presenza di un campo
che è valorizzato rispettivamente C (costo) o R (Ricavo) a seconda dei casi.
Attualmente per cambiare segno ai costi utilizzo un SE con la seguente
=SE(E2="R";V2;-V2)
Ho provato a scrivere una macro, anzi una function che fosse equivalente al
SE, per evitare ogni volta di dovere digitare (sono un po' pigro...), ma non
sono riuscito a cavare un ragno dal buco...
Ciao Franz.
Ciao Bruno.
Intendevo proprio una function, perchè vorrei la possibilità di selezionare
in quale colonna si trova il campo discriminante (C/R) ed in quale colonna i
valori da trattare...

Forse la tua sub si può modificare e trasformare in function...
Magari domani a mente lucida (ebbene sì, sono uscito anche stasera...) ci
provo, sempre che il lavoro mi lasci il tempo...
--
Grazie dell'aiuto...

Ciao

Franz Verga

----------------------------------------------------------------
per rispondermi traduci InVento in inglese (no maiuscole)
----------------------------------------------------------------
gilgil
2005-12-01 10:23:06 UTC
Permalink
Post by Franz Verga
Intendevo proprio una function, perchè vorrei la possibilità di
selezionare in quale colonna si trova il campo discriminante (C/R) ed in
quale colonna i valori da trattare...
Prova un questa Function:

Function ConvertNeg(TestoCtrl As String, Importo As Long)

If TestoCtrl = "R" Then
ConvertNeg = -Importo
Else
ConvertNeg = Importo
End If

End Function

=============================
--
gilgil259

Antispam: replace 259 with 159
Mauro Gamberini
2005-12-01 10:38:15 UTC
Permalink
Post by Franz Verga
Ho provato a scrivere una macro, anzi una function che fosse equivalente al
SE, per evitare ogni volta di dovere digitare (sono un po' pigro...), ma non
sono riuscito a cavare un ragno dal buco...
Ciao bello.
Una funzione vero?
Cioè non parliamo di riscrivere sulla
cella dove abbiamo il dato, ma in
un'altra cella....?

Public Function m(ByVal r1 As Range, ByVal r2 As Range)

If r1.Value = "R" Then
m = -r2.Value
Else
m = r2.Value
End If

End Function
Post by Franz Verga
=SE(E2="R";V2;-V2)
Dove:

r1 sarebbe la tua E2
r2 sarebbe la tua V2

Quindi da richiamare come:
=m(E2;V2)
--
----------------------------
Mauro Gamberini
Mauro Gamberini
2005-12-01 10:40:05 UTC
Permalink
Post by Mauro Gamberini
Public Function m(ByVal r1 As Range, ByVal r2 As Range)
Public Function m(ByVal r1 As Range, ByVal r2 As Range) As Variant
--
----------------------------
Mauro Gamberini
Mauro Gamberini
2005-12-01 10:42:55 UTC
Permalink
Stamattina mi partono i post a raffica...sorry.

Se vuoi controllare il contenuto di r2:

Public Function m(ByVal r1 As Range, ByVal r2 As Range) As Double

ad esempio, ti segnala errore se in r2 inserisci testo.
As Variant accetta anche il testo... e non è bello
se hai a che fare con numeri...
--
----------------------------
Mauro Gamberini
Franz Verga
2005-12-01 10:59:00 UTC
Permalink
Post by Mauro Gamberini
Post by Franz Verga
Ho provato a scrivere una macro, anzi una function che fosse
equivalente al SE, per evitare ogni volta di dovere digitare (sono
un po' pigro...), ma non sono riuscito a cavare un ragno dal buco...
Ciao bello.
Una funzione vero?
Cioè non parliamo di riscrivere sulla
cella dove abbiamo il dato, ma in
un'altra cella....?
Public Function m(ByVal r1 As Range, ByVal r2 As Range)
If r1.Value = "R" Then
m = -r2.Value
Else
m = r2.Value
End If
End Function
Post by Franz Verga
=SE(E2="R";V2;-V2)
r1 sarebbe la tua E2
r2 sarebbe la tua V2
=m(E2;V2)
Ciao Mauro.
Grazie degli input preziosissimi. Ho anche capito perché quella che avevo
provato io non funzionava:
inizialmente avevo regitrato la macro mentre facevo il SE, poi quando l'ho
trasformata in function, mi sono diemnticato che la function deve restituire
un valore... :-(

Ecco come ho risolto:

Public Function ConvertiCosti(ByVal CostoRicavo As Range, ByVal Importo As
Range) As Double

If CostoRicavo.Value = "R" Then
ConvertiCosti = Importo.Value
Else
ConvertiCosti = -Importo.Value
End If

End Function


(con la tua versione i ricavi diventavano negativi ed i costi rimanevano
positivi... ;-) )



--
Grazie dell'aiuto...

Ciao

Franz Verga

------------------------------------------------
Per rispondermi traduci InVento in inglese (no maiuscole)
------------------------------------------------
Mauro Gamberini
2005-12-01 11:00:34 UTC
Permalink
Post by Franz Verga
(con la tua versione i ricavi diventavano negativi ed i costi rimanevano
positivi... ;-) )
Sono sempre a debito, pe me era perfetta!
--
----------------------------
Mauro Gamberini
Franz Verga
2005-12-01 11:07:34 UTC
Permalink
Post by Mauro Gamberini
Post by Franz Verga
(con la tua versione i ricavi diventavano negativi ed i costi
rimanevano positivi... ;-) )
Sono sempre a debito, pe me era perfetta!
Poi glielo spiegavi tu al mio capo... :-D
--
Ciao

Franz Verga

------------------------------------------------
Per rispondermi traduci InVento in inglese (no maiuscole)
------------------------------------------------

Continua a leggere su narkive:
Loading...