Apoyando las indicaciones y consejos de Movilla y Juan Carlos, te diré que ncluso no sería necesario ni el control invisible ni variables para almacenar el contenido original, pero si una mínima comparación para analizar si algo ha cambiado o no.
Los controles TextBox tienen un evento CHANGE que se dispara cuando el usuario hace la más mínima modificación y una propiedad TAG que casi nunca se utiliza y en la que se puede almacenar información. En este evento puedes poner el código necesario para controlar los campos que han sufrido alguna modificación. Lo mejor es que implementes un array de textbox para facilitar las tareas de verificación.
Fíjate en estas dos variantes de lo que estoy exponiendo:
VARIANTE A
Option Explicit
Código:
Private Sub Form_Load()
On Local Error Resume Next
cargadatos
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Local Error Resume Next
actualizadatos
End Sub
Private Sub Text1_Change(Index As Integer)
On Local Error Resume Next
Me.Text1(Index).Tag = "1"
Me.Text1(Index).FontBold = True
End Sub
Private Sub Text1_GotFocus(Index As Integer)
On Local Error Resume Next
Me.Text1(Index).SelStart = 0
Me.Text1(Index).SelLength = Len(Me.Text1(Index).Text)
End Sub
Private Sub Text1_LostFocus(Index As Integer)
On Local Error Resume Next
Me.Text1(Index).SelStart = 0
Me.Text1(Index).SelLength = 0
End Sub
Private Sub cmdActualiza_Click()
On Local Error Resume Next
'Pulsado botón de actualizar
actualizadatos
cargadatos
End Sub
Private Sub cargadatos()
On Local Error Resume Next
Dim i As Integer
For i = 0 To 3
Me.Text1(i).Text = "Texto_" + CStr(i)
Me.Text1(i).Tag = "0"
Me.Text1(i).FontBold = False
Me.Text1(i).TabIndex = i
Me.Text1(i).TabStop = True
Next i
Me.Text1(0).SetFocus
Me.Refresh
End Sub
Private Sub actualizadatos()
On Local Error Resume Next
Dim i As Integer
For i = 0 To 3
If Me.Text1(i).Tag = "1" Then
'Aquí el código que trata los modificados
MsgBox "El campo " + CStr(i) + ", ha sido modificado."
End If
Next i
End Sub VARIANTE B (SOLO PROCEDIMIENTOS DIFERENTES AL ANTERIOR) Código:
Private Sub Text1_Change(Index As Integer)
On Local Error Resume Next
Me.Text1(Index).FontBold = True
End Sub
Private Sub Text1_LostFocus(Index As Integer)
On Local Error Resume Next
'No se permite campo vacio. Restauramos el original
If Me.Text1(Index).Text = "" Then
Me.Text1(Index).Text = Me.Text1(Index).Tag
Me.Text1(Index).FontBold = False
ElseIf Me.Text1(Index).Text = Me.Text1(Index).Tag Then
Me.Text1(Index).FontBold = False
End If
Me.Text1(Index).SelStart = 0
Me.Text1(Index).SelLength = 0
End Sub
Private Sub cargadatos()
On Local Error Resume Next
Dim i As Integer
For i = 0 To 3
Me.Text1(i).Text = "Texto_" + CStr(i)
Me.Text1(i).Tag = Me.Text1(i).Text
Me.Text1(i).FontBold = False
Me.Text1(i).TabIndex = i
Me.Text1(i).TabStop = True
Next i
Me.Text1(0).SetFocus
Me.Refresh
End Sub
Private Sub actualizadatos()
On Local Error Resume Next
Dim i As Integer
For i = 0 To 3
If Me.Text1(i).Tag <> Me.Text1(i).Text Then
'Aquí el código que trata los modificados
MsgBox "El campo " + CStr(i) + ", ha sido modificado."
End If
Next i
End Sub
Observa que la variante A controla los campos que han sufrido alguna modificación verificando si la propiedad TAGA tiene un '0' (No varía) o un '1', ha sido modificado. Esto sucede siempre que el usuario pulse cualquier tecla o símbolo representativo; La desventaja es que quedará como modificado aunque el usuario restaure el valor origen (Por ejemplo borra una 'A' y acto seguido la vuelve a poner en la isma posición.
La segunda, quizás, es más elegante y sólo tratará como modificados aquellos controles en los que el texto sea diferente al original. Observa la ventaja de que también es capaz de restaurar el contenido original ante un error de pulsación del usuario.
Lógicamente, esta estructura de código se puede ampliar y mejorar para cubrir todas las necesidades de cada aplicación.
Espero que te resulte útil