I think that you might be in danger of digging yourself into a hole by overcomplicating what is in essence a relatively simple model. Let's go back to first principles.
BusinessContacts is a sub-type of Contacts in that a business contact shares all attributes of a contact, but not those of other sub-types. A business contact might also be a personal contact of course. A type hierarchy is modelled by a one-to-one relationship
type, so the Contacts table would have a primary key ContactID say, which can be an autonumber for convenience. Other non-key columns in the table would represent attributes common to all contacts. In the BusininessContacts table the primary key ContactID
would not be an autonumber, but a straightforward long integer data type. It would also be a foreign key referencing the primary key of Contacts.
Each table modelling a sub-type can have its own address columns. This might, at first glance appear to contradict the principle stated above that a sub-types attributes are not shared by other sub-types. This is not the case. The fact that the address attributes
in each sub-type table have the same names does not mean that they are the same attributes. They are simply same-named attributes. A CityID column in each table would represent the city as an attribute of that sub-type, not of all other sub-types. A contact
is very likely to have a business address in one city, and a personal address elsewhere.
The user interface can be a Contacts form, with subforms for each sub-type, linked on ContactID in each case. Each subform can be on a separate page of a tab control with no problem. A common interface in similar situations is to have the primary data from
the Contacts table in the detail section of the parent form, with secondary data from the same table on page 1 of a tab control. The other pages of the tab control will each have a subform based on one of the referencing tables, which might be subtypes or
other tables referencing Contacts in a one-to-many relationship type.
When it comes to attributes like email addresses and phone numbers, having multiple columns in a table for primary, secondary instances of each attribute is bad relational database design. It 'encodes data as column headings'. A fundamental principle of the
database relational model is the Information Principle (Codd's Rule #1). This requires that all data be stored as values at column positions in rows in tables, and in no other way.
The correct design would be to have related Emails and Phones tables in which each email address or phone number is represented by a value in a single column. So a contact with two email addresses would have two rows in the related table. In the related table
it is also necessary to differentiate business, personal addresses etc, so an Emails table would be along these lines:
Emails
….ContactID (FK)
….ContactCategoryID (FK)
….EmailAddress
This table is 'all key', i.e. its primary key is a composite one made up of all three columns. The Phones table would be similarly structured. You can if you wish add an IsPrimary column of Boolean (Yes/No) data type to indicate which is the primary address
or phone, or you might want to number the addresses or phones per contact 1,2 etc to indicate their priority. ContactCategoryID would reference the primary key of a ContactCategories table in which there would be one row per category of contact. In relational
database terms the table is this modelling a binary many-to-many relationship type by resolving bit into two unary (one-to-many) relationship types.
A phones table would probably also have, in addition to the ContactID foreign key, a PhoneTypeID column as a foreign key referencing a PhoneTypes table with rows for landline, mobile (cell-phone) types, and any others you might think of.
For data entry there would be, within each sub-type subform further subforms based on queries which, for example would restrict the email addresses or phone numbers on the ContactCategoryID value relevant tom that subform. The DefaultValue property of a hidden
ContactCategoryID txt box control in the subform would be the relevant value for that subform.
With a logically structured model like this you should have little trouble putting together the form, its subforms and their subforms. In each case the LinkMasterFields and LinkChildFields properties would be ContactID.
For searching via an unbound combo box in the form header you can navigate to the relevant contact with code in its AfterUpdate event procedure, which first finds the contact in the form's RecordsetClone, and then synchronizes the form's Bookmark with the recordset's
bookmark. You'll find a simple example in FindRecord.zip in my public databases folder at:
https://onedrive.live.com/?cid=44CC60D7FEA42912&id=44CC60D7FEA42912!169
Note that if you are using an earlier version of Access you might find that the colour of some form objects such as buttons shows incorrectly and you will need to amend the form design accordingly.
If you have difficulty opening the link, copy the link (NB, not the link location) and paste it into your browser's address bar.
In this little demo file, in addition to simply going to a contact record, there are illustrations of how to navigate or filter a form in other ways, including searching on the basis of a value in a subform.
In the same OneDrive folder is a TypeHierarchy demo, which provides a simple illustration of a model for this, using a hypothetical academic institution as its example, along with one type of interface for such a model.
As regards executing your queries, calling the Execute method of the current database object will avoid the prompts. This also accepts a dbFailOnError option, which will enable you to trap and handle any error which might occur in the execution of the query.
To indicate successful execution of the query would merely be a matter of calling the MsgBox function if no error has been raised.