Pergunta

Temos alguns muito grandes pastas de trabalho do Excel (dezenas de guias, através de uma MB cada, muito complexos cálculos) com muitas dezenas, talvez centenas de fórmulas que usam o temido função INDIRETA.Estas fórmulas estão espalhados ao longo de todo o livro, e alvo de diversas tabelas de dados para valores.

Agora eu preciso para mover a intervalos de dados que são direcionados por esses fórmulas para um local diferente na mesma pasta de trabalho.

(O motivo não é particularmente relevante, mas o interessante no seu próprio.Precisamos para executar estas coisas no Serviços de Cálculo do Excel e a latência bater de carregamento de cada, ao invés de tabelas grandes, um de cada vez provou ser alto demais.Estamos nos movendo as tabelas em um intervalo contíguo para que possamos carregá-los todos de uma só vez.)

Existe alguma maneira para localizar todos os INDIRETOS fórmulas que, atualmente, consulte as tabelas que você deseja mover?

Eu não preciso fazer isso on-line.Eu vou com prazer que aproveito algo que leva 4 horas para ser executado, contanto que ela é confiável.

Esteja ciente de que o .Precedentes .Dependentes, etc apenas os métodos de controlar direta de fórmulas.

(Também, reescrevendo as folhas de cálculo, em qualquer que seja a não é uma opção para nós).

Obrigado!

Foi útil?

Solução

Você pode iterar sobre toda a pasta de trabalho usando o vba (eu incluído o código de @PabloG e @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 exemplo substitui todas as ocorrências de "indiretas(D4)" com "indiretas(C4)".Você pode facilmente trocar a substituir-função com algo mais sofisticado, se você tiver mais complicado indireta-funções.O desempenho não é ruim, até mesmo para maiores Pastas de trabalho.

Outras dicas

Q:"Existe alguma maneira de localizar todos os INDIRETOS fórmulas que, atualmente, consulte as tabelas que você deseja mover?"

Como eu lê-lo, você quer olhar para dentro de argumentos INDIRECTOS, para as referências para as áreas de interesse.OTTOMH que eu ia escrever VBA para usar uma expressão regular analisador, ou até mesmo um simples INSTR encontrar INDIRETA( leia-se para a frente para o correspondente) e, em seguida, AVALIAR() a seqüência de caracteres dentro de convertê-lo para o endereço real, repita conforme necessário para vários INDIRETA(...) as chamadas e copiar a fórmula e a sua tradução para duas colunas em uma folha.

Você pode usar algo como isso em 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

Em vez de Depuração.Imprimir você pode adicionar código para se adequar ao seu gosto

Infelizmente, os argumentos de INDIRETOS são geralmente mais complexas do que que.Aqui está uma fórmula atual de uma das folhas, não mais complexa fórmula, temos:

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

hm, você poderia escrever um analisador simples, ignorando a maioria dos personagens e olhando apenas para as partes relevantes (neste exemplo:"A..Z", "0..9" e "!:" etc.) mas você vai correr em problemas se os argumentos em "indiretos" são funções.

talvez a abordagem mais segura seria a de imprimir a cada ocorrência de "indireta" em uma terceira folha.você pode, em seguida, adicione a saída desejada e escrever uma pequena pesquisa e substituir o programa para gravar suas alterações de volta.

Se você "pegar" todas as células de uma enorme planilha, você pode acabar precisando de monstruosas quantidades de memória.Eu sou ainda dispostos a tentar levar isso risco.

PabloG do método de selecionar o intervalo utilizado é o caminho a percorrer (adicionado no meu código original).A velocidade é muito bom, especialmente se você verifique se a célula atual contém uma fórmula.Obviamente, tudo isso depende do tamanho da pasta de trabalho.

Eu não tenho certeza do que a etiqueta de ENTÃO, é referente a menção de produtos com os quais o escritor está ligado, mas o CARVALHO, a Operis Análise Kit, um suplemento do Excel, pode substituir o INDIRECTOS a funções as referências de célula que resolver.Em seguida, você pode usar o Excel ferramentas de auditoria para determinar o que os dependentes de cada faixa tem.

Você poderia, é claro, fazer uma cópia temporária do livro.

Mais

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

Dada a idade dessa pergunta que você pode ter encontrado uma solução alternativa ou solução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top