Excel: lys reekse geteiken deur INDIREKTE formules
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!
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.