MS Access: Передать значение из текстового поля формы в другое поле со списком формы для новой записи?

#vba #ms-access #ms-office

Вопрос:

Ладно, откровенно говоря, это действительно сложный вопрос для описания, и я довольно новичок в VBA.

У меня есть «Форма клиента» с командной кнопкой для создания нового заказа в «Форме заказа». Я могу нажать кнопку, чтобы открыть «Форму заказа» для новой записи, но я не могу заставить ее передать «Идентификатор клиента» в поле со списком «Форма заказа «»Идентификатор клиента». Мне нужна «Форма заказа» для автоматического заполнения информацией из «Формы клиента».

Форма клиента:
Форма клиента

Форма Заказа:
Форма Заказа
В поле со списком Клиент отображается Полное имя клиента, но оно привязано к идентификатору клиента

Вот код VBA, который я пробовал:

 Private Sub BtnNewOrder_Click()
    DoCmd.OpenForm FormName:="Order Form", View:=acNormal, OpenArgs:=Me.CustomerID.Value
    DoCmd.GoToRecord , , acNewRec
End Sub
 
 Private Sub Form_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then
        Me.CustomerID = Me.OpenArgs
    End If
End Sub
 

Я получаю следующую ошибку:
сообщение об ошибке

Я уже несколько дней просматриваю веб-страницы безрезультатно. Я уверен, что этот вопрос задавался раньше, но я не смог найти правильного решения. Не стесняйтесь просто указывать мне в правильном направлении.

Комментарии:

1. Старайтесь всегда быть явным о том, какое свойство вы хотите назначить, вместо того, чтобы на VBA сделать работу, выясняя, что объект по умолчанию-членов и косвенно ссылающейся на нее: CustomerID.Text = "value" связан во время компиляции и напоминает читателю, что CustomerID не только числовым значением, как кажется, на самом деле это объект со свойствами и методами: это контроль объекта. Строка CustomerIdBox = Me.OpenArgs уже читается лучше, и тогда, если она читается CustomerIdBox.Text = Me.OpenArgs , мы просто больше не можем ошибаться в своих намерениях. Хорошее название-это половина дела!

2. @MathieuGuindon Спасибо за совет! Я изменил имена объектов управления и использовал метод свойств». Text» с некоторым прогрессом. Теперь он извлекает и размещает правильные данные, но пытается сопоставить целочисленное значение «CustomerForm.CustomerIDBox» с видимым строковым столбцом в «OrdersForm.CustomerBox». Связанный столбец «идентификатор» скрыт; мне нужно, чтобы он соответствовал идентификатору, а не имени. Имеет ли это смысл?

3. Это было бы CustomerIdBox.Value тогда, нет?

4. @MathieuGuindon, когда я пытаюсь «.Значение» или сопоставить пользовательскую форму.Полное имя. Текст в поле Форма заказа.CustomerBox. Текст (видимый столбец) Я не получаю ошибки, но значение выпадающего списка не меняется. Как будто ничего не происходит.

Ответ №1:

Вы должны использовать событие «Формы при загрузке». Открытое мероприятие слишком рано.

При открытом событии — позволяет проверять элементы управления и значения — вы можете установить cancel = true, и форма не будет загружаться. Итак, on open предназначен для проверки/тестирования, если вы хотите, чтобы форма открывалась на основе пользовательского кода, который проверяет вещи. Если вы не хотите, чтобы форма загружалась — вы можете установить Cancel = true.

Событие загрузки: Здесь должен произойти ваш код настройки, заданные переменные, возможные элементы управления набором и т. Д. Таким образом, вы не можете изменять элементы управления в событии «При открытии» слишком рано, но вы МОЖЕТЕ изменять элементы управления и значения форм в событии «При загрузке».

Комментарии:

1. Я переключился на событие при загрузке и изменил имя, как упоминал @MathieuGuindon. Тем не менее, я все еще сталкиваюсь с проблемами.. Попытка сопоставить числовой идентификатор клиента из формы клиента с полем клиента в форме заказа приводит к ошибке: «введенный вами текст не является элементом в списке». Поле со списком представляет собой поиск по двум столбцам (идентификатор пользователя, полное имя), привязанный к идентификатору пользователя, но идентификатор пользователя скрыт с шириной столбца 0 дюймов. Это похоже на то, что Access пытается сопоставить данные CustomerIDBox со списком Full_Name.

2. Как правило, access использует текст для поля со списком. Так что это настройка, и она преобразуется в идентификатор для вас. так что используйте MyComboBox. Текст = «некоторый текст для установки», или вы можете использовать идентификатор и использовать . Значение, такое как MyComboBox.Значение = 55 — так . Значение или .Text-это способ выбора между настройкой текста или значением идентификатора.