2012-12-12 5 views
5

Unten ist das Beispiel in Excel festgelegt,Alle verwendeten Referenzen in Excel Formel

[column1] [column2] 

A1 =C3-C5 

A2 =((C4-C6)/C6) 

A3 =C4*C3 

A4 =C6/C7 

A5 =C6*C4*C3 

Ich brauche die verwendeten Referenzen in Formeln zu extrahieren

Zum Beispiel

for "A1", I simply need to get the C3 and C5. 
for A2, I need to get the C4 and C6. 

Antwort

3

Diese Funktion gibt Ihnen eine kommagetrennte Liste von Quellzellen (Präzedenzfälle) zurück:

 
Function References(rngSource As Range) As Variant 
    Dim rngRef As Range 
    Dim strTemp As String 
    On Error Resume Next 
    For Each rngRef In rngSource.Precedents.Cells 
     strTemp = strTemp & ", " & rngRef.Address(False, False) 
    Next 
    If Len(strTemp) 0 Then strTemp = Mid(strTemp, 3) 
    References = strTemp 
End Function 

Beachten Sie jedoch, dass Sie dies nicht als UDF im Arbeitsblatt verwenden können, da rngRef.Address leider einen Zirkelverweis verursacht. Sie können es jedoch in einem kleinen Verfahren verwenden, um eine andere Spalte, z.

 
Sub ShowPrecedents() 
    Dim rng As Range 
    'Will paste precedents of A1:A6 into D1:D6 
    For Each rng In Range("D1:D6") 
     rng.Value = References(rng.Offset(, -3)) 
    Next 
End Sub 
+0

Funktioniert für lokale Blattverweise, jedoch nicht für verdeckte Referenzen. – brettdj

1

Nur um Ihnen eine Alternative zu bieten ... beachten, dass dieser doppelte Ergebnis zurück, wenn die Zellen mehr als einmal

Sub testing() 
Dim result As Object 
Dim r As Range 
Dim testExpression As String 
Dim objRegEx As Object 

Set r = Cells(1, 2) ' INPUT THE CELL HERE , e.g. cells("A1") 
Set objRegEx = CreateObject("VBScript.RegExp") 
objRegEx.IgnoreCase = True 
objRegEx.Global = True 
objRegEx.Pattern = """.*""" ' remove expressions 
testExpression = CStr(r.Formula) 
testExpression = objRegEx.Replace(testExpression, "") 
objRegEx.Pattern = "(([A-Z])+(\d)+)" 'grab the address 

If objRegEx.test(testExpression) Then 
    Set result = objRegEx.Execute(testExpression) 
    If result.Count > 0 Then 
     For Each Match In result 
      Debug.Print Match.Value 
     Next Match 
    End If 
End If 
End Sub 

Die Ergebnisse werden gespeichert in „Match.Value“

5
genannt werden

Dies ist ein Update auf:

Funktioniert für lokale Blattverweise, aber nicht für Referenzen außerhalb des Blattes. - brettdj 14. Mai '14 um 11:55

Durch die Verwendung von Larrys Methode, ändern Sie einfach die objRegEx.Pattern zu:

(['].*?['!])?([[A-Z0-9_]+[!])?(\$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?|\$?[A-Z]+:\$?[A-Z]+|(\$?[A-Z]+\$?(\d)+)) 

Dies wird:

  1. Suche nach optionalen externen Links : (['].*?['!])?
  2. Suche nach optional Datenblatt-Referenz: ([[A-Z0-9_]+[!])?
  3. Machen Sie die folgenden ste ps in priorisierter Reihenfolge:
  4. Suche nach Bereichen mit Zeilennummern (und optional $): \$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?
  5. Suche für Bereiche ohne Zeilennummern (und optional $): \$?[A-Z]+:\$?[A-Z]+
  6. Suche nach 1-Zellbezügen (Und optional $): (\$?[A-Z]+\$?(\d)+)

in dieser Resultierende:

Sub testing() 
Dim result As Object 
Dim r As Range 
Dim testExpression As String 
Dim objRegEx As Object 

Set r = Cells(1, 2) ' INPUT THE CELL HERE , e.g. RANGE("A1") 
Set objRegEx = CreateObject("VBScript.RegExp") 
objRegEx.IgnoreCase = True 
objRegEx.Global = True 
objRegEx.Pattern = """.*?""" ' remove expressions 
testExpression = CStr(r.Formula) 
testExpression = objRegEx.Replace(testExpression, "") 
objRegEx.Pattern = "(([A-Z])+(\d)+)" 'grab the address 

objRegEx.Pattern = "(['].*?['!])?([[A-Z0-9_]+[!])?(\$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?|\$?[A-Z]+:\$?[A-Z]+|(\$?[A-Z]+\$?(\d)+))" 
If objRegEx.test(testExpression) Then 
    Set result = objRegEx.Execute(testExpression) 
    If result.Count > 0 Then 
     For Each Match In result 
      Debug.Print Match.Value 
     Next Match 
    End If 
End If 
End Sub 

dies tun, werden Sie die Werte aller möglichen Referenzen geben, konnte ich denke, von. (Dieser Beitrag wurde aktualisiert, weil ich das Problem gelöst habe).

+0

Schön. Ein alternativer Ansatz, der einfacher sein könnte, wäre die Verwendung der 'FormulaR1C1'-Eigenschaft, da dies möglicherweise einfacher zu parsen ist als der Standard-A1-Adressierungsstil. Ihr Ansatz scheint in gewisser Weise dem Ansatz der akzeptierten Antwort überlegen zu sein, da er in der Lage ist, zwischen absoluten und relativen Referenzen zu unterscheiden.Auf der anderen Seite wäre Ihr Ansatz ohne größere Modifikationen nicht in der Lage, benannte Bereiche zu identifizieren (was die akzeptierte Antwort immer noch aufgreift). Ein hybrider Ansatz könnte die optimale Lösung sein. –

+0

Ich versuchte dies auf einer Zelle mit der folgenden Formel: = IF (ISBLANK ('CU68X Daten'! $ A9), "", IF ($ B45 & $ C45 & $ D45 & $ E45 = 'CU68X Daten'! D9 & 'CU68X Data' ! E9 & 'CU68X Daten'! F9 & 'CU68X Daten'! G9, 'CU68X Daten'! $ Y9, "Condition Error")). Es gab nur die erste Referenz ($ A9) ... wie kommt ?? – Dan

+0

Diese Zeile muss geändert werden: '‚objRegEx.Pattern = ‚‘ ‚‚‘*.?‘‘Entfernen expressions'
Auch müssen Sie auf die unten die Expression ändern, um zu erfassen, Ihre Formel richtig: 'objRegEx.Pattern =" ([']. *? ['!])? ([[A-Z0-9 _] + [!])? (\ $? [AZ] + \ $? (\ d) + (: \ $? [AZ] + \ $? (\ d) +)? | \ $? [AZ] +: \ $? [AZ] + | (\ $? [AZ] + \ $? (\ d) +)) ''
(Nur ein "?" in der ersten Gruppe hinzugefügt, um zu verhindern, dass diese Gruppe zu gierig wird) –