¿Puedo emitir un pitido de Excel cuando finalice un cálculo?

13

Tengo estos cálculos realmente largos en Excel. Me gustaría desviar mi atención de la pantalla y hacer algo en mi escritorio, pero recibir una alerta cuando termine el cálculo.

¿Algunas ideas?

Eliyahu
fuente
1
¿Cómo exactamente estás haciendo el cálculo? Si está en VBA, ¿por qué no usar el método "Beep" de VBA ? ¿Qué has probado ya?
Ƭᴇcʜιᴇ007
2
@ techie007 no VBA. Solo funciona en grandes hojas de cálculo de Excel.
Eliyahu
1
Aún así, probablemente pueda usar la función Beep, especialmente si su SS está usando "funciones" para calcular en lugar de "fórmulas". Pero "cómo" puede usarlo depende en gran medida del funcionamiento de su hoja de cálculo, lo cual no sabemos. ¿Estás escribiendo un valor en una celda y luego tienes que esperar mucho tiempo para que termine, o presionas un botón para comenzar el cálculo después de llenar las celdas? Si presiona F11 para abrir el editor VBA, ¿hay un montón de código allí?
Ƭᴇcʜιᴇ007
@ techie007 Estoy usando fórmulas. Presionaré F9 después de un montón de trabajo y tendré que esperar.
Eliyahu
Habría hecho sus cálculos de otra manera. Lo que desea no es posible si todo lo que está haciendo es decirle a Excel que realice los cálculos en el libro abierto
Ramhound,

Respuestas:

21

OK, algo para probar (las instrucciones asumen Excel 2007 o más reciente):

  • Abre tu libro de trabajo.
  • Guárdelo como un SS habilitado para macros ( .XLSM).
  • Presione Alt-F11 para abrir la ventana de codificación de VBA.
  • Haga clic con el botón derecho en VBAProject ( yourbook.xlsm) y seleccione Insertar → Módulo.
  • Abra el "Módulo1" recién creado.
  • En el módulo, pegue este fragmento:

    Sub Auto_Open()
        Application.OnKey "{F9}", "F9Handler"
    End Sub
    

    Esto hará que la tecla F9 se reasigne cada vez que se abre el SS. Cuando presione F9, se ejecutará en F9Handlerlugar del cálculo habitual.

  • En el módulo, pegue este fragmento:

    Sub F9Handler()
        Application.Calculate
        Beep
    End Sub
    

    Esto es lo que ahora se ejecutará cuando presione F9. La primera línea ejecuta Application.Calculate(que es lo que generalmente realiza F9) y luego emite un pitido.

  • Guarda todo.

  • Cierra Excel.
  • (Re) Abra el XLSM que hizo.
  • Lucro. :)

Nota: Probablemente tendrá que habilitar las macros y / o convertir el documento en un documento "confiable" para garantizar que las macros se ejecuten como se espera.

Más información:

Ƭᴇcʜιᴇ007
fuente
5

Al igual que los otros mencionados, use el beepcomando en Visual Basic (VB):

Function beepNow()
Beep 
End Function

Para obtener la codificación de VB, debe obtener la Developer tabdisponible (consulte: Obtener la pestaña Desarrollador visible )

Entonces, cuando tenga un cambio en una celda o condición, sonará un pitido. Macro de ejemplo para llamar al código VBS anterior:=IF(C2<>C3,beepNow(),"")

BlizzardsGambit
fuente
2
Solo tenga en cuenta que si no está utilizando ningún UDF de VBA, su introducción puede conducir a una degradación masiva del rendimiento (ya que, a diferencia de las funciones normales, solo se ejecutan en el hilo principal). No debería ser un problema con un solo pitido, pero si comienza a rociar esto en todas partes, tendrá problemas.
sapi
1
Desafortunadamente, esta función utiliza el altavoz de su PC, no su tarjeta de sonido y altavoces, sino el altavoz interno. FYI: en muchas empresas, el altavoz de la PC se ha eliminado o desactivado para que no escuche nada.
raddevus
1

Como alternativa a colocar el módulo en el ss, puede ponerlo en su Personal.xlsb. Esto le permitiría tener el "pitido" disponible para cualquier ss. Para ejecutarlo, modifique la Barra de herramientas de acceso rápido o inserte un botón / forma para hacer clic en su ss y asígnele la macro.

Ruthie
fuente
Bienvenido a Super User. Esto parece ser un comentario sobre las otras respuestas en lugar de una solución sustancialmente diferente, que es para lo que están destinadas las publicaciones de respuestas. Con un poco más de representación, podrás publicar comentarios.
Fixer1234
0

La respuesta publicada por @ Ƭᴇcʜιᴇ007 es excelente, con una excepción que otros han comentado: el Beepmétodo se basa en su altavoz integrado (y a veces deshabilitado) dentro de la computadora y no utiliza sus altavoces, por lo que es posible que no escuche nada.

Estoy publicando una solución basada en esa respuesta. Si hubiera menos contenido involucrado, habría publicado un comentario en su lugar.

Esto es lo que uso para reproducir un sonido con VBA en Windows. Utiliza los altavoces normales de su computadora en lugar de los altavoces integrados y, a menudo, desactivados a los que se accede con el Beepmétodo.

Comience con la respuesta de @ Ƭᴇcʜιᴇ007. Solo cambia Beepa esto:

PlaySound sound_Up

Puede cambiar el sonido cambiando sound_Upa otro elemento de la enumeración SoundType (lista) en el código a continuación, como sound_Completeo sound_Notify.

Option Explicit
' --------------------------------------------------
' --------------------------------------------------
'   REQUIRED DLL REFERENCE AND CONSTANTS
' --------------------------------------------------
' Reference to external procedure in DLL to play sounds

#If VBA7 Then
    ' 64-bit MS Office
    Private Declare PtrSafe Function sndPlaySound32bit Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As LongPtr) As LongPtr
#Else
    ' 32-bit MS Office
    Private Declare Function sndPlaySound32bit Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As LongPtr) As LongPtr
#End If

' --------------------------------------------------
' --------------------------------------------------
'   CONSTANTS
' --------------------------------------------------
'
Public Const SOUND_DO_NOT_WAIT          As String = "&H1"
Private Const SOUND_FILES_PATH          As String = "C:\Windows\Media\"

' --------------------------------------------------
' --------------------------------------------------
'   PUBLIC ENUMERATIONS
' --------------------------------------------------
'
Public Enum SoundType
    sound_None = 0
    sound_Up = 1
    sound_Down = 2
    sound_Attention = 3
    sound_Blocked = 4
    sound_Boop = 5
    sound_Complete = 6
    sound_Critical = 7
    sound_Ding = 8
    sound_Error = 9
    sound_Exclamation = 10
    sound_FastDown = 11
    sound_Information = 12
    sound_Notify = 13
    sound_PhoneRing = 14
    sound_RingOut = 15
    sound_Stop = 16
    sound_Tada = 17
    sound_Tone = 18
End Enum

' --------------------------------------------------
' --------------------------------------------------
'   PUBLIC METHODS
' --------------------------------------------------
'
Public Sub PlaySound(ByVal sound As SoundType)
' Plays a sound from a list (see the 'SoundType' Enum).  Code execution continues
'   while sound is playing.
    Dim soundFileName                   As String
    soundFileName = GetSoundFileName(sound)

    If Not soundFileName = vbNullString Then
        sndPlaySound32bit SOUND_FILES_PATH & soundFileName, SOUND_DO_NOT_WAIT
    End If
End Sub

' --------------------------------------------------
' --------------------------------------------------
'   PRIVATE DEPENDENCIES
' --------------------------------------------------
'
Private Function GetSoundFileName(ByVal soundToGet As SoundType) As String
' Returns a windows sound file name (not path) from a member of the custom
'   'SoundType' enumeration.

    Dim fName                           As String

    Select Case soundToGet
    Case sound_Up:          fName = "Speech On.wav"
    Case sound_Down:        fName = "Speech Off.wav"
    Case sound_Attention:   fName = "Windows Battery Low.wav"
    Case sound_Blocked:     fName = "Windows Pop-up Blocked.wav"
    Case sound_Boop:        fName = "Speech Misrecognition.wav"
    Case sound_Complete:    fName = "Windows Print complete.wav"
    Case sound_Critical:    fName = "Windows Critical Stop.wav"
    Case sound_Ding:        fName = "Windows Ding.wav"
    Case sound_Error:       fName = "Windows Error.wav"
    Case sound_Exclamation: fName = "Windows Exclamation.wav"
    Case sound_FastDown:    fName = "Speech Sleep.wav"
    Case sound_Information: fName = "Windows Information Bar.wav"
    Case sound_Notify:      fName = "notify.wav"
    Case sound_PhoneRing:   fName = "Windows Ringin.wav"
    Case sound_RingOut:     fName = "Windows Ringout.wav"
    Case sound_Stop:        fName = "chord.wav"
    Case sound_Tada:        fName = "tada.wav"
    Case sound_Tone:        fName = "Windows Balloon.wav"
    Case Else:              fName = vbNullString
    End Select

    GetSoundFileName = fName
End Function
ChrisB
fuente