Tuesday, October 13, 2026

More Wi-Fi Made My Wi-Fi Worse

It is entirely possible to improve your Wi-Fi setup right into a pile of problems. I know, because I did it. I added extenders, tried mesh systems, increased coverage around the house, and somehow ended up with Ring cameras that kept going offline and Alexa devices that suddenly forgot how to play music. Apparently, my smart home needed me to stop being so helpful.

The lesson is not that Wi-Fi extenders or mesh systems are always bad. Plenty of people use them successfully. The real lesson is that adding more equipment does not automatically make a network better. Every extra box adds another connection, another setting, another possible source of interference, and another opportunity for a stubborn device to connect to something other than what you expected.

My main router is near the living room, where the television needs a good, fast connection. That part works fine. The problem was the backyard. The Ring cameras are much farther away, so their signal was weaker. Naturally, I figured I would just add equipment to extend the Wi-Fi signal out there. How complicated could that be?

At one point, I had multiple extenders placed around the house and yard. Instead of improving things, the cameras became unreliable. The Alexa devices were not particularly thrilled either. The Ring cameras were especially talented at going offline, which is a fairly disappointing feature in something whose whole purpose is to let you see what is happening outside.

When I removed the extra extenders, things started working better. That was a pretty good clue. I cannot claim I performed a controlled laboratory experiment and isolated every possible cause, but the practical result was obvious: my expanded Wi-Fi setup caused more trouble than my simpler one.

I also tried several mesh Wi-Fi systems. On paper, mesh sounds great. You place several units around the house, they all share one network name, and devices are supposed to use whichever access point gives them the best connection. In theory, you can walk around the house without thinking about which Wi-Fi device you are connected to.

The catch is that your phone, camera, speaker, or other gadget gets a vote in that decision. A mesh system can encourage devices to roam between access points, but it cannot force every device to choose the node you think it should use. A device may remain connected to a more distant mesh unit even when you are standing right next to another one. And the physically closest access point is not always the one with the strongest or cleanest signal anyway.

That behavior makes sense technically, but it can still be annoying in the real world. I do not want to negotiate wireless roaming rules with a backyard camera. I want to open the Ring app and see whether the dogs are digging another unauthorized hole in the yard.

What finally worked for me was a much simpler arrangement. My primary Wi-Fi network is named Lazy Dog. I installed one extender in a location where it could still receive a decent signal from the main router. Instead of configuring that extender to broadcast the same Wi-Fi name, I gave it its own name: Lazy Dog 2. Yes, a tremendous amount of creativity went into that sequel title.

Then, when setting up the backyard cameras, I explicitly connected them to Lazy Dog 2. They were no longer free to make their own questionable choices about which access point they preferred. The cameras had a known connection near the backyard, while the television continued using the main router in the living room.

This is where the Wi-Fi name, technically called the SSID, matters. An extender can often broadcast the same SSID as your main router, or it can broadcast a separate one. If both use the same name, your phone or camera may see them as one Wi-Fi network and choose between them on its own. That is convenient when it works well. It is less convenient when a stationary camera keeps choosing the wrong one.

Giving the extender a separate name allowed me to make the choice myself. The backyard cameras use Lazy Dog 2 because I told them to use Lazy Dog 2. For devices that never move, such as cameras, smart TVs, printers, or a desktop computer, that kind of control can be more useful than fancy automatic roaming.

There is one important technical detail here. A separate Wi-Fi name does not necessarily mean you have created a completely separate network. Depending on how the extender is configured, devices connected through it can still communicate with devices on the same local network. It also does not magically eliminate interference or improve a poor connection back to the router.

An extender has to communicate in both directions. It needs a good signal to the main router, and your camera needs a good signal to the extender. If you put the extender in the farthest corner of the yard where it can barely hear the main router, you have simply moved the weak link. A strong signal between the camera and extender is only half of the trip.

That is one of the most common mistakes people make with extenders. They put the extender exactly where the Wi-Fi signal is already terrible. Instead, place it somewhere between the main router and the area that needs coverage. The extender needs enough signal from the router to do its job before it can pass that connection along to the camera, phone, or whatever else needs help.

Also remember that more signal bars do not always tell the complete story. A device may have a strong Wi-Fi signal to an extender, but the extender might have a weak, congested, or unreliable connection back to the router. Wi-Fi is a chain, and the weakest part of the chain can affect everything behind it.

If you are troubleshooting a device that keeps disconnecting, start by finding out what it is actually connected to. Do not immediately buy another extender, another mesh node, or another expensive router. Check the device settings if they are available. Check your router or mesh app to see which access point the device is using. Then change one thing at a time and see what happens.

Sometimes you need a mesh system. Sometimes you need an extender. Sometimes the real answer is a wired access point, Ethernet cable, powerline adapter, or moving the main router. But sometimes the best upgrade is removing extra stuff and using a simpler arrangement that gives you control over the troublesome device.

For me, one clearly named extender network solved the backyard camera problem better than the more complicated setups I tried. The cameras stay connected, the TV has its fast connection near the main router, and I have fewer little networking boxes to think about. That was the goal all along.

If your Wi-Fi setup is already working, resist the temptation to build a trilogy just because you own extra equipment. And if it is not working, simplify first, verify what each device is connecting to, and make changes methodically. You may discover that the answer is not more Wi-Fi. It may just be better organized Wi-Fi.

You can watch the embedded video for the full story and a closer look at why this arrangement worked better for me.

Live long and prosper,
RR

What Happens When You Hide a Bound Customer ID Field in Microsoft Access? Video Quiz X3.2

Time for another Microsoft Access video quiz. This one is aimed at expert-level Access users and covers a handful of form, query, and date-calculation situations that can easily trip people up. Give each question a shot before revealing the answer. No peeking. Your future self will be disappointed.

These questions focus on a callback system, where contacts can be marked for follow-up, filtered into callback lists, and opened with forms and buttons. They also cover an important little detail about hiding bound controls on a form. Let's see how you do.

Question 1: A callback list shows only records where Must Callback is set to True. The call has been completed, but the notes from that call need to remain in the contact table. What should you do before reopening the callback list?

Should you delete the contact record, clear the Must Callback checkbox, clear the callback date or set it to yesterday?

Answer: Clear the Must Callback checkbox.

The callback list is filtered based on that Yes/No field. Once the follow-up is complete, clearing the checkbox removes the contact from the active callback list without deleting the contact or losing the notes. Deleting records just because someone returned a phone call is a little like throwing away your address book after sending a birthday card.

Question 2: A button reads a bound Customer ID text box on a form. What happens if you set that text box's Visible property to No?

Is the stored Customer ID erased? Does the button have to use the customer's name instead? Does the text box become unbound? Or can the button still read the Customer ID?

Answer: The button can still read the Customer ID.

Making a bound text box invisible only hides it from the user interface. It does not erase the value, remove the field from the form's record source, or magically unbind the control. VBA and macros can still refer to the control and retrieve its value normally. This is a common and useful technique when you need an ID value available behind the scenes but do not want users typing into it or even seeing it.

Of course, hidden is not the same as secure. If you need to protect sensitive data, do not assume an invisible text box is Fort Knox. It is simply hidden on that form.

Question 3: You change a default value expression from =Date()+1+(14/24) to =Date()+1+14. What does the revised expression return?

Your choices are tomorrow at 2 PM, midnight 14 days from today, midnight 15 days from today, or today at 2 PM.

Answer: Midnight 15 days from today.

In Access date math, whole numbers represent whole days. The original expression starts with today's date at midnight, adds one day, then adds 14/24 of a day, which is 14 hours. That gives you tomorrow at 2 PM.

But when you replace 14/24 with just 14, Access treats that as 14 additional days. Add the original one day, and you are now 15 days ahead, at midnight. Decimal portions represent time; whole numbers represent days. Tiny difference in typing, very different callback date.

Question 4: A callback form uses a query that selects only records where Must Callback equals True. The button that opens the form says, "Open the form and show all records." Which records actually appear?

Will you see only the records returned by that query, every record in ContactT, only records selected on the main menu, or no records until the button adds another filter?

Answer: Only the records returned by the query.

The form's record source controls the available records. If the form is based on a query that already limits records to Must Callback = True, then "show all records" means all records from that query, not every record in the underlying contact table.

This is an important distinction when working with forms. A button can remove a filter that was applied to a form, but it cannot override the criteria built directly into the form's record source. If you need access to every contact, you need a form or query designed to return every contact.

Question 5: A query displays ContactT.* plus a separate CallbackDateTime column that is sorted ascending. The callback date appears twice in the results. How can you keep every field from ContactT, keep the sort, and display only one callback date column?

Your choices are clearing Show for ContactT.*, removing the separate CallbackDateTime column, sorting ContactT.* ascending, or clearing Show only for the separate date column.

Answer: Clear Show only for the separate CallbackDateTime column.

When you use ContactT.*, Access displays every field in that table, including CallbackDateTime. If you also add CallbackDateTime as its own column so you can sort by it, you will see it twice unless you hide one of them.

The trick is to leave the separate CallbackDateTime field in the query grid, set its Sort row to Ascending, and clear its Show checkbox. Access can still sort on a field that is not displayed. That lets you keep all fields from ContactT, retain the correct sort order, and avoid duplicate columns in the result.

How did you do? If you got all five, congratulations: your callback continuum is intact, your hidden IDs are still working, and your dates have not accidentally traveled two weeks into the future. Watch the embedded video for the complete quiz, and if any of these questions gave you trouble, the related Access Expert Level 3 lesson on building a callback form goes into the details.

Live long and prosper,
RR

Monday, October 12, 2026

Do You Still Need to Learn Microsoft Access If AI Can Build It for You?

AI can write Access queries, suggest table designs, generate VBA, and even help troubleshoot errors. That is fantastic. I use AI all the time myself. But if AI can build so much of your database for you, do you still need to learn Access? Yes. Absolutely. You do not need to memorize every function or type every line of code by hand, but you do need to understand enough to know whether the database is doing what it is supposed to do.

The real value of learning Access is not becoming a human syntax dictionary. It is understanding your data, your business rules, and how the pieces of a database fit together. AI can be a very productive assistant, but it should be treated like a junior developer who works quickly and confidently, occasionally gives you a brilliant answer, and occasionally creates a mess that looks perfectly reasonable at first glance.

One of the biggest dangers with AI-generated database work is that it can produce an answer that runs without errors but is still wrong. That is much more dangerous than a big obvious error message.

For example, AI might generate a query that returns a list of customers, but quietly leaves out customers who meet a certain unusual condition. The query runs. It returns records. Nobody sees a crash. But your employees are now working from an incomplete list.

Or perhaps it writes VBA code that works when you test it one way, but fails when a user opens a form from a different path. Maybe the code belongs in a different event. Maybe it runs before a value has been saved. Maybe it works fine with one record but breaks when there are no records. If you understand the basics, you can look at the result and say, "Wait a minute. Why is this doing that?"

If you do not understand the basics, you may not even realize there is a question to ask.

That does not mean you need flashcards for every VBA command or every argument of every Access function. Nobody has all of that memorized. I look things up too. AI is great for helping you find syntax, explain an unfamiliar function, or draft a starting point for a procedure.

What matters is understanding the structure of the database. You should know why customers belong in one table and orders belong in another. You should understand what a CustomerID is, why relationships matter, and why storing the same customer address on every order record can create problems.

Of course, there are times when repeating information is correct. If you need to know where an order was shipped, you probably should store the shipping address with that order, even if the customer later changes their address. That is why database design is not just a matter of following a rule like "never repeat data." You need to understand why data is stored a particular way.

AI cannot read your mind, either. Ask it to build an inventory database and it has to make assumptions. Are you tracking a few boxes of office supplies in a closet, or managing inventory across three warehouses? What happens when an item is returned? Does it immediately go back into available stock, or does somebody need to inspect it first? What about products promised to customers but not shipped yet?

Those are business decisions. Access does not decide them for you, and AI definitely should not be guessing at them.

The more clearly you understand your own workflow, the better instructions you can give AI. Instead of saying, "Build me an inventory database," you can explain that inventory is received into stock, reserved for open customer orders, removed when shipped, and held separately when returned pending inspection. Now AI has a much better chance of helping you build something useful.

But even with a good prompt, you still have to test the result. Start with simple situations where you already know the answer. If you have 10 widgets and sell 3, the database should show 7 remaining. Then try a return. Try a missing quantity. Try a canceled order. Try two employees attempting to sell the last widget at nearly the same time.

A result is not correct just because it looks plausible. This applies to Access, Excel, SQL Server, Python, and pretty much every other tool. A formula can return a number. A query can return records. A report can print. That does not prove the answer is the answer you actually needed.

You also need to think beyond the first day the database works. What happens next month when someone asks for a new report? What happens when you add a second warehouse, change suppliers, or receive a spreadsheet with columns in a different order? Somebody has to make those changes without breaking what already works.

This is where understanding your own database becomes important. You should know where the data is stored, which forms and queries are important, how to back up the database, and how to restore it when something goes wrong. AI can help document all of that, and it is actually pretty good at documentation when you give it the right information. But saving the original prompt is not the same thing as having a maintenance plan.

Debugging is another place where AI can be useful, as long as you stay in charge. It can spot a backwards comparison operator, a missing reference, a typo, or a likely syntax problem when you have been staring at the code too long. Sometimes it is 3:00 in the morning, you are tired, and the obvious mistake is hiding in plain sight. Let the robot help.

Just do not blindly paste in every fix it suggests. Read the error. Find out what is failing. Ask AI to explain its proposed change before applying it. If it tells you to remove a condition from a query, ask yourself why that condition was there. It may have been the thing preventing canceled orders from appearing in your sales totals. Fixing one error by deleting important logic is not really a fix.

The best way to use AI is to let it handle the routine work while you keep control of the thinking. If you understand how a recordset loop works, for example, you can ask AI to draft a loop that performs a particular task. Then you can read it, adjust it for your situation, and test it. That can save a lot of time without giving up your ability to maintain the database later.

Think of AI like a calculator. You do not need to perform long division by hand every day, but you should still understand whether division is the operation you need in the first place. The calculator does not know what problem you are trying to solve. Neither does AI.

The skills you learn in Access also carry over to other tools. Understanding related tables helps when you move data to SQL Server. Understanding loops and program logic helps when you encounter another programming language. The syntax may change, but the underlying problem-solving skills do not disappear.

So yes, learn Access. Learn enough to understand tables, relationships, queries, forms, reports, validation, business rules, and the general logic behind VBA. Then use AI to speed up the repetitive parts. That is where it shines.

Let AI be your assistant, not your guru. The better you understand Access and your own business, the more useful AI becomes. Watch the embedded video for additional discussion and examples of how to put that approach into practice.

Live long and prosper,
RR

Friday, October 9, 2026

Prevent Duplicate Combinations of Fields in Microsoft Access

An AutoNumber primary key guarantees that every record has its own unique ID. It does not guarantee that the information in that record makes sense. You can still accidentally register the same employee for the same training session twice, add the same product to an order twice, or assign the same warehouse item to the same location more than once. The trick is to define which combination of fields must be unique.

In Access, the usual solution is a unique multi-field index, sometimes called a composite unique index. It lets each individual value repeat where it should, while preventing the specific combination of values that represents a duplicate. No VBA is required, and you do not have to get rid of your AutoNumber primary key.

Consider a registration table. You might have a RegistrationID AutoNumber field as the primary key, plus EmployeeID and SessionID fields. One employee can attend many sessions, so EmployeeID must be allowed to repeat. One session can have many employees, so SessionID must also be allowed to repeat.

What you do not want is the same EmployeeID and SessionID appearing together twice. If employee 7 is registered for session 101, that exact pair should only exist once. Employee 7 can still register for session 102, and employee 8 can still register for session 101. Those are valid combinations.

A common beginner mistake is setting EmployeeID to Indexed: Yes (No Duplicates). That certainly prevents duplicates, but it prevents far too much. Now each employee can only appear once in the entire table. Congratulations, your employees are allowed one training class for the rest of their careers. Probably not the business rule you had in mind.

The same problem occurs if you make SessionID unique by itself. You would only be able to register one employee in each session, which makes for a very quiet classroom.

Instead, leave your AutoNumber field as the primary key and create a separate index that includes both fields. Open the table in Design View, then click the Indexes button on the ribbon. Access will show the existing primary-key index and any other indexes already defined for the table.

On a new row, enter a meaningful index name, such as EmployeeSession. In the Field Name column on that same row, select EmployeeID. On the row directly underneath it, leave the Index Name column blank and select SessionID in the Field Name column. That blank index-name cell is important. It tells Access that SessionID belongs to the same index as EmployeeID, rather than starting a brand-new index.

With the first row of that index selected, set the Unique property to Yes. Save the table. From that point forward, Access will reject a record that repeats the same EmployeeID and SessionID pair.

When a user tries to enter the duplicate, Access will display its standard message indicating that the change would create duplicate values in an index, primary key, or relationship. It is not the friendliest message in the universe, but it does enforce the rule at the table level. That means the protection applies whether records are entered through a form, datasheet, query, import, or some other part of the database.

This is sometimes described as a composite key because the rule is made from multiple fields. A composite primary key is also possible, where the combined fields become the table's actual primary key. That can be a perfectly valid design in some databases. In many Access applications, however, keeping a simple AutoNumber primary key and adding a separate unique composite index is easier to work with, especially when other tables need to refer to one specific record.

The important part is deciding exactly what constitutes a duplicate in your application. Sometimes two fields are enough. Sometimes they are not. Suppose an employee can be assigned to the Navigation duty on Mission 501 and also to Navigation on Mission 502. A unique index on EmployeeID and DutyID would incorrectly block the second assignment. In that case, the real rule is the combination of EmployeeID, DutyID, and MissionID.

The same technique works with three or more fields. Give the index a name on the first row, add the first field, then place each additional participating field on the rows below it with the index name left blank. Set Unique to Yes, and Access will make sure that the complete combination is not repeated.

Before adding a unique index to an existing table, make a backup and work on a test copy if possible. If duplicate combinations already exist, Access will not be able to create the unique index until you clean them up. You may need to run a Find Duplicates query first, review the old records, and decide which ones should remain.

Also remember that uniqueness and required data are two different rules. If every registration must include both an employee and a session, set the participating foreign-key fields to Required: Yes as appropriate. Do not assume that making an index unique automatically means users must fill in every field.

Once the index is in place, test both sides of the rule. Try entering the same employee and same session twice. That should fail. Then try the same employee in a different session, and a different employee in the original session. Those should work normally. The goal is not to block everything. The goal is to block the mistake while allowing legitimate work to continue.

The embedded video walks through the Indexes window in Access and shows the setup in action. Once you understand unique multi-field indexes, they become one of those simple little database tools that can save you from a lot of cleanup later.

Live long and prosper,
RR

Thursday, October 8, 2026

Build Shared VBA Libraries, Reusable Forms & Reports for Multiple Access Databases

If you maintain more than one Access database, you have probably copied the same VBA function, utility form, or report from one file to another. It works... until you improve something and suddenly have six old versions floating around. That is how duplicated code turns into a maintenance nightmare, usually right when you have better things to do.

Access Developer 63 is all about avoiding that mess by building a shared library database. Instead of treating every Access application as its own little island, you can create one database that holds common code, forms, and reports, then make multiple applications use those shared objects.

The starting point is shared VBA. A library database can contain common routines that you use across several applications: formatting functions, validation tools, logging routines, user-interface helpers, and all those little procedures you seem to rebuild over and over again because "this will only take five minutes." Sure it will.

Once the library is connected properly, your other Access databases can call the shared routines rather than maintaining their own copies. When you fix a bug or add an improvement, you update the code in the library. The databases that rely on it can benefit from that update without you having to manually paste revised code into every project.

Of course, shared libraries come with a few things to understand before you turn your entire application collection into one big web of references. The class covers how Access references library databases, what can cause a reference to become broken, and why file locations matter. A perfectly good library is not much help if Access cannot find it anymore because somebody moved it into a mysterious folder named "Old Stuff Do Not Delete."

We also look at what happens when the shared library is already open or being used by another database. That matters in real-world multi-user and multi-application environments, especially when you need to deploy updates. Shared code is wonderful, but it needs to be managed deliberately.

The really interesting part is that a library database does not have to contain only VBA modules. You can place forms and reports in the library too. That means a customer lookup form, a settings window, a notification form, or another common interface can live in one place and be opened from different Access applications.

Think about the maintenance benefit. Instead of having a dozen nearly identical customer forms scattered across several databases, you can maintain one shared form. Change its layout, improve its validation, or fix an annoying little issue once, and the applications using that form can all take advantage of the update.

Sharing forms raises some good questions, naturally. What data does the form use? Can it work with tables stored in a different database? How do you open it to a specific record? Can the calling application work with controls on the shared form? Developer 63 walks through those practical details and the little Access quirks that tend to appear once you begin crossing project boundaries.

The same idea applies to reports. If multiple databases need the same invoice layout, customer summary, notification report, or other common output, a shared report can eliminate duplicate design work. The class demonstrates how reports can be stored in the library and used by other databases, including how information can be passed between the application and the shared object.

This is not necessarily something every beginner database needs on day one. But if you build Access applications for clients, maintain several internal systems, or have a collection of databases that all use the same business rules and interface components, shared libraries can save a tremendous amount of time. More importantly, they help keep your applications consistent.

By the end of Access Developer 63, you will understand how to organize reusable VBA code, forms, and reports into a shared Access library and connect multiple databases to it safely. You will also have a better handle on the reference and deployment issues that can otherwise make shared-library projects frustrating.

Watch the embedded video for an overview of what is covered, and visit the course page for the complete hands-on training and demonstrations.

Live long and prosper,
RR

How to Return Multiple Values from a Function in Microsoft Access VBA

Sometimes one little customer lookup turns into a whole pile of values you need in your code: address, city, state, ZIP code, country, phone number, whatever. You can certainly run a separate DLookup for every field, and for a quick one-time job that is perfectly fine. But once you need the same lookup in several forms or procedures, copying that logic everywhere gets messy fast.

A handy VBA pattern is to let a Function return one clear success or failure value, while using ByRef parameters to send several related values back to the procedure that called it. Think of the Function as requesting a customer information packet. The Boolean result tells you whether the packet arrived, and the ByRef variables contain the address pieces inside it.

A VBA Function technically has one normal return value. In this situation, that return value is best used as a Boolean. Your Function can return True when it successfully finds the customer and fills in the requested information, or False if the customer cannot be found.

The additional values are passed into the Function using parameters declared ByRef. ByRef means "by reference." Instead of giving the Function a copy of a variable, you give it access to the actual variable from the calling procedure. If the Function changes that variable, the calling code sees the changed value as soon as the Function is finished.

So conceptually, you might have a Function named GetCustomerInfo. It receives a CustomerID and several String variables for Address, City, State, ZIP, and Country. The Function looks up the customer record, fills those variables, and returns True if it found a matching record.

That means the calling code can do something like this: declare a few local String variables, call the Function, test the Boolean result, and then place the returned values into the controls on the form. You get one clean call instead of five separate DLookups scattered around the database like sticky notes on the coffee maker.

The lookup routine itself should start by clearing the output variables and setting its own return value to False. This is important. If the lookup fails, you do not want old values hanging around in those variables and making it look like the lookup worked when it did not. Nothing like showing the last customer's address on a new order to make everybody have a bad day.

Inside the Function, a DAO recordset is a good choice when you need several fields from the same record. Open a recordset for the selected CustomerID, check whether it contains a record, and then copy the address fields into the ByRef output variables. Use Nz when appropriate so Null values from the table do not cause problems when assigning text values.

If a record is found, set the Function result to True. If no record is found, leave the output strings blank and return False. The calling procedure can then decide what to do. On an Order form, you might populate the shipping address fields when the lookup succeeds, or display a "Customer not found" message if it fails.

One little detail worth mentioning: do not name your local variables exactly the same as the controls or fields on your form if it makes the code confusing. Instead of using names like Address and City for everything, use something like AddressString, CityString, StateString, and ZipString for the local variables. Then it is obvious when you are working with a variable versus a form control.

This approach is especially useful when the same customer information is needed in more than one place. Maybe you need it on an Order form, a Quote form, a shipping label routine, and a button that creates a packing slip. Put the lookup logic in one public Function in a standard module, and every part of the database can use the same routine.

If the Customer table changes later, you update one Function instead of trying to remember where you copied and pasted those five DLookups three years ago. Future-you will appreciate it. Present-you might not remember writing it, but future-you will still appreciate it.

Are multiple DLookups wrong? Nope. Not at all. If you have a simple one-off task and only need a field or two, DLookup is often quick and easy. The ByRef pattern is not about declaring war on DLookup. It is about keeping related work together when the same lookup is used repeatedly.

You could also use global variables or TempVars to share information across your Access application. Those have their place, especially when values truly need to be available across forms, reports, macros, and procedures. But they are shared state, which means another procedure can change them, overwrite them, or leave old values behind.

ByRef output parameters are more self-contained. The inputs, outputs, and success test are all visible right in the Function call. That makes the code easier to read, easier to debug, and less likely to turn into a mystery later on.

The basic pattern is simple: use the Function's direct return value for success or failure, use ByRef parameters for the related data, initialize everything safely, and keep the lookup logic in one reusable place. It is a useful little VBA Lego to keep in your toolbox.

The embedded video includes the full Access walkthrough, including building the recordset lookup, creating the public Function, and calling it from an Order form.

Live long and prosper,
RR

Wednesday, October 7, 2026

Does Microsoft Access Save Form Edits When You Move to Another Record? Video Quiz B1.10

Ready for a quick Microsoft Access forms quiz? These five questions cover some of the little details that trip up beginners all the time: labels versus field names, hiding sensitive information, form views, saving edits, and continuous forms. Keep score if you want. No cape required.

Try to answer each question before reading the answer. If you miss one, no worries. That is why we practice this stuff before Lex Luthor gets access to the customer table.

Question 1: You change the label beside a text box from "FirstName" to "First Name." What changes?

A. The underlying table field is renamed
B. Only the label displayed to the user changes
C. Access creates a second First Name field
D. The text box becomes unbound

Answer: B. Only the label displayed to the user changes.

The label is just the caption the user sees on the form. Changing it can make your form more readable without changing the actual field name stored in the table. Your field can remain FirstName, while the form politely displays First Name. That is usually a good thing. Friendly captions on forms, sensible field names in tables. Everybody wins.

Question 2: Staff members need to enter customer information, but they should not see customers' credit limits. What is the best form design choice?

A. Delete the CreditLimit field from the table
B. Change CreditLimit to an AutoNumber field
C. Leave CreditLimit off the staff form
D. Put CreditLimit in the form header

Answer: C. Leave CreditLimit off the staff form.

Do not delete useful data from your table just because one group of users should not see it. Keep the CreditLimit field in the table, but simply do not put a control for it on the staff form. You can build a separate management form for users who are allowed to view or edit that information.

One important real-world note: leaving a field off a form is good interface design, but it is not ironclad security by itself. If users can open tables, queries, or other forms that expose the field, they may still be able to see it. Still, for normal day-to-day form design, keeping irrelevant or sensitive fields off the form is exactly the right move.

Question 3: After saving and reopening a bound form, which view is normally used to enter and edit its records?

A. Form View
B. Layout View
C. Design View
D. Print Preview

Answer: A. Form View.

Form View is where normal users work with the data. It is where they enter customers, update addresses, select values from combo boxes, and generally do their daily database stuff.

Layout View and Design View are for changing the form itself. That is where you move controls around, resize text boxes, change colors, add buttons, and make the form look less like something built during the Clinton administration. Print Preview is for viewing printed output, not editing records.

Question 4: A user edits a record on a bound form, and the pencil icon appears. What normally happens when the user moves to another record?

A. The edit is discarded automatically
B. Access saves the edit only when Ctrl+S is pressed
C. The form becomes read-only until reopened
D. Access saves the changed record to its underlying table

Answer: D. Access saves the changed record to its underlying table.

This is one of the most important beginner concepts in Access. The pencil icon indicates that the current record is dirty, meaning it has been changed but has not yet been committed to the underlying table.

When you move to another record, Access normally saves the current record automatically. Closing the form will normally save it too. You do not have to press Ctrl+S to save the data record. Ctrl+S is primarily for saving changes to the form design, not for saving edits someone made to a customer's phone number.

If the data fails validation, violates a required-field rule, or otherwise cannot be saved, Access will stop you and display an error. But under normal circumstances, moving off the record commits the changes.

Question 5: You want to display many records at once, with the same custom set of controls repeated for every record. Which type of form is designed for that?

A. A single-record form
B. A continuous form
C. A split form
D. A modal dialog form

Answer: B. A continuous form.

A continuous form repeats its Detail section for each record. Think of it as a list of records where each row uses the controls and formatting you designed on the form. It is great when you want to see lots of customers, contacts, orders, or other records at the same time without being stuck with the plain datasheet look.

Access also has a Multiple Items form option in the Form Wizard, which generally creates this kind of continuous-form layout. A single form shows one record at a time, while a continuous form gives you that repeated record display.

So, how did you do? If you got all five, congratulations, Metropolis is safe and your records are probably in decent shape. If you missed a few, these are all core concepts covered in Access Beginner Level 1, Lesson 10, where we build a customer form and dig into how bound forms actually behave.

Watch the embedded video for the quiz and explanations, and remember: when you move off a dirty record on a bound form, Access normally saves that edit to the underlying table. No Ctrl+S panic required.

Live long and prosper,
RR