#events #excel #compiler-errors #vba
#Мероприятия #excel #ошибки компилятора #vba
Вопрос:
Я пытаюсь использовать событие MouseMove с помощью командной кнопки, но не могу понять, как предотвратить следующую ошибку:
Ошибка компиляции: объявление процедуры не соответствует описанию события или процедуры с таким же именем.
Код очень прост. Я использовал здесь «фиктивный» код, потому что я никогда не могу ввести обработчик события, чтобы получить доступ к чему-то полезному.
Private Sub Button_Name_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim X as Integer
x = x 1
End Sub
Я взял список параметров непосредственно из обозревателя объектов. Я получаю аналогичные результаты с другими событиями, включая DblClick (), но не Click (). Я думаю, что я, должно быть, допускаю какую-то фундаментальную ошибку, но не смог ее идентифицировать. Помогите!
Комментарии:
1. Я думаю, вы неправильно понимаете аспект программирования, основанного на событиях. Событие MouseMove срабатывает при перемещении мыши. Оно никогда не вызывается и не назначается кнопке. Если вам нужно, чтобы что-то происходило при нажатии кнопки, поместите это в обработчик нажатия кнопки.
Ответ №1:
Я не совсем понимаю, почему вы взяли список параметров непосредственно из обозревателя объектов. Если у вас открыт код вашей пользовательской формы в окне VBA, вы можете выбрать командную кнопку в левом выпадающем списке прямо над кодом и событие MouseMove в правом выпадающем списке. Затем требуемый код вставляется автоматически. Это будет немного отличаться от вашего кода:
Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
End Sub
Следующая ошибка, с которой вы столкнетесь, — это дублирующее объявление X. Это уже параметр подпрограммы. Таким образом, вы не можете повторно использовать его в подпрограмме.
Исправив эти две вещи, событие перемещения мыши будет срабатывать даже на командной кнопке.
Комментарии:
1. Спасибо. Ваш ответ был точен. Я взял свой исходный список параметров из ссылки на VBA Language Reference, в которой отсутствовали значения ByVal. X были просто фиктивным кодом и отсутствовали в «реальном» списке.
Ответ №2:
Ошибка возникает из-за изменения спецификации аргумента по умолчанию (вы удалили ByVal
). Соответствующие спецификации аргументов отображаются автоматически, если вы выбираете MouseMove из выпадающего меню в правом верхнем углу в редакторе VBA (после выбора вашей командной кнопки в выпадающем меню в левом верхнем углу). Спецификацию аргумента изменять не следует, иначе это не сработает. VBA ожидает этот конкретный список аргументов, и если он найдет что-то другое, он не будет компилироваться. (Единственное, что вы можете изменить, это имя переменных аргумента — но ничего больше.)
Это работает:
Private Sub CommandButton1_MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
X = X 1 ' or whatever you need to do with X and Y
MsgBox "MouseMove! " amp; X amp; " " amp; Y
End Sub
Я должен признать, я нахожу, что использовать событие MouseMove на командной кнопке довольно необычно — но, может быть, у вас есть свои причины? Я бы обязательно хотел их услышать.
Также, как указано @Codo, вы не должны повторно объявлять X
внутри подраздела. Это уже было объявлено в качестве аргумента Sub, и вы можете использовать его сразу (например, X = X 1
или что-то еще). Вам не нужно повторно объявлять это с помощью Dim
— фактически, это приведет к ошибке во время компиляции.
Комментарии:
1. Спасибо. Как упоминалось выше, добавление ByVal исправило проблему. Моя первоначальная мысль при использовании MouseMove заключалась в том, чтобы показывать текстовое поле при наведении курсора мыши на соответствующую командную кнопку.