Foros del Web » Soporte técnico » Ofimática »

VBA - Método Find de excel

Estas en el tema de VBA - Método Find de excel en el foro de Ofimática en Foros del Web. Gracias a unos de vosotros conseguí hacer la busqueda mediante el método find. A continuación les pongo el codigo resultante: Código: Sub CompareCols() 'Auto_Open encontrada ...
  #1 (permalink)  
Antiguo 27/10/2008, 05:43
 
Fecha de Ingreso: marzo-2007
Mensajes: 538
Antigüedad: 17 años, 1 mes
Puntos: 0
VBA - Método Find de excel

Gracias a unos de vosotros conseguí hacer la busqueda mediante el método find.
A continuación les pongo el codigo resultante:
Código:
Sub CompareCols()
    'Auto_Open
    encontrada = False
    Dim celda As Range
    Dim rango As Range
    For i = 2 To numRows(1)
        Dim valor As String
        valor = Workbooks(2).Worksheets(1).Range(varcellOriginalColumn1 & i).Value
        
        Windows(myBook(2)).Activate
        Set rango = Range(varCellDestinyColumn1 & 2, varCellDestinyColumn1 & numRows(2))
        
        Set celda = rango.find(What:=valor, LookIn:=xlValues, LookAt:=xlWhole)

      If Not celda Is Nothing Then
        Windows(myBook(2)).Activate
        rowPos = celda.Row
        valueSearch = Range(varCellDestinyCopy & rowPos).Value
        'valueSearch = celda.Value
        'drawColorRow (pos)
        'Selection.Copy
        Windows(myBook(1)).Activate
        Workbooks(2).Sheets(1).Select
        Range(varCellInsertColumn & i).Value = valueSearch
        'drawColorRow (i)
        'ActiveSheet.Paste
      Else
        Windows(myBook(1)).Activate
        Rows(i & ":" & i).Select
        Range("N" & i).Activate
        With Selection.Interior
          .Pattern = xlSolid
          .PatternColorIndex = xlAutomatic
          .ThemeColor = xlThemeColorAccent2
          .TintAndShade = 0
          .PatternTintAndShade = 0
        End With
      End If
    Next i
    
    Set celda = Nothing
    Windows(myBook(2)).Activate
    Columns(varCellInsertColumn & ":" & varCellInsertColumn).EntireColumn.AutoFit
End Sub
pero ahora mi programa se complica y necesito buscar dos columnas, ¿se puede hacer con el metodo Find tambien?
He creado una macro y no me devuelve nada.

¿Cómo lo hariais?
A mi se me ocurre de la siguiente manera
en la fila i columna b
buscar ese valor en el otro archivo
Si lo encuentra1
buscar de la fila i columna c
si lo encuentra2
comparar que sean de la misma fila
sino
hacer algo o nada
fin si
fin si


creo que lo de comparar que sean de la misma fila es correcto pero no se bien como hacerlo, aparte de celda1.row = celda2.row

Imaginemos esta tablita1
Nombre Apellido
Juan Perez
Juan Gonzalo
Enrique Martin


Y la tablita2 a comparar
Juan Perez
Juan Gonzalo
Joaquin Velasco


Si deseamos buscar Juan Gonzalo
Primero buscaremos Juan y celda1.row será =1 (en la tabla2)
Luego buscaremos Gonzalo y celda2.row = 2 (en la tabla2)

por lo que ya no nos sirve este código,

Perdon por el rollo, pero es que no lo veo claro que funcione.


Gracias!!!

Última edición por Laufwerk; 27/10/2008 a las 07:28
  #2 (permalink)  
Antiguo 27/10/2008, 13:34
Avatar de mrocf  
Fecha de Ingreso: marzo-2007
Ubicación: Bs.As.
Mensajes: 1.103
Antigüedad: 17 años
Puntos: 88
De acuerdo Respuesta: VBA - Método Find de excel

Hola! Laufwerk. El procedimiento que propones parece bastante engorroso. ¿Qué te parece si el nombre y apellido a localizar lo buscas "de una sola mirada" a la tabla?.

Por ejemplo:
Código:
Sub BuscarDosCeldas()
' La Base de Datos ubicada en la hoja "Hoja1" contiene:
' [A1:A100] los nombres
' [B1:B100] los apellidos
' Los nombres y apellidos son unidos y pasados a la variable 'BD'
With Sheets("Hoja1")
  BD = Evaluate("TRANSPOSE(" & _
    .[A1:A100].Address(External:=True) & " & "" "" & " & _
    .[B1:B100].Address(External:=True) & ")")
End With

' El nombre y apellido buscados se encuentran en [D2:E2] de la HOJA ACTIVA
' Mediante la función COINCIDIR() (Match) localizo lo buscado en 'BD'
On Error Resume Next
  Fila = 0
  Fila = WorksheetFunction.Match([D2] & " " & [E2], BD, 0)
On Error GoTo 0
  
' Mensaje si no existe el dato
If Fila = 0 Then MsgBox "No existe": Exit Sub
' Selección si existe el dato
Application.Goto Sheets("Hoja1").[A1].Offset(Fila - 1)
End Sub 
Fíjate si puedes adaptarlo a tus necesidades.
Saludos, Cacho.
  #3 (permalink)  
Antiguo 28/10/2008, 10:11
 
Fecha de Ingreso: marzo-2007
Mensajes: 538
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: VBA - Método Find de excel

Gracias por el código aunque me cueste de entender.
Tengo que comparar la persona o lo que sea con el otro archivo de excel. Si no existe marcarlo en rojo, cuando finalice dicho libro de personas hacer la busqueda al revés del archivo 2 al archivo 1.

Hay cosas del código que no entiendo por mucho que me ponga, podrías explicarlo un poco mas?

Gracias!!!
  #4 (permalink)  
Antiguo 28/10/2008, 11:13
Avatar de mrocf  
Fecha de Ingreso: marzo-2007
Ubicación: Bs.As.
Mensajes: 1.103
Antigüedad: 17 años
Puntos: 88
De acuerdo VBA - Método Find de excel

Es probable que tu dificultad no sea la interpretación del código... sino la interpretación de algunas fórmulas del Excel.

Te sugiero que sigas estos pasos:

a) Crea un libro nuevo con una hoja llamada "Hoja1"
b) En el rango [A1:A5] pon 5 nombres cualesquiera.
c) En el rango [B1:B5] pon 5 apellidos cualesquiera.
d) Incorpora este código:
Código:
Sub ParaAnalizar()
With Sheets("Hoja1")
  [d1].FormulaArray = "= (A1:B5)"
  [d2].FormulaArray = "= " & _
    .[A1:A5].Address(External:=True) & " & "" "" & " & _
    .[B1:B5].Address(External:=True)
  [d3].FormulaArray = "= TRANSPOSE(" & _
    .[A1:A5].Address(External:=True) & " & "" "" & " & _
    .[B1:B5].Address(External:=True) & ")"
End With
End Sub 
e) Ejecuta el código y analiza las tres fórmulas que se generan en [d1], [d2] y [d3] sin dejar (en las tres fórmulas) de seleccionarlas, presionar la tecla <F2> para editarlas y presionar la tecla <F9> para ver desplegados los resultados de las mismas: interpreta esos resultados, advierte como Excel trata a las matrices (primer caso) y a los vectores verticales (segundo caso) y horizontales (tercer caso) de datos.

f) La segunda fórmula es "la base" del tema, mientras que la tercera "acomoda" la fórmula anterior a lo que el VBA puede manejar.

Cuando hayas terminado, indícanos tus conclusiones.
Saludos, Cacho.

Última edición por mrocf; 28/10/2008 a las 11:29
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:08.