2011-03-22 38 views
9

Estoy tratando de comparar dos archivos de Excel y almacenar lo que hay solo en el nuevo archivo en una hoja y almacenar lo que hay solo en el anterior en otra hoja. (Básicamente new - old = sheet1 y old - new = sheet2.) Un SO answers sugiere recorrer todas las celdas y hacer una comparación simple. Soy (muy) nuevo para VBA y Macros, así que no sé cómo hacer esto. ¿Cómo se hace (o dónde puedo aprender esto)?Macro de VBA para comparar todas las celdas de dos archivos de Excel

+0

puede utilizar ADO así: http://stackoverflow.com/questions/ 5388095/is-it-possible-to-set-foreign-key-between-two-excel-sheets/5388489 # 5388489 – Fionnuala

Respuesta

23

Do NOT ¡¡atraviesa todas las celdas !! Hay muchos sobrecargas en las comunicaciones entre las hojas de trabajo y VBA, tanto para leer como para escribir. Looping a través de todas las células será agonizantemente lento. Estoy hablando horas.

En su lugar, cargue una hoja completa a la vez en una matriz Variant. En Excel 2003, esto toma alrededor de 2 segundos (y 250 MB de RAM). Entonces puedes recorrerlo en un instante.

En Excel 2007 y más tarde, las hojas son aproximadamente 1000 veces más grandes (1048576 filas × 16384 columnas = 17 000 millones células, en comparación con 65.536 filas × 256 columnas = 17 000 mil en Excel 2003). Se encontrará con un error de "Memoria insuficiente" si intenta cargar la hoja completa en una Variante; en mi máquina solo puedo cargar 32 millones de células a la vez. Por lo tanto, debe limitarse al rango que sabe que tiene datos reales, o cargar la hoja poco a poco, p. 30 columnas a la vez.

Option Explicit 

Sub test() 

    Dim varSheetA As Variant 
    Dim varSheetB As Variant 
    Dim strRangeToCheck As String 
    Dim iRow As Long 
    Dim iCol As Long 

    strRangeToCheck = "A1:IV65536" 
    ' If you know the data will only be in a smaller range, reduce the size of the ranges above. 
    Debug.Print Now 
    varSheetA = Worksheets("Sheet1").Range(strRangeToCheck) 
    varSheetB = Worksheets("Sheet2").Range(strRangeToCheck) ' or whatever your other sheet is. 
    Debug.Print Now 

    For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1) 
     For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2) 
      If varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then 
       ' Cells are identical. 
       ' Do nothing. 
      Else 
       ' Cells are different. 
       ' Code goes here for whatever it is you want to do. 
      End If 
     Next iCol 
    Next iRow 

End Sub 

Para comparar con una hoja de un libro diferente, abra ese libro y obtener la hoja de la siguiente manera:

Set wbkA = Workbooks.Open(filename:="C:\MyBook.xls") 
Set varSheetA = wbkA.Worksheets("Sheet1") ' or whatever sheet you need 
+0

+1 totalmente de acuerdo, nunca recorra todas las celdas – stema

+0

Buen consejo. Me di cuenta de que solo hay una columna que necesito repetir. ¿Cómo recomendarías que haga eso? Y compárelo con una columna en otro libro de trabajo. Diff más bien. –

+0

Quite el bucle For iCol ... Next iCol. Configure iCol a lo que necesite en cada hoja. –

0

Una muy simple y comprueba que puedes hacer con fórmulas Móviles:

Hoja 1 (nuevo - edad)

=(if(AND(Ref_New<>"";Ref_Old="");Ref_New;"") 

Hoja 2 (antiguo - nuevo)

=(if(AND(Ref_Old<>"";Ref_New="");Ref_Old;"") 

Este fórmulas deben trabajar para un INGLÉS Excel. Para otros idiomas necesitan ser traducidos. (Para alemán puedo ayudar)

Debe abrir los tres documentos de Excel, luego copie la primera fórmula en A1 de su hoja 1 y la segunda en A1 de la hoja 2. Ahora haga clic en A1 de la primera celda y marque "Ref_New", ahora puede seleccionar su referencia, ir al nuevo archivo y hacer clic en A1, volver a la hoja 1 y hacer lo mismo para "Ref_Old" con el archivo anterior. Reemplace también el otro "Ref_New".

Haga lo mismo para la Hoja dos.

Ahora copie la forma A1 de formaula sobre el rango completo donde los datos zour están en el archivo antiguo y el nuevo.

Sin embargo, dos casos no están cubiertos aquí:

  1. En la celda de comparación de nuevos y viejos son los mismos datos (resultante de la célula estará vacía)
  2. En la celda de comparación de nuevos y viejos es dife datos (la celda resultante estará vacía)

Para cubrir estos dos casos, también debe crear su propia función, significa aprender VBA. Una página Excel muy útil es cpearson.com

Cuestiones relacionadas