Excel - Retornar String en una funcion que retorna un double

 
Vista:

Retornar String en una funcion que retorna un double

Publicado por CarlosMuse13 (6 intervenciones) el 09/12/2021 13:54:17
Hola
Mi problema es el siguiente dispongo de de un función en vba para Excel que según un parámetro de entrada realiza aplicas distintas formular a unos números de de entrada. Pero quiero que en una celda adjunta se escriba el carácter -.
Adjunto código.
[code] Function PotenciaActiva(Tension As Double, Intensidad As Double, Fpd As Double, Tipo_corriente As String)

Select Case Tipo_corriente

Case "Monofasico"

PotenciaActiva = PotenciaMono(Tension, Intensidad, Fpd)

Case "Trifasica"

ActiveCell.Offset(0, -4).Value = "Triangulo"
PotenciaActiva = PotenciaTrif(Tension, Intensidad, Fpd)

Case "Continua"

Fpd = 1
'ActiveCell.Offset(0, -4).Value = "-"
PotenciaActiva = PotenciaCC(Tension, Intensidad, Fpd)

Case Else

PotenciaActiva = "No es un valor Valido"

End Select

End Function
Function PotenciaCC(ByVal Tension As Double, ByVal Intensidad As Double, ByVal Fpd As Double) As Double

PotenciaCC = (Tension * Intensidad * Fpd) / 1000

End Functioncode]

¿Como puedo hacerlo,para que al aplicar la formula me la calcule y me escriba el texto o caracter en la celda adjunta?

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Retornar String en una funcion que retorna un double

Publicado por Antoni Masana (2477 intervenciones) el 09/12/2021 15:42:12
La función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function PotenciaActiva(Tension As Double, Intensidad As Double, Fpd As Double, Tipo_corriente As String)
    Select Case Tipo_corriente
        Case "Monofasico"
            PotenciaActiva = PotenciaMono(Tension, Intensidad, Fpd)
        Case "Trifasica"
            ActiveCell.Offset(0, -4).Value = "Triangulo"
            PotenciaActiva = PotenciaTrif(Tension, Intensidad, Fpd)
        Case "Continua"
            Fpd = 1
            'ActiveCell.Offset(0, -4).Value = "-"
            PotenciaActiva = PotenciaCC(Tension, Intensidad, Fpd)
        Case Else
            PotenciaActiva = "No es un valor Valido"
    End Select
End Function
 
Function PotenciaCC(ByVal Tension As Double, ByVal Intensidad As Double, ByVal Fpd As Double) As Double
    PotenciaCC = (Tension * Intensidad * Fpd) / 1000
End Function"

No funciona porque la celda activa no es donde esta la función sino otra.


Además hay una serie de limitaciones en las UDF ( "User Defined Functions") - ("Definidas por el usuario")

Una UDF llamada desde una celda (en una hoja) no puede cambiar el entorno de Excel, esto incluye:

- Insertar, eliminar o dar formato a celdas
- Cambiar el valor de una celda distinta a aquella en la que se invoca a la UDF
- Mover, renombrar, eliminar o añadir hojas
- Cambiar cualquier configuración del entorno como activar o desactivar el cálculo automático

Por ejemplo, si se llama a la UDF test desde una celda no funcionaría, pero si es invocada desde otra macro como test2, si funcionaría.

1
2
3
4
5
6
7
Function test()
    Cells(2, 2).Interior.ColorIndex = 36
End Function
 
Sub test2()
    MsgBox test
End Sub

Ver: https://www.excel-avanzado.com/funciones-definidas-por-el-usuario

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Retornar String en una funcion que retorna un double

Publicado por CarlosMuse13 (6 intervenciones) el 09/12/2021 17:37:01
Ya he modificado el codigo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Option Explicit
 
 Sub potencia()
 
    MsgBox PotenciaActiva(230, 1, 0.5, "Monofasico")
 
 End Sub
 
 Function PotenciaActiva(Tension As Double, Intensidad As Double, Fpd As Double, Tipo_corriente As String)
 
    Dim PotenciaMono As Double
    Dim PotenciaTrif As Double
    Dim PotenciaCC As Double
 
    Select Case Tipo_corriente
 
    Case "Monofasico"
 
        ActiveCell.Offset(0, -4).Value = " - "
        PotenciaMono = (Tension * Intensidad * Fpd) / 1000
        PotenciaActiva = PotenciaMono
 
    Case "Trifasica"
 
        ActiveCell.Offset(0, -4).Value = " Triangulo "
        PotenciaTrif = (Sqr(3) * Tension * Intensidad * Fpd) / 1000
        PotenciaActiva = PotenciaTrif
 
    Case "Continua"
 
        ActiveCell.Offset(0, -4).Value = " - "
        PotenciaCC = (Tension * Intensidad * Fpd) / 1000
        PotenciaActiva = PotenciaCC
 
    Case Else


ahora mismo tengo dos dudas

¿Como le paso los parámetros de las celdas en esta linea de código, decir sin poner yo los argumentos de la función a mano ?
MsgBox PotenciaActiva(230, 1, 0.5, "Monofasico")

Creo que se podría hacer así

1
2
3
4
5
Sub potencia()
 
    MsgBox PotenciaActiva(ActiveCell.Offset(0, -3).Value, ActiveCell.Offset(0, -2).Value, ActiveCell.Offset(0, -1).Value, ActiveCell.Offset(0, -5).Value)
 
 End Sub


Cuándo ejecuto la macro me sale el valor en msgbox pero no en la celda ¿Cómo hago para que me salga en la celda seleccionada?

Un saludo y muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Retornar String en una funcion que retorna un double

Publicado por Antoni Masana (2477 intervenciones) el 09/12/2021 20:16:25
Sin ver la hoja, donde están los datos y donde los tiene que poner no sabria decirtelo

Los cuatro parámetros de la función deberían de estar en celdas en una misma fila.

Por ejemplo:
-- Columna A: Tensión
-- Columna B: Intensidad
-- Columna C: Fpd
-- Columna D: Texto tipo
Y en las columnas E y F el texto y el calculo respectivamente y la macro que recorra las filas y realice los cálculos.

La macro puede ser autoejecutable que una vez tiene rellenas la cuatro columnas calcule las dos siguientes automaticamente.

Si no sabes como hacerlo sube un libro de ejemplo y te la hago.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Retornar String en una funcion que retorna un double

Publicado por CarlosMuse13 (6 intervenciones) el 10/12/2021 12:03:22
Buenas
eh conseguido varias cosas
lo que no he conseguido es que la macro se ejecute automáticamente
que al cambiar un dato se actualice la formula
Y por ultimo queria que me calcule todas la celdas de potencia unitaria

¿Como se podría hacer?

Te adjunto el nuevo codigo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Option Explicit
 
 Sub potencia()
 
  With ActiveCell
    .Value = PotenciaActiva(.Offset(0, -3).Value, .Offset(0, -2).Value, .Offset(0, -1).Value, .Offset(0, -5).Value)
    .Offset(0, 1).Value = .Value * .Offset(0, -6).Value
  End With
 
 End Sub
 
 Function PotenciaActiva(Tension As Double, Intensidad As Double, Fpd As Double, Tipo_corriente As String)
 
    Dim PotenciaMono As Double
    Dim PotenciaTrif As Double
    Dim PotenciaCC As Double
 
    Select Case Tipo_corriente
 
    Case "Monofasico"
 
        ActiveCell.Offset(0, -4).Value = " - "
        PotenciaMono = (Tension * Intensidad * Fpd) / 1000
        PotenciaActiva = PotenciaMono
 
    Case "Trifasica"
 
        ActiveCell.Offset(0, -4).Value = " Triangulo "
        PotenciaTrif = (Sqr(3) * Tension * Intensidad * Fpd) / 1000
        PotenciaActiva = PotenciaTrif
 
    Case "Continua"
 
        ActiveCell.Offset(0, -4).Value = " - "
        PotenciaCC = (Tension * Intensidad * Fpd) / 1000
        PotenciaActiva = PotenciaCC
 
    Case Else
 
        PotenciaActiva = "No es un valor Valido"
 
    End Select
 
End Function

Un saludo y muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Retornar String en una funcion que retorna un double

Publicado por Antoni Masana (2477 intervenciones) el 10/12/2021 15:41:51
Esta es toda la macro, calcula cuando te mueves por las celdas de datos de la función o al rellenar una de esas celdas.

Esto lo debes poner en la parte de la hoja y puedes sacar el módulo con la función.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Option Explicit
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  Se ejecuta cuando se modifica la celda al salir      ---&--- </>
' </> --------------------------------------------------------------------- </>
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Call Calcula_Potencia(Target.Row, Target.Column)
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  Se ejecuta cuando se coloca en la celda              ---&--- </>
' </> --------------------------------------------------------------------- </>
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call Calcula_Potencia(Target.Row, Target.Column)
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  Valida la posición y que esten los 4 datos           ---&--- </>
' </> --------------------------------------------------------------------- </>
 
Private Sub Calcula_Potencia(Fila, Colu)
    Dim Calcula As Boolean, C1 As Integer, C2 As Integer, C3 As Integer, C4 As Integer
 
    If Fila < 10 Then
       C1 = 14: C2 = 16: C3 = 17: C4 = 18
    Else
       C1 = 5: C2 = 7: C3 = 8: C4 = 9
    End If
 
    If Colu = C1 Or (Colu > C2 And Colu <= C4) Then
        Select Case Cells(Fila, C1)
            Case "Trifasica":  Calcula = True
            Case "Monofasica": Calcula = True
            Case "Continua":   Calcula = True
            Case Else:         Calcula = False
        End Select
        If Calcula Then
           If IsNumeric(Cells(Fila, C2)) And _
              IsNumeric(Cells(Fila, C3)) And _
              IsNumeric(Cells(Fila, C4)) Then
              Cells(Fila, C4 + 1) = PotenciaActiva(Cells(Fila, C2), Cells(Fila, C3), Cells(Fila, C4), Cells(Fila, C1), Fila, C1 + 1)
           End If
        End If
    End If
End Sub
 
' </> --------------------------------------------------------------------- </>
' </> ---&---  La funcion propiamente dicha                         ---&--- </>
' </> --------------------------------------------------------------------- </>
 
Function PotenciaActiva(Tension As Double, Intensidad As Double, Fpd As Double, Tipo_corriente As String, Fila, Col)
    Dim PotenciaMono As Double
    Dim PotenciaTrif As Double
    Dim PotenciaCC As Double
 
    Select Case Tipo_corriente
 
        Case "Monofasico"
            Cells(Fila, Col) = " - "
            PotenciaActiva = (Tension * Intensidad * Fpd) / 1000
 
        Case "Trifasica"
            Cells(Fila, Col) = " Triangulo "
            PotenciaActiva = (Sqr(3) * Tension * Intensidad * Fpd) / 1000
 
        Case "Continua"
            Cells(Fila, Col) = " - "
            PotenciaActiva = (Tension * Intensidad * Fpd) / 1000
 
        Case Else
            PotenciaActiva = "No es un valor Valido"
    End Select
End Function

Te enviaré el libro por correo.


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Retornar String en una funcion que retorna un double

Publicado por CarlosMuse13 (6 intervenciones) el 10/12/2021 17:33:08
Hola
No entiendo que hace estas lineas de código
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub Calcula_Potencia(Fila, Colu)
    Dim Calcula As Boolean, C1 As Integer, C2 As Integer, C3 As Integer, C4 As Integer
 
    If Fila < 10 Then
       C1 = 14: C2 = 16: C3 = 17: C4 = 18
    Else
       C1 = 5: C2 = 7: C3 = 8: C4 = 9
    End If
 
    If Colu = C1 Or (Colu > C2 And Colu <= C4) Then
        Select Case Cells(Fila, C1)
            Case "Trifasica":  Calcula = True
            Case "Monofasica": Calcula = True
            Case "Continua":   Calcula = True
            Case Else:         Calcula = False
        End Select
        If Calcula Then
           If IsNumeric(Cells(Fila, C2)) And _
              IsNumeric(Cells(Fila, C3)) And _
              IsNumeric(Cells(Fila, C4)) Then
              Cells(Fila, C4 + 1) = PotenciaActiva(Cells(Fila, C2), Cells(Fila, C3), Cells(Fila, C4), Cells(Fila, C1), Fila, C1 + 1)
           End If
        End If
    End If
End Sub

Serias tan amable de explicarmelo, por favor
Un saludo y muchas gracias por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Retornar String en una funcion que retorna un double

Publicado por Antoni Masana (2477 intervenciones) el 10/12/2021 19:54:38
Explico sobre el código.

He visto que hay varias tablas y en columnas diferentes.

La de Contraincendios esta en el rango J1:S8
La de Ventilación esta en el rango A12:K18
La de Seguridad esta en el rango A22:K28

Lo que provoca que la columna de Tipo de alimentacion electrica y los tres valores numéricos: Tensión, Intensidad y Factor de Potencia están en columna diferentes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub Calcula_Potencia(Fila, Colu)
    Dim Calcula As Boolean, C1 As Integer, C2 As Integer, C3 As Integer, C4 As Integer
 
    ' --- Aqui miro si es la primera o las segunda y tercera tabla segun la fila en la que esta
    If Fila < 10 Then
       C1 = 14: C2 = 16: C3 = 17: C4 = 18
    Else
       C1 = 5: C2 = 7: C3 = 8: C4 = 9
    End If
    ' --- Miro si estoy en una de las cuatro columnas descritas: Tipo, Tensión, Intensidad y Factor de Potencia
    If Colu = C1 Or (Colu > C2 And Colu <= C4) Then
        ' --- Miro si la columna Tipo hay un texto conocido:
        Select Case Cells(Fila, C1)
            Case "Trifasica":  Calcula = True
            Case "Monofasica": Calcula = True
            Case "Continua":   Calcula = True
            Case Else:         Calcula = False
        End Select
        ' -- Compruebo que las otras tres columnas tienen número, Si hay alguna vacía no calcula.
        If Calcula Then
           If IsNumeric(Cells(Fila, C2)) And _
              IsNumeric(Cells(Fila, C3)) And _
              IsNumeric(Cells(Fila, C4)) Then
              ' -- Hace el calculo y le paso la fila y columna del Tipo de alimentacion de trifasica
              Cells(Fila, C4 + 1) = PotenciaActiva(Cells(Fila, C2), Cells(Fila, C3), Cells(Fila, C4), Cells(Fila, C1), Fila, C1 + 1)
           End If
        End If
    End If
End Sub


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar