Esta función se utiliza para determinar un porcentaje de promoción basado en los ingresos de un cliente. Este es un ejemplo de escala:

Without Limit     -> 2.0%
from 30.000,-     -> 3,0%
from 50.000,-     -> 3,5%
from 75.000,-     -> 4,0%

Todos los valores se recuperan de una hoja de Excel y se almacenan en Longs.

El problema es cuando se determina el nivel de promoción, estoy pasando el valor porcentual a la función (que es Datatype Integer).

PercentageInstallation = xSt3P

XSt3P es 0.03, pero PercentageInstallation dice 0.

Aquí está la función:

Public Function PercentageInstallation(xRwCtr As Integer, xKdnr1 As Integer, xSource As Worksheet) As Integer

    Dim xUmsatz, xOLiP, xSt1B, xSt1P, xSt2B, xSt2P, xSt3B, xSt3P, xSt4B, xSt4P As Long

    xUmsatz = xSource.Cells(xRwCtr, "I")    'Gesamtumsatz
    xOLiP = xSource.Cells(xRwCtr, "Q")      'ohne Limit
    xSt1B = xSource.Cells(xRwCtr, "R")      'Stufe 1 Betrag
    xSt1P = xSource.Cells(xRwCtr, "S")      'Stufe 1 Prozent
    xSt2B = xSource.Cells(xRwCtr, "T")      'Stufe 2 Betrag
    xSt2P = xSource.Cells(xRwCtr, "U")      'Stufe 2 Prozent
    xSt3B = xSource.Cells(xRwCtr, "V")      'Stufe 3 Betrag
    xSt3P = xSource.Cells(xRwCtr, "W")      'Stufe 3 Prozent
    xSt4B = xSource.Cells(xRwCtr, "X")      'Stufe 4 Betrag
    xSt4P = xSource.Cells(xRwCtr, "Y")      'Stufe 4 Prozent

    Debug.Print ("----------------------")
    Debug.Print ("> " & xUmsatz)
    Debug.Print ("> " & xOLiP)
    Debug.Print ("> " & xSt1B)
    Debug.Print ("> " & xSt1P)
    Debug.Print ("> " & xSt2B)
    Debug.Print ("> " & xSt2P)
    Debug.Print ("> " & xSt3B)
    Debug.Print ("> " & xSt3P)
    Debug.Print ("> " & xSt4B)
    Debug.Print ("> " & xSt4P)
    Debug.Print ("----------------------")


    If xUmsatz > xSt4B And xSt4B <> "" Then
        Debug.Print ("Its tier 4!")
        PercentageInstallation = xSt4P

    ElseIf xUmsatz > xSt3B And xSt3B <> "" Then
        Debug.Print ("Its tier 3!")
        PercentageInstallation = xSt3P

    ElseIf xUmsatz > xSt2B And xSt2B <> "" Then
        Debug.Print ("Its tier 2!")
        PercentageInstallation = xSt2P

    ElseIf xUmsatz > xSt1B And xSt1B <> "" Then
        Debug.Print ("Its tier 1!")
        PercentageInstallation = xSt1P

    ElseIf xOLiP <> "" Then
        Debug.Print ("Its tier without Limit!")
        PercentageInstallation = xOLiP

    Else
        Call Error(4, xKdnr1)

    End If

End Function

Y aquí está la salida de Debug.Print:

----------------------
> 81475,57
> 0,02
> 30000
> 0,03
> 50000
> 0,035
> 75000
> 0,04
> 
> 0
----------------------
Its tier 3!

Traté de definir la función como Long, pero esto no resolvió el problema.

-5
Philipp 28 jun. 2017 a las 18:01

2 respuestas

La mejor respuesta

Lea sobre sus tipos de datos de Visual Basic para Aplicaciones aquí en MSDN

Ejemplo de código para los tipos numéricos básicos:

Sub Some_sub()

Dim a As Double
Dim b As Long
Dim c As Integer
Dim d As Single

a = 0.02 
b = 0.02 
c = 0.02 
d = 0.02 

Debug.Print a 'output: 0.02
Debug.Print b 'output: 0
Debug.Print c 'output: 0
Debug.Print d 'output: 0.02

End Sub

Como se dice en los comentarios: Use Single o Double.

0
Mathieu Guindon 28 jun. 2017 a las 15:23

Pruebe lo siguiente para comprender la diferencia entre los diferentes tipos de valores:

Public Sub TestMe()

    Dim k As Long
    Dim p As Double

    k = 0.4
    Debug.Print k

    k = 0.7
    Debug.Print k

    p = 0.4
    Debug.Print p

End Sub

El resultado estaría en la ventana inmediata.

0
Vityata 28 jun. 2017 a las 15:07