Macro en Excel, Buscar palabra nombre en 2 archivos y regresar un valor

Quiero realizar una macro que realice lo siguiente:

Se tiene en una misma carpeta los siguientes archivos: concentrado.xls, uno.xls y dos.xls

En el archivo concentrado.xls se tiene en la columna A nombres de personas, 1 nombre por fila y en la columna B, se requiere que la macro busque ya sea en el archivo uno.xls o dos.xls el nombre de esa persona (esa persona puede estar en el uno.xls o en el dos.xls) y que regrese el valor del estatus de la persona (el estatus seria: TRABAJO, DESCANSO, LICENCIA MEDICA O VACACIONES). En los anteriores estatus pueden en ocasiones no tener a nadie en ese estatus.

  • Los nombres de las personas en los archivos uno.xls o dos.xls pueden estar hasta debajo de la lista, es decir no están en orden alfabético.

La composición del archivo concentrado.xls seria:

A1=nombre

A2= Acevedo Manríquez María Mireya

A3= Acevedo Mejía Enrique

A4= Acevedo Ruiz Carolina

A5= Acosta Canto Tomás José

A6= Acosta Gámez Celina

A7= Aguilar dorantes !rma

A8= Aguilar lemus María

A9= Aguilar coranca Marcela

A10= Aguilar pérez fredy francisco

A11=Alatriste Pérez José !srael

A12= Alcoverde Martínez Roberto Antonio

La composición del archivo uno.xls seria:

A1 = trabajo

A2= Acevedo Manríquez María Mireya

A3=Acevedo Ruiz Carolina

A4=

A5= DESCANSO

A6=Acosta Gámez Celina

A7=Aguilar lemus María

A8=

A9=LICENCIA MEDICA

A10=Aguilar pérez fredy francisco

A11=

A12=VACACIONES

A13=Alcoverde Martínez Roberto Antonio

La composición del archivo dos.xls seria:

A1=TRABAJO

A2= Acevedo Mejía Enrique

A3= Acosta Canto Tomás José

A4=

A5= DESCANSO

A6=

A7= LICENCIA MEDICA

A8= Aguilar dorantes !rma

A9= Aguilar coranca Marcela

A10= Alatriste Pérez José !srael

A11=

A12= VACACIONES

A13=

Ojala alguien me pueda ayudar.

Respuesta
1

H0la Enrique:

No veo que establezcas una relación entre el nombre y el estado en tus archivos. De hecho, con el ejemplo que das, si hicieras la búsqueda de un nombre sobre tu archivo uno y dos, lo único que podrías decir es si el nombre aparece o no aparece.

Lo otro es que no se indica si un mismo nombre podría estar en ambos archivos y tampoco se indica si en cada archivo un mismo nombre puede estar una o más veces.

De todas formas, creo que no necesitas una macro, con un BUSCARV debiera bastar, pero con la información que muestras no veo que sea posible satisfacer el requerimiento que indicas.

S@lu2.

Hola Isaac.

Los nombres no pueden estar en ambos archivos y tampoco se puede repetir un mismo nombre en un mismo archivo.

Pondré un ejemplo según como hice la composición de los archivos.

buscare el nombre de "Alatriste Pérez José !srael" y en la columna b del archivo concentrado.xls la formula o macro debe de regresar el valor de: "LICENCIA MEDICA".

Es decir, en el archivo concentrado en la columna b se debe de regresar el estatus que tiene la persona, la formula debe de buscar el nombre "Alatriste Pérez José !srael" y en el archivo uno.xls no se encuentra, y en el archivo dos.xls se encuentra hasta abajo de la lista.

otro ejemplo: buscare el nombre de "Acevedo Manríquez María Mireya" y se debe de regresar el valor de "trabajo".

De acuerdo, pero ¿Cómo sé que "Alatriste Pérez José !srael" me arroja "Licencia Médica" y "Acevedo Manríquez María Mireya" arroja "Trabajo"?

Porque todos los nombre de las personas forzosamente tiene un estatus.  Y ese estatus sólo pueden ser TRABAJO . DESCANSO . LICENCIA MEDICA Y VACACIONES. Una persona no puede tener 2 estatus 

Perdón Enrique, pero acabo de entender la estructura de tus archivos uno y dos y tengo otra pregunta ¿Esto lo harás sólo una vez o lo haraz cada vez que lo requieras? Porque si lo harás cada vez que lo requieras, lo recomendable es reestructurar los archivos uno y dos de tal manera que queden los nombres en la columna A y los estados en la columna B, ya que la estructura actual no resulta eficiente.

Por favor, contesta a esta pregunta y luego dime los nombres usados para las hojas, tanto del concentrado, como de los archivos uno y dos.

Además, te recomiendo que actualices del formato .xls al .xlsx o .xlsm (en caso de tener macros)

S@lu2

Esto se tiene que hacer todos los días.  Ya que cada día cambia el estatus de las personas. Un día puede trabajar y al día siguiente descansar . Etc. 

Sobre la reestructuración de los archivos uno y dos.  No es posible ya que es un formato preestablecido. Me queda bastante claro que rerestructurando estos archivos y poniendo en la columna b el estatus de la persona sería más fácil. Pero no se puede cambiar el formato.  

Y los nombre de las hojas uno Y dos se llama hoja1

Perfecto!

Revisando la estructura de uno y dos me encuentro con que en ambos, TRABAJO está en la fila 1, DESCANSO en la fila 5, LICENCIA MEDICA en la fila 9 y VACACIONES en la fila 12 ¿Siempre será así o esto sólo sucede en el ejemplo?

S@lu2

La fila donde se encuentran los estatus no siempre estarán en la misma fila de los ejemplos . Ya que habrá días que 3 personas estén trabajando y las demás de vacaciones.  Etc. 

Muchas gracias por el apoyo.

Enrique, te dejo este par de macros a ver si te sirven.

Sub buscaEnArchivos()
    'Por GP'
    Dim strEtiq() As String, filEtiq(4) As Long
    Dim h1 As Worksheet, h2 As Worksheet, hC As Worksheet
    Dim uno As Workbook, dos As Workbook
    Dim i As Double, j As Double, filaD As Double
    strEtiq = Split("TRABAJO,DESCANSO,LICENCIA MEDICA,VACACIONES", ",")
    Set uno = Workbooks.Open(ThisWorkbook.Path & "\uno.xls")
    Set dos = Workbooks.Open(ThisWorkbook.Path & "\dos.xls")
    Set h1 = uno.Sheets("Hoja1")
    Set h2 = dos.Sheets("Hoja1")
    Set hC = Sheets("Hoja1")
    'Set h1 = Hoja2'
    'Set h2 = Hoja3'
    'Busqueda en primer libro'
    For i = 0 To 3
        filEtiq(i) = fcnBuscaEnCol(h1, "A", strEtiq(i))
    Next
    For i = 0 To 3
        j = (filEtiq(i) + 1)
        Do Until ((j >= filEtiq(i + 1) And i < 3) Or h1.Range("A" & j).Value = "")
            filaD = fcnBuscaEnCol(hC, "A", h1.Range("A" & j).Value)
            If filaD > 0 Then
                hC.Range("B" & filaD).Value = strEtiq(i)
            End If
            j = j + 1
        Loop
    Next
    'Busqueda en segundo libro'
    For i = 0 To 3
        filEtiq(i) = fcnBuscaEnCol(h2, "A", strEtiq(i))
    Next
    For i = 0 To 3
        j = (filEtiq(i) + 1)
        Do Until ((j >= filEtiq(i + 1) And i < 3) Or h2.Range("A" & j).Value = "")
            filaD = fcnBuscaEnCol(hC, "A", h2.Range("A" & j).Value)
            If filaD > 0 Then
                hC.Range("B" & filaD).Value = strEtiq(i)
            End If
            j = j + 1
        Loop
    Next
End Sub
'BUSCAR EN UNA COLUMNA'
'Por GP'
Function fcnBuscaEnCol(hojaBusq As Worksheet, _
                    strCol As String, _
                    strValor As String) As Double
    Dim resulta As Range
    Set resulta = hojaBusq.Range(strCol & ":" & strCol).Find(strValor, _
                                hojaBusq.Range(strCol & hojaBusq.Rows.Count).End(xlUp), _
                                LookIn:=xlValues, LookAt:=xlWhole)
    If (Not resulta Is Nothing) Then
        fcnBuscaEnCol = resulta.Row
    End If
    Uno. Close
    Dos. Close
End Function

S@lu2

Hola amigo, no se que es lo que estoy haciendo mal, copie y pegue lo que me enviaste, pero no logro que funcione.

Me podrías ayudar a checar que estoy haciendo mal.

No se si se pueda, pero subí los archivos a un servidor externo "mega", para que le puedes echar una revisada.

Gracias de antemano.

https://mega.nz/#F!Kh0GhCrT!z3bvO8PtIkCEcJaYXhvulQ

H0la Enrique:

Hay un pequeño inconveniente que no consideré en la macro que te envié.

Busca esta línea en el código

Set hC = Sheets("Hoja1")

Y sobre ella, agrega esta otra línea

ThisWorkbook. Activate

Tendría que quedar así

ThisWorkbook. Activate
Set hC = Sheets("Hoja1")

Lo que sucede es que al momento de abrir los dos archivos, el enfoque cambia al último archivo que se abrió, por lo tanto debemos volver el enfoque al libro inicial antes de seleccionar su hoja1. 

S@lu2

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas