2016-10-21 3 views
0

Я создал функцию, которая вернет ссылку Nth, которая содержит имя листа (если оно есть), однако оно не работает для всех экземпляров. Строка регулярного выражения я используюСоответствие и регулярное выражение Excel в формуле

'[\w ]+[']!([$]{0,1})([A-Z]{1,2})([$]{0,1})(\d{1,5})

Я нахожу, хотя он не найдет первое упоминание в любом из приведенных ниже примеров:

='Biscuits Raw Data'!G783/'Biscuits Raw Data'!E783 
=IF('Biscuits Raw Data'!G705="","",'Biscuits Raw Data'!G723/'Biscuits Raw Data'!G7005*100) 

Ниже мой код функции:

Function GrabNthreference(Rng As range, NthRef As Integer) As String 

Dim patrn As String 
Dim RegX 
Dim Matchs 
Dim RegEx 
Dim FinalMatch 
Dim Subm 
Dim i As Integer 
Dim StrRef As String 

patrn = "'[\w ]+[']!([$]{0,1})([A-Z]{1,2})([$]{0,1})(\d{1,5})" 

StrRef = Rng.Formula 

Set RegEx = CreateObject("vbscript.regexp")  ' Create regular expression. 
RegEx.Global = True 
RegEx.Pattern = patrn        ' Set pattern. 
RegEx.IgnoreCase = True       ' Make case insensitive. 
Set RegX = RegEx.Execute(StrRef) 

If RegX.Count < NthRef Then 
    GrabNthreference = StrRef 
    Exit Function 
End If 
i= -1 
For Each Matchs In RegX ' Iterate Matches collection. 
    Set Subm = RegX(i).submatches 
    i = i + 1 
    If i = NthRef -1 Then 
     GrabNthreference = RegX(i) 
     Exit Function 
    End If 
    'Debug.Print RegX(i) 
Next 

End Function

+0

aha! нашел какой-то другой код, который заставило меня понять мою ошибку в том, что i = i + 1 увеличивал до 1 до сообщения RegX (i), когда i = 0. Я откажусь от вышеуказанного кода и воспользуюсь следующим. Спасибо за @ michael-møldrup за его код. [Ссылка] (http://stackoverflow.com/questions/13835466/find-all-used-references-in-excel-formula) – Rodp

ответ

0

Вот мой окончательный код

Function GrabNthreference(R As range, NthRef As Integer) As String 'based on http://stackoverflow.com/questions/13835466/find-all-used-references-in-excel-formula 
Dim result As Object 
Dim testExpression As String 
Dim objRegEx As Object 
Dim i As Integer 

i = 0 

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 think this is an old attempt so remming out 
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 

     If i = NthRef - 1 Then 
      GrabNthreference = result(i) 
      Exit Function 

     End If 
     i = i + 1 
     Next Match 
    Else 
    GrabNthreference = "No precedencies found" 
    End If 
End If 

End Function 

Этот код действительно привела меня на размышление об использовании метода простых activecell.precedences, но я думаю, что проблема в том, что она не будет сообщать offsheet и не будет указывать, если формула является относительным или абсолютным.

Любые комментарии приветствуются, но я думаю, что я ответил на свой вопрос :)

Смежные вопросы