Доступ к ленте OnAction - PullRequest
       38

Доступ к ленте OnAction

0 голосов
/ 21 марта 2020

Ниже мой XML код

    <toggleButton id="CloseBtn" label = "Close" 
        size="large"
        imageMso="FrameDelete"
        onAction= "=InvoiceRibbon_Close()"
        getPressed="MyToggle"
        keytip="C"
        supertip= "Close current window."/>

По функции указан код формы:

Public Function InvoiceRibbon_Close() As Boolean

Работает на трех компьютерах. Два имеют доступ к Office 2016, а один - только во время выполнения Access 2016. Это не работает на двух других компьютерах. Обе версии доступны только в 2016 году. Все три компьютера времени выполнения 2016 года - это новые компьютеры, число которых Windows 10. Прилагается сообщение об ошибке.

enter image description here

Функция onAction находится внутри кода формы VBA. , Ниже приведено несколько тестов, которые я провел.

  1. Если я переместлю InvoiceRibbon_Close в Module, он будет работать.
  2. В функции OnAction модуля я все еще не могу вызвать функцию, которая находится внутри Form, с помощью Call Forms ( "FormName"). InvoiceRibbonTesting_Close. Сообщение об ошибке остается прежним.
  3. Функция в форме работает. Я использовал это некоторое время.
  4. Я хочу сохранить функцию в форме VBA. У меня есть сотни функций, которые связаны с формой. Это будет огромная задача, чтобы переместить его в модуль

1 Ответ

0 голосов
/ 21 марта 2020

Ну, на компьютерах, которые выходят из строя, работает ЛЮБОЙ код VBA? Итак, код кнопки, а что нет - проверьте, работают ли они. Если они не работают, то, конечно, код ленты не будет работать.

Другая проблема: проверьте, работает ли форма таймера. Помните, что идея FANTASTI C, которую вы используете, состоит в том, чтобы вызывать функции в форме, а НЕ ИСПОЛЬЗОВАТЬ ужасные обратные вызовы, которые ДОЛЖНЫ быть помещены в стандартные модули кода и, следовательно, не привязаны к данной форме, в которой 99% времени мы хотите, чтобы код в этой форме запускался и использовался (скажем, как любой стандартный код кнопки, но теперь вы используете ленту. Итак, ваша установка хороша и очень рекомендуется).

Некоторые вещи, которые нужно проверить для этого Ошибка: работает ли VBA вообще? Проверьте параметры надежного расположения.

Есть ли у вас форма таймера, работающая в фоновом режиме. Это ОЧЕНЬ, но ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ важно проверить. Что происходит с формой таймера: то, что фокус формы фактически ИЗМЕНЯЕТСЯ к форме таймера во время выполнения кода таймера, а затем возвращается обратно к той форме, которая в данный момент имеет фокус. Это ОГРОМНО ОГРОМНО ОГРОМНО, поскольку при нажатии на кнопку ленты запускается ПЕРВАЯ ПОПЫТКА код в модуле кода текущей ориентированной формы. Это хорошо и здорово, так как, как вы заметили, Если у вас есть (и должен) быть тот код, который принадлежит этой форме.

Однако, ЕСЛИ В ТЕЧЕНИЕ ВРЕМЕНИ вы нажимаете на ленту, и текущие изменения формы изменяются (например, код таймера или другой код формы, который MIGHT / MAYBE / COULD / PERHAPS / POSSBILE меняет фокус формы на другой) ?

Хорошо, лента будет искать и пытаться найти эту подпрограмму в форме с текущим фокусом. Таким образом, запущенная форма таймера изменит фокус формы, и если вы нажмете эту кнопку во время кода формы таймера выполняется, тогда ТОЧНАЯ ФОРМА в ТОЧКУ ТОЧКИ во времени фактически имеет фокус, и, таким образом, Лента фактически попытается найти и запустить имя функции на вашей ленте в этой форме таймера !!

Вы можете довольно быстро протестируйте вышеупомянутое, удалив для проверки все формы таймера, которые у вас работают.

Другая вещь, которую нужно искать, это любой вид случайного изменения фокуса форм. Так, скажем, вы недавно добавили субформу или другую навигацию форма или что нет? Ну, теперь форма, на которую вы думаете, которая имеет фокус, на самом деле не имеет фокуса, и, следовательно, лента не может найти рутину бега Это часто случается, когда вы говорите, переключитесь на хороший новый компьютер, используете, скажем, среду выполнения. На более новой машине часто все работает намного лучше и быстрее, поэтому изменение фокусировки, которого вы не видели, теперь происходит гораздо более агрессивно.

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

Таким образом, это ненадежное расположение (ie: другой код VBA работает просто отлично), затем следует проверить и проверить, работает ли какая-либо форма таймера (поскольку, как было отмечено, такие формы ОЧЕНЬ быстро работают получить и отобрать фокус у текущих форм - и если вы одновременно нажмете ленту во время выполнения кода таймера, произойдет также изменение фокуса, и, таким образом, кнопка ленты потерпит неудачу.

Результат ТАКЖЕ означает: не используйте форму (ы) таймера, если вы можете избежать этого. Код таймера, если у вас есть, должен быть ОЧЕНЬ хорошим и эффективным кодом - лучше войти, запустить ОЧЕНЬ быстро и выйти.

У вас нет агрессивного интервала таймера. Так, скажем, какой-то таймер должен проверять и закрывать доступ? Ну, проверка 10 раз в секунду или даже раз в секунду ЗАВЕРШЕНА. 3 секунды.

Обратите внимание, что вышеуказанная проблема с таймером также часто приводит к сбою кнопок печати отчета - вы обнаруживаете, что печатается какая-то пустая форма (и эта пустая форма на самом деле является формой таймера, которая была в фокусе при нажатии кнопки печати отчета). )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...