Ошибка компиляции события VBA Excel с событием MouseMove на командной кнопке

#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 заключалась в том, чтобы показывать текстовое поле при наведении курсора мыши на соответствующую командную кнопку.