Передача объектов формы в подпрограммы / функции VBA в MS-Access - PullRequest
1 голос
/ 27 июля 2010

У меня есть несколько приложений с множественным выбором. Есть 4 зеленых галочки и 4 красных крестика, которые появятся на основе правильного или неправильного ответа.

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

Я решил создать подпроцедуру, которая принимает три аргумента, их ответ («A», «B», «C» или «D»), ссылку на зеленое изображение, чтобы сделать видимой, и ссылку на красное изображение, чтобы сделать виден.

К сожалению, я не могу заставить их передать ссылки вообще. Intellisense знает, на какие объекты я ссылаюсь.

Private Sub btnA_Clicked ()
  Question_Answered("A", imgGreenA, imgRedA) 'images referenced from form'
End Sub

Private Sub Question_Answered (strUserAnswer as String, imgGreen as Image, imgRed as Image)
  ...
End Sub

Другая (вероятно, связанная) проблема заключается в том, что я не могу назначить изображения из формы локальным переменным в этом подпункте Question_Answered, например:

Dim imgGreen as Image
imgGreen = imgGreenA

Использование MS-Access 2003 MDB с MS-Access 2007.

Ответы [ 5 ]

2 голосов
/ 27 июля 2010

Вызов VBA-функции с объектом управления работает без проблем.Вы написали свою функцию в той же форме или в каком-то модуле?

Чтобы назначить управляющую переменную, вы должны использовать set, поэтому это Set imgGreen = imgGreenA.

1 голос
/ 28 июля 2010

Поскольку вы не публикуете содержимое своей подпрограммы Question_Anseded (), невозможно сказать, в чем проблема, но первое, что бросается в глаза, это то, что вы объявили изображения как изображения, а не как элементы управления , Изображение на самом деле никогда не находится непосредственно в форме, а заключено в элемент управления изображением, поэтому элемент управления, с которым вы собираетесь работать, фактически не будет изображением вообще.

Итак:

  Private Sub Question_Answered (ByVal strUserAnswer As String, ByRef imgGreen As Control, ByRef imgRed As Control)

Теперь я могу ошибаться, но это место для начала.

(также обратите внимание, что я явно говорю о вызове ByRef или ByVal)

1 голос
/ 27 июля 2010

Вы пробовали

Private Sub Question_Answered (strUserAnswer as String, ByRef imgGreen as Image, ByRef imgRed as Image)
  ...
End Sub

, а также попробуйте написать оператор вызова без скобок, у меня были проблемы с тем, что VBA не передает ссылки, когда вещи заключены в скобки. например.

Private Sub btnA_Clicked ()
  Question_Answered "A", imgGreenA, imgRedA 'images referenced from form'
End Sub

и, как говорит HansUp, вам не нужно (или не нужно) изменять цвет imgGreen, когда он находится внутри Question_Anspted

0 голосов
/ 17 октября 2014

У меня была такая же проблема, и я решил ее, используя «As Object» в подчиненном интерфейсе. Попробуйте это:

    Private Sub btnA_Clicked ()
       Question_Answered("A", imgGreenA, imgRedA) 'images referenced from form'
    End Sub

    Private Sub Question_Answered (strUserAnswer as String, imgGreen as Object, imgRed as Object)
       ...
    End Sub
0 голосов
/ 27 июля 2010

Если вы получили сообщение об ошибке, когда саб вызван,

Измените: Question_Answered("A", imgGreenA, imgRedA)

На: Question_Answered strUserAnswer:="A", imgGreen:=imgGreenA, imgRed:=imgRedA

...