Aquí es un poco de historia sobre lo que estoy tratando de lograr.

Tengo un archivo de excel, el cual contiene 10 hojas y cada una de las hojas que contienen el número de filas de datos. Este libro se envía a diferentes personas y cada uno llena en sus respectivos info,sólo en las columnas a,B. he hecho un script de vba que recorre todo el lleno de los libros, y las comprobaciones de las filas que tienen las células Ax, Bx llena. A continuación, se copia a aquellos que en un libro nuevo.

Así que lo que tenemos ahora es:

  1. Un libro de trabajo que contiene sólo las filas de las columnas A,B, han sido llenados.
  2. Un libro que contiene todas las filas vacías. (la inicial)

Lo que quiero hacer ahora es comprobar fila por fila, y encontrar por ejemplo, la Fila 1 de la hoja1 del libro Un, menos las columnas a,B, en el libro del B la hoja 1. Después de la fila se encuentra debo reemplazar libro de B fila con el de libro de Un.

Así que al final me quedaré con uno de los maestros de libro (previamente libro B) que contendrá tanto con relleno y sin relleno filas.

Espero no hacer esto demasiado complicado. Cualquier visión sobre lo que es la mejor manera de lograr esto sería apreciada.

  • Any insight on what is the best way to achieve this would be appreciated. Lo que según usted es la mejor manera? Usted debe haber dado algún pensamiento a él:) ¿has probado todavía ningún código? Nos muestran el código que has intentado y sobre la base de que podemos decirle si que es la mejor manera o si se puede mejorar 😉
  • Bien, la manera en la que yo tenía en mente es el más sencillo de lo que yo podía pensar. Bucle a través de las líneas del primer libro, encontrar cada uno de ellos en el segundo libro y reemplazarlos. Con eso dicho, no sé cómo comparar los rangos. libro1.sheet1.range(«C1:F1») = orkbook2.sheet1.range(«C1:F1») ? Y, a continuación, reemplace el conjunto de la línea. Yo no he creado todavía ningún código, porque no estoy seguro de que esta es la mejor manera. Hay muchas líneas de datos y podría ser una exageración de esta manera.
  • Sí Bucle va a ser una exageración. Puede que desee utilizar .FIND Ver si esto le ayudará a comenzar. siddharthrout.wordpress.com/2011/07/14/…
  • Esto parece que se va a trabajar muy bien. Gracias. Voy a volver con el progreso, tan pronto como he hecho 🙂
  • Bueno, yo soy capaz de dar .encontrar una serie de objetos a buscar, pero los resultados no son correctos. Hay una guía sobre cómo utilizar .buscar para buscar un rango? Por lo que puedo entender, aunque primero hay que convertir el rango de una matriz y de verificación celda por celda. Si ese es realmente el caso es un poco en contra del propósito, ¿no?
  • No, ya que no bucle de la célula como un bucle for que se hace. Si puedes subir un libro de ejemplo, a continuación, tal vez me puede mostrar un ejemplo?
  • Hm aceptar. Aquí está una muestra de libros de a y b, estoy describiendo anteriormente: mediafire.com/?a17og2o43fz7086
  • Así que usted desea copiar desde WB-a BM-B si se encuentra una coincidencia? Y en un partido sería si Col C Col L partido supongo?
  • Sí exactamente. Esto haría para este ejemplo, pero diferentes hojas de diferente rango de columna. Creo que va a estar bien si me puede dar un ejemplo para C-L. voy a ser capaz de averiguar el resto.
  • Aceptar que la columna en C a L es único? En el sentido de que los valores no son duplicados en la columna?
  • A partir de los datos que he recopilado hasta ahora, no hay ninguna indicación de que un valor en una columna única. Por eso necesito que coincidan todas las células para asegurarse de que la sustitución es correcta 🙁 nota:yo soy capaz de hacer esta tarea de forma manual mediante el uso de filtros avanzados. No sé si esto sería más fácil de implementar en una secuencia de comandos vba que .encontrar.
  • La publicación de un código poco que utiliza .Encontrar

InformationsquelleAutor kokotas | 2012-08-01

1 Comentario

  1. 1

    Como lo he mencionado en mis comentarios, es posible utilizar .Find para lo que usted está tratando de lograr. El siguiente ejemplo de código se abre libros A y B. Que luego se reproduce a través de los valores de Col C en el Libro A y trata de encontrar la aparición de ese valor en Col C de Libro B. Si se encuentra una coincidencia, a continuación, se compara todas las columnas en la fila. Y si todas las columnas coinciden, a continuación, escribe a Col a y la columna B de libro B basado en lo que el valor está en el libro A. Una vez que el partido se encontró utiliza .FindNext para más coincidencias en Col C.

    Para probar esto, Guardar los archivos que usted me dio como C:\A.xls y C:\B.xls respectivamente. Ahora abrir un libro nuevo y en un módulo pega este código. El código es la comparación de Sheet7 de libro A con Sheet7 de libro B

    Estoy seguro de que usted puede ahora modificar para el resto de las hojas

    PROBADO (Ver fotografía en el final del post)

    Sub Sample()
    Dim wb1 As Workbook, wb2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim ws1LRow As Long, ws2LRow As Long
    Dim i As Long, j As Long
    Dim ws1LCol As Long, ws2LCol As Long
    Dim aCell As Range, bCell As Range
    Dim SearchString As String
    Dim ExitLoop As Boolean, matchFound As Boolean
    '~~> Open File 1
    Set wb1 = Workbooks.Open("C:\A.xls")
    Set ws1 = wb1.Sheets("sheet7")
    '~~> Get the last Row and Last Column
    With ws1
    ws1LRow = .Range("C" & .Rows.Count).End(xlUp).Row
    ws1LCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    End With
    '~~> Open File 2
    Set wb2 = Workbooks.Open("C:\B.xls")
    Set ws2 = wb2.Sheets("sheet7")
    '~~> Get the last Row and Last Column
    With ws2
    ws2LRow = .Range("C" & .Rows.Count).End(xlUp).Row
    ws2LCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    End With
    '~~> Loop Through Cells of Col C in workbook A and try and find it
    '~~> in Col C of workbook 2
    For i = 2 To ws1LRow
    SearchString = ws1.Range("C" & i).Value
    Set aCell = ws2.Columns(3).Find(What:=SearchString, LookIn:=xlValues, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)
    ExitLoop = False
    '~~> If match found
    If Not aCell Is Nothing Then
    Set bCell = aCell
    matchFound = True
    '~~> Then compare all columns
    For j = 4 To ws1LCol
    If ws1.Cells(i, j).Value <> ws2.Cells(aCell.Row, j).Value Then
    matchFound = False
    Exit For
    End If
    Next
    '~~> If all columns matched then wrtie to Col A/B
    If matchFound = True Then
    ws2.Cells(aCell.Row, 1).Value = ws1.Cells(i, 1).Value
    ws2.Cells(aCell.Row, 2).Value = ws1.Cells(i, 2).Value
    End If
    '~~> Find Next Match
    Do While ExitLoop = False
    Set aCell = ws2.Columns(3).FindNext(After:=aCell)
    '~~> If match found
    If Not aCell Is Nothing Then
    If aCell.Address = bCell.Address Then Exit Do
    matchFound = True
    '~~> Then compare all columns
    For j = 4 To ws1LCol
    If ws1.Cells(i, j).Value <> ws2.Cells(aCell.Row, j).Value Then
    matchFound = False
    Exit For
    End If
    Next
    '~~> If all columns matched then wrtie to Col A/B
    If matchFound = True Then
    ws2.Cells(aCell.Row, 1).Value = ws1.Cells(i, 1).Value
    ws2.Cells(aCell.Row, 2).Value = ws1.Cells(i, 2).Value
    End If
    Else
    ExitLoop = True
    End If
    Loop
    End If
    Next
    End Sub

    INSTANTÁNEA

    ANTES de

    Excel vba, comparar las filas de dos libros y reemplazar

    DESPUÉS de

    Excel vba, comparar las filas de dos libros y reemplazar

    • Impresionante! Seguro que funciona, gracias Siddhartha. Voy a estudiar el código, cosas muy útiles y fáciles de entender para un novato como yo.
    • Hm, traté de usarlo en el real sheet7 de mis libros pero lanzó error de tiempo de ejecución 424 – objeto requerido, en línea Si ws1.Las celdas(i, j).Valor <> ws12.Las células(aCell.Fila, j).Valor De Entonces. Voy a mirar en él.
    • Siento que fue un error de tipeo. cambio ws12 a ws2
    • lol yo debería haberme dado cuenta, lo siento. Funciona perfectamente 😀 Ahora solo soy un foreach hoja de bucle lejos de la meta 🙂 Gracias de nuevo!
    • Hecho y funcionando 🙂
    • Tal vez usted debería considerar la posibilidad de upvoting la solución ?

Dejar respuesta

Please enter your comment!
Please enter your name here