Here is how you approach this more or less reasonably.
BEFORE YOU START:
Look up a few things in the Access Help files and do some object browsing among the DAO and ADO libraries to look at data types. There is a set of constants you can use that describe every access data type.
Look up "Collections" as a thing to be "enumerated" or "iterated." There are some examples in the help files.
Look up VBA SELECT/CASE syntax.
Look up and review recordset operations including opening, closing, editing, and updating. Also navigation including ways to find a specific record in a recordset based on a search or maybe a key.
DESIGN SOMETHING LIKE THIS (in a VBA module that you can trigger some way):
You've got three recordsets. One is the change log. One is the master file. One is the incremental file. Get these set up before the loop I describe below.
It is imperative that either by a unique index or compound key, you have a way that you can match up the incremental record to one and only one master record. It is less important for the incremental records to be unique.
Write a loop that enumerates the records in a recordset. For the purposes of your comparison, drive the process from the INCREMENTAL update file. (It is smaller than the master file, probably, so takes less time to iterate.)
For each incremental record, search the second recordset to find the matching record in your master table. (If there is no match, you have just found a new record to be added. How you want to log that is your call.)
OK, now iterate over the collection of fields in the recordsets. You don't need a special trap for the fields driving the matchup because in order to match the records, those fields had to be equal, so... no change will be detected.
For each field, you can just compare the value in the incremental table to the value in the master table, assuming you imported the incremental table to a structure that matches the master table. You just do something like
they_match = ( recsetA.fields

= recsetB.fields

)
If the fields match, that's nice. No work to be done.
For differences, you need to see the field.type code and do a select on that code to see how to log things. You already know the field name (as recsetA.Fields

.name, perhaps), the old value (in the master table's field), and the new value (in the incremental table's field). So all you have to do is log the date/time, field name, and the old value in the master table. A wrinkle here is that you have to do a CStr([field]) in order to log all types, and might wish to include the field type code as part of the log so that someone reading it later can know that the string they see came from a short integer or a DOUBLE or whatever. Then just update the master record from the incremental record. They are, after all, the same data type if you did it right.
To make it easier, just remember that there was at least one change to the record and wait to update it until the field collection enumeration is complete for the current incremental record.
Outside of the field loop, you step through the incremental recordset until you reach .EOF condition and then stop that loop.
Don't forget the parity rule: Close what you open. Close the recordsets, close the database variables, close anything that you opened.