Макросы в Excel !

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Всегда указывайте, какая ошибка выдается и на какой строке.
Может у Вас просто нет winmm.dll, из которой вызывается функция.
&quot писал(а):Active Sheet. Range (xx:xx) Clear
ActiveSheet.Range("xx:xx").Clear
BigGonschik
Сообщения: 11
Зарегистрирован: 18 мар 2009, 20:44

Я добавляю модуль и в модуль вставляю даний код:
------------------------------------------------------
Declare Function PlaySound Lib "winmm.dll" _
Alias "PlaySoundA" (ByVal lpszName As String, _
ByVal hModule As Long, ByVal dwFlags As Long) As Long
Function ALARM(L10, >10)
Dim MIDFile As String
Const SND_ASYNC = &H1
Const SND_FILKNAME = &H20000
If Evaluate(Cell.Value & Condition) Then
WAVFile = ThisWorkbook.Path & "\a.mid"
Call PlaySound(MIDFile, Ob, SND_ASYNC Or SND_FILENAME|
ALARM = True
Else
ALARM = False
End If
End Function
------------------------------------
но когда хочу включить етот макрос ево просто нету в списке макросов??почему?


в макросе очистки
Sub MeMacros3()
Active Sheet. Range (A1:C5) Clear
End Sub

викидивает ошибку: "Compile error. Syntax error"
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

По поводу второй ошибки я Вам уже ответил (см пост #11)

Теперь PlaySound:
Тут сразу 2 ошибки
1)
Call PlaySound(MIDFile, Ob, SND_ASYNC Or SND_FILENAME|
неправильно скопировали. Там что-то было еще.
2)
В списке макросов ничего и не должно появиться, так как ALARM это функция, а не макрос.

А в-третьих PlaySoundA если я не ошибаюсь, воспроизводит файл из ресуров приложения. Это можно сделать из VB, но из VBA использовать эту функцию Вы не сможете, так как второй аргумент - это Handle загруженного модуля, а первый - это наверное имя ресурса.
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

PlaySound согласно MSDN, умеет проигрывать и из ресурсов, и из файла и системные звуки и файл из памяти.

Вот пример, который работает в Excel:

Код: Выделить всё

Option Explicit
Declare Function PlaySound Lib "winmm.dll" _
        Alias "PlaySoundA" (ByRef pszSound As String, _
        ByVal hmod As Long, ByVal fdwSound As Long) As Boolean
Const SND_ASYNC = 1
Const SND_FILENAME = 131072

Sub PlaySong()
    Call PlaySound(ThisWorkbook.Path & "\snd.wav", 0, SND_ASYNC Or SND_FILENAME)
End Sub
Звуковой файл "snd.wav" должен лежать в одной директории с рабочей книгой. Аудиокодек, которым можно проиграть файл должен быть установлен в системе.
На заказ: VBA, Excel mc-black@yandex.ru
BigGonschik
Сообщения: 11
Зарегистрирован: 18 мар 2009, 20:44

Привет Naeel Maqsudov, извинити за двойной вопрос по поводу Пост#11.
Теперь к PlatSound, второй раз копиюю ету функцию, она из книжки по VBA.
---------------------------------------------------------------------
Проигрывание звука из функции рабочего листа
Функция Alarm, показанная ниже, предназначена для применений в формуле рабочего
листа. Она использует функцию Windows API, чтобы проигрывать звук, если ячейка соответ-
ствует определенному условию.
-----------------------------------------------------------------
Declare Function PlaySound Lib "winmm.dll" _
Alias "PlaySoundA" (ByVal lpszName As String, _
ByVal hModule As Long, ByVal dwFlags As Long) As Long
Function ALARM(Cell, Condition)
Dim WAVFile As String
Const SND_ASYNC = &H1
Const SND_FILKNAME = &H20000
If Evaluate(Cell.Value & Condition) Then
WAVFile = ThisWorkbook.Path & "\sound.wav"
Call PlaySound(WAVFile, Ob, SND_ASYNC Or SND_FILENAME|
ALARM = True
Else
ALARM = False
End If
End Function
------------------------------------------------------------------------
Функция Alarm имеет два аргумента: ссылку на ячейку и "условие" (выраженное в виде
строки). Например, следующая формула использует функцию Alarm для проигрывания фай-
ла WAV, если значение в ячейке В13 больше или равно 1000:
-ALARM <В13,- ">=1000")
Функция использует функцию VBA E v a l u a t e , чтобы определить, соответствует ли зна-
чение ячейки заданному критерию. Если условие выполнено (и звук воспроизведен), функция
возвращает ИСТИНА, в противном случае она возвращает ЛОЖЬ.
-----------------------------------------------------------
все што било в книжке.


Привет mc-black. Когда я ваш код скомпилировал то звук не бил воспроизведен, а толька такой щелчок или што то в етом роде! В чем проблема может бить?Файл я розместил в той директории што и робочаякнига :(
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Код: Выделить всё

Option Explicit
Declare Function PlaySound Lib "winmm.dll" _
        Alias "PlaySoundA" (ByRef pszSound As String, _
        ByVal hmod As Long, ByVal fdwSound As Long) As Boolean
Const SND_ASYNC = 1
Const SND_FILENAME = 131072

Sub PlaySong()
    Dim bRet As Boolean

    bRet = PlaySound(ThisWorkbook.Path & "\snd.wav", 0, SND_ASYNC Or SND_FILENAME)
    If bRet Then
        MsgBox "Звук проигрывается, проверьте громкость и запись в файле"
    Else
        MsgBox "Ошибка при проигрывании звука"
        ' Возможно формат файла не поддерживается системой
        ' или в системе не установлен соответствующий аудиокодек
    End If
End Sub
Мой пример работает, я сам у себя проверял его, так что не надо! Здесь я добавил проверку на ошибки, которые могут возникнуть. Если есть сомнение в запускаемом файле, его формате и аудиокодеке, советую проверить код на одном из аудиофайлов, которые идут вместе с Windows:
в папке "c:\WINDOWS\Media" (Windows XP). Просто скопируй любой из тех файлов в папку с Книгой и переименуй его в snd.wav.

P.S. Не надо больше писать слово "скомпилировал", т.к. VBA интерпретируется как любой скриптовый язык, он компилироваться в машинный код не может по определению. Если вы будете экспериментировать с VB6, то там эта фраза будет более уместна.
На заказ: VBA, Excel mc-black@yandex.ru
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

mc-black, полагаю насчёт компиляции VBA вы неправы.
Изображение
На самом деле VBA компилируется в промежуточный p-code, записываемый
одним из потоков в VBAProject (OLE Storage). Кстати VB6 может компилировать
так же в P-Code.
Термин компиляция отнюдь не подразумевает компиляцию именно в машинный код (Вспомните тот же .NET :) )
Более того, при нажатии F5 в VBE P-Code/Ex-Code компилируется в память в
нативный машинный код. Правда в файле он не сохраняется.
Подробнее об этом можно прочитать например здесь
http://orlando.mvps.org/VBADecompilerMore.asp
Хотя разумеется BigGonschik употребляет термин "скомпилировал" не к месту.
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Насчет промежуточного кода я полностью согласен, так же и как насчет .NET

Оффтоп:
Андрей, поржал над твоей историей в livejournal про резюме сисадминов :-)
На заказ: VBA, Excel mc-black@yandex.ru
BigGonschik
Сообщения: 11
Зарегистрирован: 18 мар 2009, 20:44

Привет. Извините на счет слова "Компиляция", я ево не так использовал, но ви меня поняли.я просто не очень в прогармирование шарю, и слово Компиляция понимаю как подготовлений кода прогшарми к работе, не вникая в глубину самого процеса.
Mc Black да, ваш макрос работает и викидиваєе такое сообщение:
"Звук проигрывается, проверьте громкость и запись в файле"
Но файл, которий я скопировал из "Media" не бил воспроизведен. Почему??
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Проверял еще раз у себя на домашнем компьютере - звук системный есть, но не тот что-то.. Сам пока не разобрался почему так. Если получится заставить его проиграть файл, выложу что у меня получилось. На рабочем компьютере нет динамиков - звук проверяю только по возвращаемому функцией результату. Разберемся со временем, если не к спеху.
На заказ: VBA, Excel mc-black@yandex.ru
Ответить