Vra

Ons het 'n paar baie groot Excel werkboeke (dekades van oortjies, oor 'n MB elk, baie komplekse berekeninge) met baie dekades, dalk honderde formules wat die gevreesde INDIREKTE funksie te gebruik. Hierdie formules is versprei oor die hele werkboek, en rig 'n paar tafels van data om te kyk-up vir waardes.

Nou moet ek om die omvang van data wat geteiken word deur hierdie formules om 'n ander plek in dieselfde werkboek beweeg.

(Die rede hiervoor is nie besonder relevant, maar interessant op sy eie. Ons moet hierdie dinge in Excel Berekening Dienste en die latency treffer van die laai van elk van die redelik groot tafels een op 'n slag loop bewys onaanvaarbaar hoog te wees. Ons beweeg die tafels in 'n aangrensende reeks so ons almal in een skoot kan laai.)

Is daar enige manier om al die indirekte formules wat tans verwys na die tafels wat ons wil om te beweeg op te spoor?

Ek het nie nodig om dit te doen op-lyn. Ek sal graag neem iets wat 4 ure neem om te hardloop solank dit betroubaar is.

Wees bewus daarvan dat die .Precedent, .Dependent, ens metodes net te spoor direkte formules.

(ook herskryf die spread in ookal is nie 'n opsie vir ons).

Dankie!

Was dit nuttig?

Oplossing

Jy kan Itereer oor die hele Werkboek met behulp van VBA (i het die kode van @PabloG en @ ingesluit 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

Hierdie voorbeeld substitues elke voorkoms van "indirekte (D4)" met "indirekte (C4)". Jy kan maklik te ruil die vervang-funksie met iets meer gesofistikeerd, as jy meer ingewikkeld indirekwerkende funksies. Prestasie is nie so sleg nie, selfs vir 'n groot-werkboeke.

Ander wenke

V: "Is daar enige manier om al die indirekte formules wat tans verwys na die tafels wat ons wil om te beweeg op te spoor?"

As ek dit gelees het, jy wil om te kyk binne-in die argumente van indirekte vir verwysings na gebiede van belang. OTTOMH Ek sal VBA skryf aan 'n gewone uitdrukking parser, of selfs 'n eenvoudige INSTR binne gebruik om INDIREKTE (lees uit na die komende) vind, dan EVALUEER () die string om dit te omskep in die werklike adres, herhaal as wat nodig is vir verskeie INDIREKTE (...) 'n beroep en stort die formule en sy vertaling van twee kolomme in 'n laken.

Jy kan iets soos hierdie gebruik in 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

In plaas van Debug.Print jy kan kode toe te voeg tot jou smaak

  

Ongelukkig is die argumente van   INDIREKTE is gewoonlik meer kompleks as   daardie. Hier is 'n werklike formule uit   een van die velle, nie die mees   komplekse formule ons het:

     

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

hm, kan jy 'n eenvoudige parser skryf deur ignoreer die meeste van die karakters en net op soek na die relevante dele (in hierdie voorbeeld: "AZ", "0..9" en ":" ens) maar jy sal loop in probleme as die argumente in "indirekte" is funksies.

miskien die veiliger benadering sou wees om elke voorkoms van "indirekte" druk in 'n derde blad. jy kan dan voeg die verlangde uitset en skryf 'n klein search en program om jou veranderinge terug skryf vervang.

  

As jy "kry" elke sel in 'n groot   spreadsheet jy kan uiteindelik nodig   monsteragtige bedrae van geheue. Ek is   nog steeds bereid is om te probeer en neem dit   risiko.

metode van keuse van die gebruikte reeks PabloG se is die pad om te gaan (bygevoeg dit in my oorspronklike kode). Die spoed is redelik goed, veral as jy kyk of die huidige sel bevat 'n formule. Dit is duidelik dat dit alles hang af van die grootte van jou werkboek.

Ek is nie seker wat die etiket van SO is met betrekking tot melding gemaak van produkte waarmee die skrywer is verbind, maar OAK, die operis Ontleding Kit, 'n Excel add-in, kan die indirekte funksies vervang deur die selverwysings hulle op te los om. Jy kan dan gebruik Excel se oudit tools om te bepaal wat afhanklikes elke reeks het.

Jy sal, natuurlik, doen dit om 'n tydelike kopie van die werkboek.

Meer by

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

Gegewe die ouderdom van hierdie vraag wat jy dalk het 'n alternatiewe oplossing of tydelike oplossing gevind.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top