Macro que autocomplete datos de otra hoja del mismo libro en excel

Quisiera saber que macro pueda utilizar para autocompletar en mi hoja 1 datos de mi hoja 2. Es decir, en mi hoja 2 tengo una lista de proveedores muy extensa, supongamos que entre ella esta la empresa motitas, s.a. Y quiero que en la hoja 1 yo escriba en una celda "mot" y automáticamente se autocomplete con los datos de la lista en la hoja 2, de tal manera que aparezca totalmente el nombre del proveedor. Me habían facilitado esta formula:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fila As String
Dim Columna As String
Dim Valor As String
Dim ValorCelda As String
Dim Celda As Variant
Fila = Target.Row 'Tomamos el valor de Fila
Columna = Target.Column 'Tomamos el valor de la Columna
Valor = Target ' Tomamos el Valor de la Celda
If Valor <> "" Then ' Hacemos una Validación si esta Vacía
If Columna = 2 Then ' Preguntamos si esta en la Columna B
If Len(Valor) = 1 Then ' Preguntamos si ingreso solo un Carácter
Valor = UCase(Valor) ' Lo Convertimos en Mayúscula
ElseIf Len(Valor) > 1 Then
Valor = UCase(Mid(Valor, 1, 1)) &
LCase(Mid(Valor, 2, Len(Valor))) 'Convertimos el primer Carácter en
Mayúscula
End If
For Each Celda In Sheets(1).Range("A2", Range("A2").End(xlDown)) ' Ciclo Para Buscar en la Columna A
ValorCelda = Celda.Value
If Valor = Mid(ValorCelda, 1, Len(Valor)) Then
Cells(Fila, 2) = ValorCelda
End If
Next Celda
End If
End If
End Sub

Pero parece que solo es valida en la misma hoja. Espero puedan ayudarme :) Les agradezco mucho su aportación y les deseo un excelente dia.

1 respuesta

Respuesta
2

Efectivamente, la macro no funcionaba bien. No tenía en cuenta que donde debía buscar era en la hoja 2 y tenía algunos otros errores de tipo de variable y de no salida del bucle for.

Aquí te la escribo con las correcciones. Debes introducirla en la macros de la Hoja 1. Tal vez te de algún error como a mí cuando pego cosas de esta página, porque te introduzca cortes de línea que no debe. Dale a compilar la macro y donde salgan juntas la línea con la de arriba y desaparecen.

No se si te la hicieron a medida porque la pediste así, te recuerdo que lo que hace es.

Cuando escribes en la columna B (solo si es la columna B) buscará si la palabra es el comienzo de una de las que haya en la Hoja 2 en la columna A desde A2 hasta el final. Si es así te escribirá la palabra que ha encontrado cuando le des a introducir o cambies de celda.

Si no era eso exactamente lo que querías se puede modificar.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fila As Integer
Dim Columna As Integer
Dim Valor As String
Dim ValorCelda As String
Dim Celda As Variant
Fila = Target.Row 'Tomamos el valor de Fila
Columna = Target.Column 'Tomamos el valor de la Columna
Valor = Target ' Tomamos el Valor de la Celda
If Valor <> "" Then ' Hacemos una Validación si esta Vacía
If Columna = 2 Then ' Preguntamos si esta en la Columna B
If Len(Valor) = 1 Then ' Preguntamos si ingreso solo un Carácter
Valor = UCase(Valor) ' Lo Convertimos en Mayúscula
ElseIf Len(Valor) > 1 Then
Valor = UCase(Mid(Valor, 1, 1)) & LCase(Mid(Valor, 2, Len(Valor))) 'Convertimos el primer Carácter en Mayúscula
End If
'For Each Celda In Sheets(2).Range("A2", "A20") ' Ciclo Para Buscar en la Columna A
For Each Celda In Sheets(2).Range("A2", Sheets(2).Range("A2").End(xlDown)) ' Ciclo Para Buscar en la Columna A
ValorCelda = Celda.Value
If Valor = Mid(ValorCelda, 1, Len(Valor)) Then
Cells(Fila, Columna) = ValorCelda
Exit For
End If
Next Celda
End If
End If
End Sub

Y eso es todo, espero que te sirva y lo hayas entendido. Para cualquier duda aquí me tienes. Ysi ya está no olvides puntuar.

Hola experto, muchísimas gracias esa formula esta maravillosa y aunque al principio no le entendí, después ya vi su funcionamiento, el autocompletar esta en la primera letra y al darle enter sale el resto de la frase, en verdad es de mucha ayuda :), pero con todo esto me salio una duda, en caso de que tenga mas de un proveedor en la hoja 2 que inicie con la misma letra, ejemplo:

motitas, s.a.

motas, s.a.

maletas, s.a.

¿como hago para que cuando quiera la empresa motas, s.a. no solo salga el primer proveedor que inicie con esa letra, es decir, motitas, s.a.? le aumento el número en donde se pregunta si ingresa un carácter? o existe alguna otra manera de que aparezca el autocompletar visualmente conforme vayamos escribiendo, tal y como aparece en una hoja de excel normal cuando en esa misma columna ya tiene una palabra parecida anteriormente y sale en letras con fondo oscuro el resto de la palabra.

Espero que exista esta posibilidad sin la necesidad de usar el text box. , si no es posible, de cualquier forma tu formula me ayudo bastante y te agradezco enormemente por el tiempo que le diste.

Quedo en espera de tus comentarios y te deseo un feliz dia :)

En principio solo hice corregir la macro que me dabas, que por cierto le he hecho otra corrección porque al borrar varias celdas seleccionadas de una vez daba un error.

No solo se guía por la primera letra sino por todas las que has escrito, entonces consiste en escribir suficientes letras para que haya una única empresa con ese comienzo. También sirve si hay varias con esas letras pero la que queremos escribir es la primera del la lista en la hoja 2.

Por eso su funcionamiento es igual que el del autocompletar, pero sin verlo.

Y lo de hacerlo visualmente lo veo bastante imposible. El autocompletar de Excel está programado a bajo nivel, por eso funciona. No nos proporcionan las herramientas para hacer un autocompletar visual e interactivo ya que para eso sería imprescindible que hubiera un evento del tipo KeyDown ( pulsar tecla) en el objeto sheet (hoja) para que pudiéramos hacer una subrutina de este tipo

Private Sub Worksheet_KeyDown(ByVal Target As Range, ....)

Pero Excel no contempla tal evento en el objeto hoja, unicamente nos proporcina el evento Change, que solo actúa ha terminado de cambiar, y por lo tanto no permite la interacción.

Para hacerlo visualmente tendría que ser escribiendo en un control, un ComboBox por ejemplo, lo cual es más incomodo que escribir directamente y en la celda que queramos.

Aparte de corregir el error ese que te decia, que es cambiar la línea

Valor = taget

por

Valor = Cells(Fila, Columna)

Voy a cambiar tambián el caos con que si la primera letra mayuscula y las siguientes minúsculas, que aparte de añadir complicaciones nos impone una forma única de escribir y puede hacer que empresas existentes no se encuentren. Y además reduciré otras cosas y quedará mejor. Esta es la macro definitiva... de momento.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Fila, Columna, Longi As Integer
Dim Valor As String
Dim Celda As Variant
Fila = Target.Row
Columna = Target.Column
Valor = UCase(Cells(Fila, Columna))
If (Valor <> "") And (Columna = 2) Then
  Longi = Len(Valor)
  For Each Celda In Sheets(2).Range("A2", Sheets(2).Range("A2").End(xlDown))
    If Valor = Left(UCase(Celda.Value), Longi) Then
      Cells(Fila, Columna) = Celda.Value
      Exit For
    End If
  Next Celda
End If
End Sub

Otra cosilla a tener en cuenta es que en la columna A de la hoja 2 no haya celdas vacías porque donde haya una terminará la tabla. Suprime las celdas vacias o escribe algo verosímil o inverosímil, pero no dejes ninguna en blanco a partir de A2 antes del final de tabla.

Y eso es todo.

Muchísimas gracias por tu tiempo y tus conocimientos, en verdad me ayudo mucho, y espero de ser posible me la hagas llegar cuando hayas cambiado el caos de las mayúsculas y minúsculas como me comentas, pero en si, tu formula esta perfecta. Agradezco que existan personas como tu que nos regalen sus conocimientos y su tiempo a los que como yo no sabemos gran cosa de programación.

Te envío un saludo enorme y Mucho éxito en todo lo q te propongas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas