Vamos una por una
Target.addres(False, False) = "A1"
target.address te regres "$A$1", pero si le pones (false, false) te regresa "A1"
(False, true) te regresa "A$1"
(True, false) te regresa "$A1"
If Target.Row > 100 Then Exit Sub
If Target.count > 1 Then Exit Sub
Si es mayor a 1, significa que modificaste más de una celda, por lo tanto, salir.
Pero si requieres revisar varias celdas, entonces pones >100, eso significa que puedes modificar hasta 100 celdas. Si modificas más de 100 celdas, entonces termina.
¿Por qué le pongo 100?, solamente por poner un número mayor a 1, pero tampoco le voy a poner 1,000, ya que si pones un número muy grande, excel entra en un loop. Sobre todo cuando insertas una fila o una columna, en esos casos estás modificando cientos de celdas.
If Not b Is Nothing Then
celda = b.Address
'
'
End If
If Not b Is Nothing Then
celda = b.row
'
'
End If
.Address tiene la dirección de la primer celda encontrada, .Row tiene la primer fila encontrada.
Utilizas .Address, porque puedes encontrar el dato en A2, en C2, en F2, es decir, puede estar el dato en diferente celda pero en la misma fila.
Utilizas .Row cuando solamente quieres encontrar un dato en la fila.
Cuando estás en el evento Change de la hoja y modificas la hoja, entonces excel entra en un loop, porque al modificar una celda dentro de la macro, vuelve activarse el evento change, entonces para eso utilizas
Application.EnableEvents = False
De esa forma apagas los eventos, modificas la celda y no vuelve a activarse el evento change. Al final de la macro vuelves a activar los eventos para que se activen cuando se modifique la hoja.
Uff, r ecuerda que es una petición por pregunta.