Question

Nous avons quelques très gros classeurs Excel (des dizaines d'onglets, de plus d'un Mo chacun, des calculs très complexes) avec plusieurs dizaines, voire centaines de formules qui utilisent la redoutable fonction INDIRECT.Ces formules sont réparties dans tout le classeur et ciblent plusieurs tableaux de données pour rechercher des valeurs.

Je dois maintenant déplacer les plages de données ciblées par ces formules vers un emplacement différent dans le même classeur.

(La raison n’est pas particulièrement pertinente, mais intéressante en soi.Nous devons exécuter ces éléments dans les services de calcul Excel et la latence liée au chargement de chacune des tables plutôt volumineuses une par une s'est avérée inacceptablement élevée.Nous déplaçons les tables dans une plage contiguë afin de pouvoir toutes les charger d'un seul coup.)

Existe-t-il un moyen de localiser toutes les formules INDIRECTES qui font actuellement référence aux tables que nous souhaitons déplacer ?

Je n'ai pas besoin de le faire en ligne.Je prendrai volontiers quelque chose qui prend 4 heures à fonctionner tant qu'il est fiable.

Sachez que les méthodes .Precedent, .Dependent, etc. ne suivent que les formules directes.

(En outre, réécrire les feuilles de calcul dans peu importe n'est pas une option pour nous).

Merci!

Était-ce utile?

La solution

Vous pouvez parcourir l'intégralité du classeur en utilisant vba (j'ai inclus le code de @PabloG et @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

Cet exemple remplace chaque occurrence de « indirect(D4) » par « indirect(C4) ».Vous pouvez facilement échanger la fonction de remplacement avec quelque chose de plus sophistiqué, si vous avez des fonctions indirectes plus compliquées.Les performances ne sont pas si mauvaises, même pour les classeurs plus volumineux.

Autres conseils

Question :"Existe-t-il un moyen de localiser toutes les formules INDIRECTES qui font actuellement référence aux tables que nous souhaitons déplacer ?"

Au fur et à mesure que je le lis, vous souhaitez examiner les arguments d'INDIRECT pour trouver des références à des domaines d'intérêt.OTTOMH J'écrirais VBA pour utiliser un analyseur d'expression régulière, ou même un simple INSTR pour trouver INDIRECT (lire la correspondance), puis EVALUATE () la chaîne à l'intérieur pour la convertir en adresse réelle, répéter si nécessaire pour plusieurs INDIRECT (...) appelle et vide la formule et sa traduction sur deux colonnes dans une feuille.

Vous pouvez utiliser quelque chose comme ceci dans 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

Au lieu de Debug.Print, vous pouvez ajouter du code à votre goût

Malheureusement, les arguments indirects sont généralement plus complexes que cela.Voici une formule réelle de l'une des feuilles, pas la formule la plus complexe que nous ayons:

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

hm, vous pouvez écrire un analyseur simple en ignorant la plupart des caractères et en recherchant simplement les parties pertinentes (dans cet exemple :"A..Z", "0..9" et "!:" etc.) mais vous rencontrerez des problèmes si les arguments de "indirect" sont des fonctions.

peut-être que l'approche la plus sûre serait d'imprimer chaque occurrence de « indirect » sur une troisième feuille.vous pouvez ensuite ajouter la sortie souhaitée et écrire un petit programme de recherche et de remplacement pour réécrire vos modifications.

Si vous "obtenez" chaque cellule dans une énorme feuille de calcul, vous pourriez finir par avoir besoin de quantités monstrueuses de mémoire.Je suis toujours prêt à essayer de prendre ce risque.

La méthode de PabloG pour sélectionner la plage utilisée est la voie à suivre (je l'ai ajoutée à mon code d'origine).La vitesse est plutôt bonne, surtout si vous vérifiez si la cellule actuelle contient une formule.Évidemment, tout dépend de la taille de votre classeur.

Je ne suis pas sûr de l'étiquette de SO concernant la mention des produits avec lesquels l'écrivain est connecté, mais OAK, le kit d'analyse Operis, un complément Excel, peut remplacer les fonctions INDIRECTES par les références de cellule auxquelles elles correspondent.Vous pouvez ensuite utiliser les outils d'audit d'Excel pour déterminer les dépendances de chaque plage.

Bien entendu, vous feriez cela avec une copie temporaire du classeur.

Plus à

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

Compte tenu de l'ancienneté de cette question, vous avez peut-être trouvé une solution alternative ou une solution de contournement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top