Visual Basic para Aplicaciones - Error al asignar valor a Celda VB-Excel.

Life is soft - evento anual de software empresarial
 
Vista:
Imágen de perfil de JuantxooxtnauJ

Error al asignar valor a Celda VB-Excel.

Publicado por JuantxooxtnauJ (3 intervenciones) el 12/04/2022 12:36:59
Buenos días...

No soy muy versado en VB-Excel, pero he hecho algunas cosas...

Y estoy atascado con una función, que no hay manera que eche a andar...

La base esta sacada de: [url]]'https://es.extendoffice.com/documents/excel/4417-excel-play-sound-if-condition-is-true.html[/url]

y lo que hace es, si se cumple la condición, emite un sonido.

La idea es utilizarlo en un cuadro de mandos, que se actualiza desde una coleccion de datos, cada x minutos.

Esta es la llamada al modulo... =SI(Y($C$15>=$C$13;HORA(AHORA())<16;HORA(AHORA())>7);SoundMe2();"")

Cuando se actualiza, cambia múltiples valores, por lo que quiero que solo se ejecute una vez por minuto, como máximo. Si no, cada actualización pita varias veces...

Para esto, en la celda: F1 almaceno el minuto actual, y lo comparo. Si es igual, no hace nada. Si ha variado, pongo ese minuto en la celda, y emite el sonido... Y aquí es donde falla...

He probado a declarar las variables como integer, como double, a pasar el valor... pero no hay manera. Falla en la linea:
Worksheets("CMI").Range("F1").Value = MinutoNow

La hoja se llama CMI, y la referencio directamente...

A ver si un alma caritariva....

GRACIAS!!!


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
Global MinutoNow As Double
 
 
#If Win64 Then
    Private Declare PtrSafe Function PlaySound Lib "winmm.dll" _
        Alias "PlaySoundA" (ByVal lpszName As String, _
        ByVal hModule As LongPtr, ByVal dwFlags As Long) As Boolean
#Else
    Private Declare Function PlaySound Lib "winmm.dll" _
        Alias "PlaySoundA" (ByVal lpszName As String, _
        ByVal hModule As Long, ByVal dwFlags As Long) As Boolean
#End If
Const SND_SYNC = &H0
Const SND_ASYNC = &H1
Const SND_FILENAME = &H20000
 
 
Function SoundMe2() As String
'Updateby Extendoffice 20161223
' On Error Resume Next
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
 
    Dim Minuto As Double
    Dim MinutoNow As Double
    Dim hora As Double
 
    MinutoNow = (Minute(Now()))
    Minuto = (Worksheets("CMI").Range("F1").Value)
    hora = Hour(Now())
 
    If Val(Worksheets("CMI").Range("F1").Value) <> MinutoNow Then
        Worksheets("CMI").Range("F1").Value = MinutoNow
        If hora > 7 And hora < 16 Then
            If MinutoNow <> Minuto Then
                Call PlaySound("c:\windows\media\Speech On.wav", _
                0, SND_ASYNC Or SND_FILENAME)
            End If
        End If
    SoundMe2 = "ALERTA!"
    End If
 
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.CutCopyMode = False
    Application.Calculation = xlCalculationAutomatic
End Function
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: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error al asignar valor a Celda VB-Excel.

Publicado por Antoni Masana (498 intervenciones) el 12/04/2022 14:58:49
Sube el libro y le doy un vistazo

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
Imágen de perfil de JuantxooxtnauJ

Error al asignar valor a Celda VB-Excel.

Publicado por JuantxooxtnauJ (3 intervenciones) el 13/04/2022 08:12:02
Adjunto un libro al que le sucede lo mismo...

La idea es que si el 'Limite' supera el nº de avisos, lance el sonido, y ponga el valor "Alerta!" en la celda B8.

Para evitar que se ejecute continuamente, si hay otros cambios en el libro (como es el caso del libro 'gordo'), intento que no suene mas que una vez por minuto comparando el minuto actual con el de la celda "F1" y si no coincide, sonar y guardar el minuto actual en la celda indicada...
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: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error al asignar valor a Celda VB-Excel.

Publicado por Antoni Masana (498 intervenciones) el 13/04/2022 17:45:01
Ya se cual es el problema de tu función.

Violas una de las limitaciones de las funciones en Excel

Descripción de las limitaciones de las funciones personalizadas en Excel



En las versiones de Microsoft Excel enumeradas en la sección "La información de este artículo se refiere a" puede crear una función definida por el usuario que devuelva un cálculo personalizado utilizando Visual Basic para Aplicaciones. Sin embargo, las funciones definidas por el usuario no pueden realizar acciones que cambien el entorno de Microsoft Excel cuando las llame una fórmula de una celda de hoja de cálculo.

Resumen
Una función definida por el usuario llamada por una fórmula de una celda de hoja de cálculo no puede cambiar el entorno de Microsoft Excel. Esto significa que este tipo de función no puede hacer nada de lo siguiente:

* Insertar, eliminar o dar formato a celdas de la hoja de cálculo.
* Cambiar el valor de otra celda.
* Mover, cambiar el nombre, eliminar o agregar hojas a un libro.
* Cambiar cualquiera de las opciones del entorno, como el modo de cálculo o las vistas de la pantalla.
* Agregar nombres a un libro.

Establecer propiedades o ejecutar la mayoría de los métodos.

El propósito de las funciones definidas por el usuario es permitir al usuario crear una función personalizada que no está incluida en las funciones suministradas con Microsoft Excel. Las funciones incluidas en Microsoft Excel tampoco pueden cambiar el entorno. Las funciones pueden realizar un cálculo que devuelva un valor o texto a la celda en la que se escriben. Cualquier modificación del entorno debe realizarse mediante una subrutina de Visual Basic.

Durante el cálculo, Excel examina los precedentes de la celda que contiene una función definida por el usuario. Si no se han calculado todos los precedentes, Excel pasa una celda Null o vacía a la función. Después, Excel se asegura de que se realicen suficientes pasos de cálculo para todos los precedentes que se van a calcular. Durante el último paso de cálculo, se pasan los valores actuales de las celdas a la función definida por el usuario. Esto puede hacer que se llame a la función definida por el usuario con más frecuencia de lo esperado. Por tanto, la función definida por el usuario puede devolver valores inesperados.

Para lograr un cálculo correcto, todos los rangos que se utilizan en el cálculo se deben pasar a la función como argumentos. Si no pasa los rangos de cálculo como argumentos, en lugar de hacer referencia a los rangos dentro del código de VBA de la función, Excel no puede responder de ellos dentro del motor de cálculo. Por tanto, Excel no puede calcular correctamente el libro para asegurarse de que se calculan todos los precedentes antes de calcular la función definida por el usuario.


Te marco las líneas en las que afecta esta limitación, puedes cambiarlo por una variable estática.

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
Global MinutoNow As Double
 
#If Win64 Then
    Private Declare PtrSafe Function PlaySound Lib "winmm.dll" _
        Alias "PlaySoundA" (ByVal lpszName As String, _
        ByVal hModule As LongPtr, ByVal dwFlags As Long) As Boolean
#Else
    Private Declare Function PlaySound Lib "winmm.dll" _
        Alias "PlaySoundA" (ByVal lpszName As String, _
        ByVal hModule As Long, ByVal dwFlags As Long) As Boolean
#End If
 
Const SND_SYNC = &H0
Const SND_ASYNC = &H1
Const SND_FILENAME = &H20000
 
Function SoundMe2() As String
    ' Updateby Extendoffice 20161223
    ' On Error Resume Next
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
 
    Dim Minuto As Double
    Dim MinutoNow As Double
    Dim hora As Double
 
    MinutoNow = (Minute(Now()))
    Minuto = (Worksheets("CMI").Range("F1").Value)
    hora = Hour(Now())
 
    If Val(Worksheets("CMI").Range("F1").Value) <> MinutoNow Then
        Worksheets("CMI").Range("F1").Value = MinutoNow
        If hora > 7 And hora < 16 Then
            If MinutoNow <> Minuto Then
                Call PlaySound("c:\windows\media\Speech On.wav", _
                0, SND_ASYNC Or SND_FILENAME)
            End If
        End If
    SoundMe2 = "ALERTA!"
    End If
 
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.CutCopyMode = False
    Application.Calculation = xlCalculationAutomatic
End Function

No he sabido simular una situación que ejecute la función y no se como simularlo para arreglar el problema.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de JuantxooxtnauJ

Error al asignar valor a Celda VB-Excel.

Publicado por JuantxooxtnauJ (3 intervenciones) el 28/04/2022 12:58:24
Muchas gracias... No acabo de entenderlo, pero veo que el error no es `mío`.

A ver si consigo solucionarlo!
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