Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Excel中的regexp,在替换匹配字符串之前,我可以对匹配的模式执行一些算法吗?_Regex_Excel_Vba - Fatal编程技术网

使用Excel中的regexp,在替换匹配字符串之前,我可以对匹配的模式执行一些算法吗?

使用Excel中的regexp,在替换匹配字符串之前,我可以对匹配的模式执行一些算法吗?,regex,excel,vba,Regex,Excel,Vba,我使用'VBscript.RegExp``查找并替换正则表达式。我正在尝试这样做: Dim regEx Set regEx = CreateObject("VBScript.RegExp") regEx.Pattern = "ID_(\d{3})" regEx.IgnoreCase = False regEx.Global = True regEx.Replace(a_cell.Value, "=HYPERLINK(A" & CStr(CInt("$1") + 2) ) 也就是说,我有

我使用'VBscript.RegExp``查找并替换正则表达式。我正在尝试这样做:

Dim regEx
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "ID_(\d{3})"
regEx.IgnoreCase = False
regEx.Global = True
regEx.Replace(a_cell.Value, "=HYPERLINK(A" & CStr(CInt("$1") + 2) )
也就是说,我有一些单元格,其中包含ID_006之类的内容,我想用单元格A8的超链接替换这些单元格的内容。所以我匹配这三个数字,然后想在这些数字上加上2,以获得要超链接到的正确行

但是
CStr(CInt(“$1”)+2)
部分不起作用。关于如何使其工作,有什么建议吗?

这是因为:
“=HYPERLINK(A)&CStr(CInt($1)+2)
在代码执行时只评估一次,而不是每次匹配都评估一次

你需要像这样捕捉和处理比赛

a_cell_Value = "*ID_006*"
Set matches = regEx.Execute(a_cell_Value)
Debug.Print "=HYPERLINK(A" & CLng(matches(0).SubMatches(0)) + 2 & ")"

>> =HYPERLINK(A8)
或者如果它们都是???NUM格式

a_cell_Value = "ID_11"
?"=HYPERLINK(A" & (2 + val(mid$(a_cell_Value, instr(a_cell_Value,"_") +1))) & ")"
=HYPERLINK(A13)
线路-

regEx.Replace(a_cell.Value, "=HYPERLINK(A" & CStr(CInt("$1") + 2) )
不起作用,因为VBA将尝试对文本字符串“$1”而不是正则表达式中的匹配项执行
CInt

如果你在两个步骤中完成替换,就像这样-

Dim a_cell
a_cell = Sheets(1).Cells(1, 1)
Dim regEx
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "ID_(\d{3})"
regEx.IgnoreCase = False
regEx.Global = True
a_cell = regEx.Replace(a_cell, "$1")
Sheets(1).Cells(1, 1) = "=HYPERLINK(A" & CStr(CInt(a_cell) + 2) & ")"

鉴于这些观点,我发表了一篇文章

  • 您应该在尝试替换之前测试有效匹配
  • 从当前代码来看,全局是多余的,因为您可以向单元格添加1个hyerplink(1个匹配项)
  • 您当前的代码将接受部分字符串匹配,如果您希望避免ID9999,则可以使用
    ^
    $
    匹配整个字符串。此版本运行我,您可以使用
    .pattern=“ID\ud(\d{3})”还原到当前模式。
  • 通常在添加超链接时,需要一个可见的地址。下面的代码可以做到这一点(一次操作行)
下面的代码以A1:A10的速度运行(显示的示例在coede前后转储到B1:B10)


我做了一个小的更新,Excel 2003中的内容现在对我有用。最后,我用你建议的通配符而不是regexp,在大约十分钟内解决了我的问题。我还发现了以下引语:有些人在遇到问题时,会想“我知道,我会使用正则表达式。”现在他们有两个问题。-Jamie ZawinskiI接受了这一正确答案,因为它确实为我的问题提供了完整、信息丰富且准确的答案。然而,我实际上在另一个答案中使用了这些信息来解决我的问题,即使用通配符而不是正则表达式。
 Sub ParseIt()
    Dim rng1 As Range
    Dim rng2 As Range
    Dim regEx
    Set rng1 = Range([a1], [a10])
    Set regEx = CreateObject("VBScript.RegExp")
    With regEx
        'match entire string
        .Pattern = "^ID_(\d{3})$"
        'match anywhere
       ' .Pattern = "ID_(\d{3})"
        .IgnoreCase = False
        For Each rng2 In rng1
            If .test(rng2.Value) Then
            'use Anchor:=rng2.Offset(0, 1) to dump one column to the right)
                ActiveSheet.Hyperlinks.Add Anchor:=rng2, Address:="", SubAddress:= _
                                           Cells(.Replace(rng2.Value, "$1") + 2, rng2.Column).Address, TextToDisplay:=Cells(.Replace(rng2.Value, "$1") + 2, rng2.Column).Address
            End If
        Next
    End With
End Sub