2010-11-02 3 views
0

В конструкторе форм доступа я создал 73 ярлыков с именем Label0 до Label72. Этикетки находятся в виде заголовка формы «MainScreen», и после открытия формы открывается щелчок.Проблемы, связанные с серией элементов управления в заголовке в форме в Access с использованием VBA

Я пытаюсь обновить свои позиции, используя этот фрагмент, но он не работает, любая идея, почему бы и нет, или как заставить его работать?

Я получаю сообщение об ошибке "Введенное выражение относится к объекту, который не существует"

For X = 0 To 72 
    CtName = "Label" + Chr(X) 
    If ((X Mod 2) = 0) Then 
     Form_MainScreen.FormHeader.Controls(CtName).Top = 0 
    Else 
     Form_MainScreen.FormHeader.Controls(CtName).Top = 226 
    End If 
Next 

Спасибо :)

+1

Я бы предположил, что * «Введенное выражение относится к объекту, который не существует» *. Можете ли вы установить контрольную точку в своем коде и проверить коллекцию 'Form_MainScreen.FormHeader.Controls', чтобы подтвердить, что элемент управления на самом деле существует? – Tomalak

+0

Наведите указатель мыши на ту же ошибку, и она просто витает над «Form_MainScreen.FormHeader», но я знаю, что у нее заголовок. :/ – Tim

+0

@Tim: Hm ... Что вы подразумеваете под «зависанием мыши»? Просто установите точку останова на строке 'If ... Then' и добавьте' Form_MainScreen.FormHeader.Controls' в окно Watch, чтобы проверить его, когда там выполняется перерыв. – Tomalak

ответ

3

Существует проблема с этим оператором присваивания:

CtName = "Label" + Chr(X) 

Chr (значение) функция возвращает символ, код ASCII соответствует значению вы передаете ему. Например, когда x = 70, значение CtName будет «LabelF» ... это не то, что вы хотите.

Используйте CStr() функция преобразования числа в его строковое представление:

CtName = "Label" & CStr(x) 

Но вы на самом деле не нужно даже в CStr() функции; VBA преобразует число при выполнении конкатенации (с оператором &):

CtName = "Label" & x 

Наконец, если ваш фрагмент кода был из Form_Open событий формы, используйте Me для обозначения текущей формы:

'Form_MainScreen.Controls(CtName).Top = 226 ' 
Me.Controls(CtName).Top = 226 
+0

FWIW, это суммирует. +1 – Tomalak

+0

<3333 Спасибо вам обоим – Tim

1

Попробуйте

CtName = "Label" & X 

конкатенации строк делает не работайте с + в VBA. (ну это, но только тогда, когда оба операнда являются строками. ИМХО, это лучше забыть, что и всегда использовать & см. Ниже.)

Кроме того, Chr() не преобразует число в строку, CStr() делает это , Но нет необходимости называть это явно, поскольку VBA самостоятельно выполняет необходимые преобразования.


Коррекция: Для того, чтобы быть полностью честным, конкатенация фактически делает работу с + см комментарии ниже. Но я бы определенно не рекомендовал его, потому что он подвержен ошибкам, когда один из операндов не является строкой. По моему опыту, это всегда лучше использовать &, чтобы объединить строки.

+0

'? "a" + "b" 'возвращает' ab' – HansUp

+0

@HansUp: Но в этом случае 'X' является числом. И '' a "+ 9' возвращает несоответствие типа, тогда как' 'a '& 9' возвращает' 'a9" '. Конкатенация строк с помощью '+' является просто неправильным использованием оператора '+', так как имеется выделенный и совместимый с ошибкой оператор конкатенации. – Tomalak

+0

@Tomalak Оператор + может использоваться для объединения двух строк. Таким образом, это утверждение ложно и вводит в заблуждение: «Конкатенация строк не работает с + в VBA». – HansUp

Смежные вопросы