Formula con buscarv e insertar filas

Tengo un archivo de excel 2010, en la hoja 1 columna A tengo unos códigos ejemplo 1001,1002,1005, etc aproximadamente 10000, y así tengo 7 hojas (hasta la hoja 7.) más para un total de 70.000 códigos. En otra hoja NOMBRES tengo una matriz con 16.000 códigos y cada código con una nombre. Lo que necesito es que cada hoja 1,2,3,4,5,67, frente al código aparezca el nombre que están en los 16.000 registros de la hoja Nombres. Hasta ahi lo puedo hacer con buscarv y funciona. Pasa que en los 16.000 registros de la hoja nombres, 12000 registros son repetidos. Ejemplo 1001 tiene nombre A, pero hay 1001 con nombre B y 1001 con nombre C y asi sucesivamente, lo que necesito es aplicar la función buscarv normal, pero ademas que si hay códigos en la hoja 1 por ejemplo que está el código 1001 coloque el primer nombre que encuentre en la HOJA NOMBRES y inserte filas y coloque los otros 10 códigos 1001 con su respectivo nombre y asi sucesivamente con todos los repetidos.

Agradezco mucho el apoyo y colaboración.

1 Respuesta

Respuesta
1

Te mando mi solución, ejecuta esta macro y todo solucionado.

He supuesto que los códigos empiezan en todas las hojas desde A1 hacia abajo

Sub ejemplo()
'por luismondelo
For Each hoja In ActiveWorkbook.Sheets
If hoja.Name <> "nombres" Then
hoja.Select
Range("a1").Select
Do While ActiveCell.Value <> ""
valor = ActiveCell
contarsi = Application.WorksheetFunction.CountIf(Sheets("nombres").Columns(1), valor)
If contarsi = 1 Then
Set busca = Sheets("nombres").Columns(1).Find(valor, LookIn:=xlValues, lookat:=xlWhole)
If Not busca Is Nothing Then
ActiveCell.Offset(0, 1).Value = busca.Offset(0, 1)
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
ElseIf contarsi <> 1 Then
Set busca = Sheets("nombres").Columns(1).Find(valor, LookIn:=xlValues, lookat:=xlWhole)
If Not busca Is Nothing Then
ubica = busca.Address
Do
ActiveCell.Offset(0, 1).Value = busca.Offset(0, 1)
Set busca = Sheets("nombres").Columns(1).FindNext(busca)
ActiveCell.Offset(1, 0).Select
ActiveCell.EntireRow.Insert
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value
Loop While Not busca Is Nothing And busca.Address <> ubica
ActiveCell.EntireRow.Delete
End If
End If
Loop
End If
Next
End Sub

no olvides finalizar la consulta

Luis Muchas gracias, por su respuesta, pero resulta que la macro se queda ejecutándose y no da respuesta alguna, y aparece "no responde " en la parte de arriba, paa probarla deje una sola hoja con 20 códigos y en el archivo de nombres deje 30 registros, y aun así se queda pensando.

En tu pregunta original dices "... hoja NOMBRES..." y en ningún momento dices archivo NOMBRES, por lo tanto mi macro está preparada para que dentro del mismo archivo tengas las pestañas de la 1 a la 7 y también la PESTAÑA NOMBRES.

Hazlo así y funcionará.

Que pena Luis , si tengo una hoja con nombres , no es un archivo, la macro se ejecuta bien hasta un cierto numero de registros de la primera hoja , luego se bloquea al dar cerrar a excel sale finalizar programa detiene la macro y sale depurar uno le da clic y sale en amarillo está instrucción

Set busca = Sheets("nombres").Columns(1).Find(valor, LookIn:=xlValues, lookat:=xlWhole)

Es decir, se queda como pensando , pero si funciona , debe cer algún ciclo. Muchas gracias por su colaboración.

Luis ya se que es lo que pasa el se queda "pensando" o bloqueado cuando en la hoja 1 llega a un código que no esta en la hoja nombres, hasta ahi ejecuta y se queda bloqueado, es decir hay códigos de las hojas que no están en la hoja nombres. Si todos los códigos están en la hoja nombres la macro funciona perfecta. Muchas gracias.

Ok, te mando la solución esta es la nueva macro, ejecútala con las mismas instrucciones de siempre y todo solucionado:

Sub ejemplo()
'por luismondelo
For Each hoja In ActiveWorkbook.Sheets
If hoja.Name <> "nombres" Then
hoja.Select
Range("a1").Select
Do While ActiveCell.Value <> ""
valor = ActiveCell
contarsi = Application.WorksheetFunction.CountIf(Sheets("nombres").Columns(1), valor)
If contarsi = 0 Then
ActiveCell.Offset(1, 0).Select
GoTo salto
End If
If contarsi = 1 Then
Set busca = Sheets("nombres").Columns(1).Find(valor, LookIn:=xlValues, lookat:=xlWhole)
If Not busca Is Nothing Then
ActiveCell.Offset(0, 1).Value = busca.Offset(0, 1)
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
ElseIf contarsi <> 1 Then
Set busca = Sheets("nombres").Columns(1).Find(valor, LookIn:=xlValues, lookat:=xlWhole)
If Not busca Is Nothing Then
ubica = busca.Address
Do
ActiveCell.Offset(0, 1).Value = busca.Offset(0, 1)
Set busca = Sheets("nombres").Columns(1).FindNext(busca)
ActiveCell.Offset(1, 0).Select
ActiveCell.EntireRow.Insert
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value
Loop While Not busca Is Nothing And busca.Address <> ubica
ActiveCell.EntireRow.Delete
End If
End If
salto:
Loop
End If
Next
End Sub

no olvides finalizar la consulta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas