2008-08-29 12 views
5

Tenemos algunos libros de Excel muy grandes (docenas de pestañas, más de un MB cada uno, cálculos muy complejos) con muchas docenas, quizás cientos de fórmulas que usan la temida función INDIRECTO. Estas fórmulas se distribuyen en todo el libro de trabajo y se dirigen a varias tablas de datos para buscar valores.Excel: rangos de listas segmentados por fórmulas INDIRECTAS

Ahora tengo que mover los rangos de datos que están dirigidos por estas fórmulas a una ubicación diferente en el mismo libro de trabajo.

(La razón no es particularmente relevante, pero es interesante por sí misma. Necesitamos ejecutar estas cosas en Excel Calculation Services y el golpe de latencia de cargar cada una de las grandes tablas de una en una resultó inaceptablemente alto. Estamos moviendo las tablas en un rango contiguo para que podamos cargarlas todas de una vez).

¿Hay alguna manera de localizar todas las fórmulas INDIRECTAS que actualmente se refieren a las tablas que queremos mover?

No necesito hacer esto en línea. Con gusto tomaré algo que demore 4 horas en funcionar, siempre que sea confiable.

Tenga en cuenta que los métodos .Precedent, .Dependent, etc. solo rastrean las fórmulas directas.

(Además, al reescribir las hojas de cálculo en , cualquiera que sea no es una opción para nosotros).

Gracias!

+1

Para los curiosos, el proyecto se completó (con éxito). Se necesitaron más de 100 horas-hombre para analizar, modificar y volver a probar a fondo todas las hojas de cálculo (¡sí dije que eran grandes!). Bueno, no es tan malo como lo acabo de hacer sonar: hubiéramos hecho extensas pruebas de nuevo independientemente. –

Respuesta

5

Se podría iterar sobre todo el libro con VBA (He incluido el código de @PabloG y @ euro-Micelli):

Sub iterateOverWorkbook() 
For Each i In ThisWorkbook.Worksheets 
    Set rRng = i.UsedRange 
    For Each j In rRng 
     If (Not IsEmpty(j)) Then 
      If (j.HasFormula) Then 
       If InStr(oCell.Formula, "INDIRECT") Then 
        j.Value = Replace(j.Formula, "INDIRECT(D4)", "INDIRECT(C4)") 
       End If 
      End If 
     End If 
    Next j 
Next i 
End Sub 

Este ejemplo substitues todas las apariciones de "indirecta (D4)" con "indirecto (C4)". Puede cambiar fácilmente la función de reemplazo por algo más sofisticado, si tiene funciones indirectas más complicadas. El rendimiento no es tan malo, incluso para libros de trabajo más grandes.

+0

Estoy aceptando esta respuesta porque es la única respuesta que ha obtenido votos y proporciona el único método conocido que hemos encontrado. La respuesta completa sería * "No, Excel no admite la búsqueda de fórmulas indirectas para usted y ** tiene que ** usar VBA para escanear usted mismo". *. Lo siento, me tomó más de dos años ... –

+1

Puede guardar 4 líneas (y algunas veces) en el código anterior, reemplazando las líneas 4,5,6 (más los 2 extremos que coinciden) por: Para cada j En rRng.SpecialCells (xlCellTypeFormulas) –

0

Puede usar algo como esto en VBA:

Sub ListIndirectRef() 

Dim rRng As Range 
Dim oSh As Worksheet 
Dim oCell As Range 

For Each oSh In ThisWorkbook.Worksheets 
    Set rRng = oSh.UsedRange 
    For Each oCell In rRng 
     If InStr(oCell.Formula, "INDIRECT") Then 
      Debug.Print oCell.Address, oCell.Formula 
     End If 
    Next 
Next 

End Sub 

En lugar de Debug.Print puede agregar código a su gusto

0

Por desgracia, los argumentos de indirectos son generalmente más compleja que eso. He aquí una fórmula real de una de las hojas, no es el más compleja fórmula tenemos:

=IF(INDIRECT("'"&$B$5&"'!"&$O5&"1")="","",INDIRECT("'"&$B$5&"'!"&$O5&"1"))

hm, se podría escribir un analizador sencilla haciendo caso omiso de la mayoría de los personajes y sólo en busca de la partes relevantes (en este ejemplo: "A..Z", "0..9" y "!:" etc.) pero se encontrará con problemas si los argumentos en "indirecto" son funciones.

quizás el enfoque más seguro sería imprimir cada aparición de "indirecto" en una tercera hoja. a continuación, puede agregar el resultado deseado y escribir un pequeño programa de búsqueda y reemplazo para volver a escribir los cambios.

Si "se obtiene" cada célula en un enorme hoja de cálculo que podría acabar necesitando cantidades monstruosas de memoria. Estoy todavía dispuesto a intentar y tomar ese riesgo .

El método de PabloG para seleccionar la gama utilizada es el camino a seguir (lo agregó a mi código original). La velocidad es bastante buena, especialmente si comprueba si la celda actual contiene una fórmula. Obviamente, todo esto depende del tamaño de su libro de trabajo.

1

P: "¿Hay alguna manera de localizar todas las fórmulas INDIRECTAS que actualmente se refieren a las tablas que queremos mover?"

Cuando lo leí, desea buscar dentro de los argumentos de INDIRECT para referencias a áreas de interés. OTTOMH Escribiría VBA para usar un analizador de expresiones regulares, o incluso un INSTR simple para encontrar INDIRECTO (leer hacia adelante para el emparejamiento), luego EVALUAR() la cadena dentro para convertirla a la dirección real, repetir según sea necesario para múltiples INDIRECT (...) llama y volca la fórmula y su traducción a dos columnas en una hoja.

0

No estoy seguro de cuál es la etiqueta de SO respecto a la mención de productos con los que está conectado el escritor, pero OAK, el Operis Analysis Kit, un complemento de Excel, puede reemplazar las funciones INDIRECTAS por las referencias de celda resolver. Luego puede usar las herramientas de auditoría de Excel para determinar qué dependientes tiene cada rango.

Lo haría, por supuesto, hacer esto en una copia temporal del libro de trabajo.

Más contenido en

  • http://www.operisanalysiskit.com/oakpruning.htm
  • http://www.operisanalysiskit.com/help/2007/index.html?oakconceptpruning.htm

Teniendo en cuenta la edad de esta pregunta, es posible que haya encontrado una solución alternativa o una solución alternativa.

Cuestiones relacionadas