Могу ли я издать звуковой сигнал Excel после завершения расчета?


13

У меня есть эти действительно длинные вычисления в Excel. Я хотел бы отвлечь свое внимание от экрана и сделать что-то на моем столе, но будьте предупреждены, когда вычисление закончится.

Есть идеи?


1
Как именно вы делаете расчет? Если это в VBA, почему бы не использовать метод VBA "Beep" ? Что ты уже пробовал?
— Ƭᴇcʜιᴇ007

2
@ techie007 не VBA. Просто функции в больших таблицах Excel.
— Элиягу

1
Тем не менее, вы, вероятно, можете использовать функцию Beep, особенно если ваш SS фактически использует «функции» для вычисления вместо «формул». Но «как» вы можете использовать это в значительной степени зависит от того, как работает ваша электронная таблица, чего мы не знаем. Например, вы просто вводите значение в ячейку и затем ждете действительно долгое время, чтобы оно закончилось, или вы нажимаете кнопку, чтобы начать вычисление после заполнения ячеек? Если вы нажали F11, чтобы открыть редактор VBA, там есть куча кода?
— Ƭᴇcʜιᴇ007

@ techie007 Я использую формулы. Я нажму F9 после большого количества работы и буду ждать.
— Элиягу

Вы бы сделали свои расчеты по-другому. То, что вы хотите, не возможно, если все, что вы делаете, это говорите Excel выполнить вычисления на открытой рабочей
— книге

Ответы:


21

Хорошо, что-то попробовать (инструкции предполагают, что Excel 2007 или новее):

  • Откройте вашу рабочую книгу.
  • Сохраните его как SS с поддержкой макросов ( .XLSM).
  • Нажмите Alt-F11, чтобы открыть окно кодирования VBA.
  • Щелкните правой кнопкой мыши VBAProject ( yourbook.xlsm) и выберите «Вставка» → «Модуль».
  • Откройте только что созданный «Module1».
  • В модуле вставьте этот фрагмент:

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

    Это приведет к переназначению клавиши F9 при каждом открытии SS. Когда вы нажмете F9, он будет работать F9Handlerвместо обычного расчета.

  • В модуле вставьте этот фрагмент:

    Sub F9Handler()
        Application.Calculate
        Beep
    End Sub
    

    Это то, что теперь будет работать, когда вы нажмете F9. Первая строка запускает Application.Calculate(то, что обычно выполняет F9), а затем гудки.

  • Сбереги все.

  • Закройте Excel.
  • (Re) Откройте XLSM, который вы сделали.
  • Прибыль. :)

Примечание: вам, вероятно, придется включить макросы и / или сделать документ «доверенным», чтобы обеспечить выполнение макросов в соответствии с ожиданиями.

Больше информации:


5

Как и другие упомянутые, используйте beepкоманду в Visual Basic (VB):

Function beepNow()
Beep 
End Function

Чтобы получить VB-кодирование, вам нужно получить Developer tabдоступ к нему (см. Видимость вкладки «Разработчик» )

Поэтому, когда у вас есть изменение в ячейке или состоянии, оно подаст звуковой сигнал. Пример макроса для вызова кода VBS выше:=IF(C2<>C3,beepNow(),"")


2
Просто имейте в виду, что если вы в настоящее время не используете какие-либо пользовательские функции VBA, их внедрение может привести к значительному снижению производительности (поскольку, в отличие от обычных функций, они выполняются только в основном потоке). Не должно быть проблем с одним звуковым сигналом, но если вы начнете распространять его везде, у вас будут проблемы.
— Сапи

1
К сожалению, эта функция использует динамик компьютера - не звуковую карту и динамики, а встроенный динамик. К вашему сведению - во многих компаниях динамик ПК был удален или отключен, поэтому вы ничего не услышите.
— Раддевус

1

В качестве альтернативы размещению модуля в ss, вы можете поместить его в свой Personal.xlsb. Это позволит вам иметь «звуковой сигнал», доступный для любой сс. Чтобы запустить его, либо измените панель быстрого доступа, либо вставьте кнопку / форму, чтобы щелкнуть мышью по ss и назначить ей макрос.


Добро пожаловать в Супер пользователя. Похоже, что это комментарий к другим ответам, а не существенно другое решение, для которого предназначены посты с ответами. Еще чуть-чуть, вы сможете оставлять комментарии.
— fixer1234

0

Ответ, отправленный @ Ƭᴇcʜι is007, отличный, за одним исключением, которое прокомментировали другие: Beepметод основан на использовании встроенного (и иногда отключенного) динамика в компьютере и не использует ваши динамики, поэтому вы можете ничего не слышать.

Я публикую обходной путь на основе этого ответа. Если бы было меньше контента, я бы оставил комментарий.

Вот что я использую для воспроизведения звука с VBA в Windows. Он использует ваши обычные компьютерные колонки вместо встроенных и часто отключенные колонки, доступные по Beepметоду.

Начните с ответа @ Ƭᴇcʜιᴇ007. Просто измени Beepна это:

PlaySound sound_Up

Вы можете изменить звук, изменив sound_Upдругой элемент из списка SoundType (список) в приведенном ниже коде, например, sound_Completeили 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.