How to Update an Existing Excel Record with VBA Without Duplicating
Question details
The user needs a VBA procedure to search a dataset for an existing identifier (like an employee ID) and overwrite the existing record instead of appending a duplicate row.

- Product
- Excel
- Device & OS
- not provided
- Scenario
- Creating a VBA data-entry process that validates whether a specific record already exists in the database sheet before saving the user inputs.
- Observed behavior
- The intended outcome is to use Range.Find to locate the ID. If the ID exists, the code will overwrite that specific row; otherwise, it will append a new record at the bottom of the dataset.
Before running the macro, ensure you save your Excel workbook as a Macro-Enabled Workbook (.xlsm) and back up your data to prevent accidental overwriting.
Use Range.Find to Locate and Overwrite the Record
Utilize the Range.Find method in VBA to search for the unique ID. It will overwrite the existing row if found, or append a new row if the search returns Nothing.
The most efficient way to prevent duplicate entries when saving data from a form to a database sheet is using the Range.Find method. It searches a specified column for the unique identifier, such as an employee ID.
If the identifier is found, the macro captures the row number and overwrites the data with the new inputs. If it is not found, the macro identifies the next empty row at the bottom of your dataset and safely appends the new information without disrupting existing entries.
Press 'Alt + F11' on your keyboard to open the Visual Basic for Applications (VBA) editor in Excel.
Click 'Insert' in the top menu and select 'Module' to create a blank script window where you will write the update macro.
Write a search logic using a variable, such as: Set FoundCell = Sheets("Data").Range("B:B").Find(What:=EmployeeID, LookAt:=xlWhole). Replace 'Data' and 'B:B' with your actual sheet name and ID column.
Add an 'If Not FoundCell Is Nothing Then' statement to overwrite the row using 'FoundCell.Row'. Add an 'Else' statement to find the last row using 'Cells(Rows.Count, 2).End(xlUp).Row + 1' for entirely new entries.
Assign the values from your input sheet to the destination row inside the If/Else block, such as copying cells B4:B7 horizontally to the target sheet.

Manage VBA and Macros Easily with WPS Office
WPS Office fully supports VBA macros, allowing you to run complex data-entry procedures, utilize Range.Find, and automate your spreadsheets efficiently.
- 1. Download and Install WPS Office: Get WPS Office from the official website and complete the installation on your device.
- 2. Open Your Macro-Enabled File: Launch WPS Spreadsheet and open your .xlsm file containing the data entry records and VBA code.
- 3. Enable Macros: Click on the Developer tab and ensure macros are enabled to allow your VBA scripts to execute properly.
- 4. Run the Update Procedure: Execute your form or macro button to seamlessly update existing rows or append new records using the built-in VBA engine.

Frequently Asked Questions
Why does Range.Find sometimes return a partial match instead of an exact duplicate?
By default, Range.Find remembers the last search settings used in Excel. If 'LookAt:=xlPart' was used previously either in VBA or via the standard Find dialog, it might find partial matches. Always explicitly specify 'LookAt:=xlWhole' in your VBA code to ensure it only overwrites the exact matching ID.
How do I find the next empty row for new records in VBA?
You can find the first empty row in a column (e.g., Column B) using the code: NextRow = Cells(Rows.Count, "B").End(xlUp).Row + 1. This command looks from the very bottom of the sheet upwards to find the last used cell and adds one to designate the new blank row.
Can I use VBA to update multiple matching records at once?
Yes, if multiple duplicate IDs exist and you want to update all of them, you can loop through the results using the 'Range.FindNext' method. You would continue finding and updating each row inside a Do...Loop until the search address loops back to the first found cell.
Why am I getting a 'Run-time error 91: Object variable not set' when using Range.Find?
This error occurs when you try to directly manipulate the result of Range.Find (like asking for its .Row property) without checking if a match was actually found. Always assign the search to a variable and check 'If Not FoundCell Is Nothing Then' before attempting to update the row.




