Esta es la macro que dejaste al inicio a la que le agregué el mensaje.
Pero tené presente que la estás ejecutando al seleccionar CUALQUIER celda de la hoja... y vuelve a verificar TODA LA COL B... no se si esto es lo que estarás necesitando.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'ajustada
'SE EJECUTA AL SELECCIONAR CUALQUIER CELDA DE LA HOJA INGRESOS
'recorriendo toda la col B y verificando exista o no el código
Dim cont, ultlinea As Long
Dim und, descripcion, codigo, rango As Variant
ultlinea = Sheets("INGRESOS").Range("B" & Rows.Count).End(xlUp).Row
Set rango = Sheets("DATOS").Range("A:D")
For cont = 6 To ultlinea
codigo = Sheets("INGRESOS").Cells(cont, 2)
und = Application.VLookup(codigo, rango, 3, False)
descripcion = Application.VLookup(codigo, rango, 2, False)
If IsError(und) Then
Sheets("INGRESOS").Cells(cont, 4) = ""
Else
Sheets("INGRESOS").Cells(cont, 4) = und
End If
If IsError(descripcion) Then
Sheets("INGRESOS").Cells(cont, 5) = "NO EXISTE"
Else
Sheets("INGRESOS").Cells(cont, 5) = descripcion
End If
Next cont
End Sub
Como también comentaste: O talvez lo podrian mejorar
Te dejo otra macro que se ejecuta cuando se digite el código(en la columna B de la hoja Ingresos)
Private Sub Worksheet_Change(ByVal Target As Range)
'x Elsamatilde
'solo controla lo ingresado en col B a partir de fila 6 de esta hoja (INGRESOS)
If Target.Column <> 2 Or Target.Row < 6 Then Exit Sub
'si se limpia el rango no se ejecuta
If Target.Count > 1 Then Exit Sub
Set hod = Sheets("DATOS")
'traer campos de hoja DATOS
Set busca = hod.Range("A:A").Find(Trim(Target.Value), LookIn:=xlValues, lookat:=xlWhole)
If busca Is Nothing Then
Range("D" & Target.Row) = ""
Range("E" & Target.Row) = "No se encuentra" 'escribir mensaje a gusto
Else
Range("D" & Target.Row) = hod.Range("C" & busca.Row)
Range("E" & Target.Row) = hod.Range("C" & busca.Row)
End If
End Sub
Está explicada por lo que no tendrás dificultad para ajustar líneas... sino consulta nuevamente.
NOTA: solo deja una de las 2 macros en hoja INGRESOS.
Sdos!