Vba Excel-用字典值替换正则表达式

Vba Excel-用字典值替换正则表达式,vba,excel,Vba,Excel,我们正在尝试根据VBA字典自动翻译每个Excel单元格中字符串的某些部分 原始字符串示例: 1.Outer Fabric:2% EA, 44% WO, 54% PES; Lining:4% EA, 96% RY Outside:2% EA, 98% WO 1.Outer Fabric:27% PA, 73% WV; 2.Lining:100% CO; 2.Outer Fabric:100% AOS 正则表达式定义为: Dim strPattern As String: strPattern =

我们正在尝试根据VBA字典自动翻译每个Excel单元格中字符串的某些部分

原始字符串示例:

1.Outer Fabric:2% EA, 44% WO, 54% PES; Lining:4% EA, 96% RY
Outside:2% EA, 98% WO
1.Outer Fabric:27% PA, 73% WV; 2.Lining:100% CO; 2.Outer Fabric:100% AOS
正则表达式定义为:

Dim strPattern As String: strPattern = "(\d{1,3}\%\s+)(\w+)"
我对它进行了测试,效果很好:

字典是从另一个excel数据表构建的。示例键/值对包括:

EA: Leather
WO: Cloth
PES: Polyester
RY: Other
...
但是我找不到一种方法来使用这些字典键来替换原始字符串。下面第12行是我测试的,但它找不到字典值

Dim strPattern As String: strPattern = "(\d{1,3}\%\s+)(\w+)"
Dim strInput As String
Dim Myrange As Range

Set Myrange = ActiveSheet.Range("A2:A50")
With regex
    .Global = True
    .MultiLine = True
    .IgnoreCase = False
    .Pattern = strPattern
End With
Dim strReplace As String: strReplace = "$1" & IIf(Dict.Exists("$2"), Dict("$2"), "$2")

For Each cell In Myrange
    If strPattern <> "" Then
        strInput = cell.Value
        cell.Value = regex.replace(strInput, strReplace)
    End If
Next
Dim strPattern As String:strPattern=“(\d{1,3}\%\s+)(\w+)
像弦一样的模糊的条纹
将Myrange变暗为Range
设置Myrange=ActiveSheet.Range(“A2:A50”)
用正则表达式
.Global=True
.MultiLine=True
.IgnoreCase=False
.Pattern=strPattern
以
作为字符串的Dim strReplace:strReplace=“$1”和IIf(Dict.Exists(“$2”)、Dict(“$2”)、“$2”)
对于Myrange中的每个单元格
如果strPattern“”则
strInput=cell.Value
cell.Value=regex.replace(strInput,strReplace)
如果结束
下一个

非常感谢为解决此问题提供的任何指导。谢谢

我想你不需要正则表达式。当我翻译时,我通常只使用蛮力替换

str = Replace ( str, "EA", "Leather")
str = Replace ( str, "WO", "Cloth")
str = Replace ( str, "PES", "Polyester")
等等
一旦所有的替换都完成了,你就知道它已经翻译了激进分子的删节。

如果
WO
不在字符串中,则替换将失败,只需继续执行下一个操作。

以下是基本概述:

Sub Tester()

    Dim regEx As Object, dict As Object
    Dim matches, m
    Dim c As Range
    Dim s As String, mat As String

    Set dict = CreateObject("scripting.dictionary")
    dict.Add "EA", "Leather"
    dict.Add "WO", "Cloth"
    dict.Add "PES", "Polyester"
    dict.Add "RY", "Leather"

    Set regEx = CreateObject("vbscript.regexp")
    regEx.Pattern = "(\d{1,3}\%\s+)(\w+)"
    regEx.Global = True
    regEx.IgnoreCase = True
    regEx.MultiLine = True

    For Each c In ActiveSheet.Range("A1:A10")
        s = c.Value
        Set matches = regEx.Execute(s)
        If Not matches Is Nothing Then
            'loop over each of the match objects
            For Each m In matches
                mat = m.submatches(1) '<<second submatch=material code
                If dict.Exists(mat) Then
                    s = Replace(s, m, Replace(m, mat, dict(mat)))
                End If
            Next m
        End If
        c.Offset(0, 1).Value = s
    Next c

End Sub
子测试仪()
Dim regEx作为对象,dict作为对象
暗淡的火柴
调光范围
调暗s为弦,垫子为弦
Set dict=CreateObject(“scripting.dictionary”)
添加“EA”、“皮革”
添加“WO”、“Cloth”
添加“聚醚砜”、“聚酯”
添加“RY”、“皮革”
设置regEx=CreateObject(“vbscript.regexp”)
regEx.Pattern=“(\d{1,3}\%\s+(\w+)”
regEx.Global=True
regEx.IgnoreCase=True
regEx.MultiLine=True
对于ActiveSheet.Range(“A1:A10”)中的每个c
s=c.值
Set matches=regEx.Execute
如果不匹配,那就什么都不是了
'在每个匹配对象上循环
对于匹配中的每个m

mat=m.submatches(1)'在这种情况下使用replace的问题不起作用。如果字符串包含“25%EA,35%EA,40%EA”,并且我想用LEA替换EA,那么最后的字符串将包含lllea。此外,要替换的字符串可能有数千行,为每个条目执行此操作非常繁琐。LEA不是范围的一部分。当你写一个问题时,当有重要的事情发生时,你不需要“等等”,这是非常重要的。但是如果你替换“EA”,那么你首先需要一个空间来解决你的问题。乏味,是的。但这就是翻译。我还没有看到任何安全的方法是不是乏味。YMMV.“EA”如何变成“LLEA”?EA不是应该是皮革的吗?那就不可能成为LLEA?我同意这个答案。如果您可以用固定字符串替换模式,则正则表达式非常有用,但由于您有成对的查找/替换字符串,那么您最好只执行一系列查找/替换操作。我也对EA如何变成LLLEA感到困惑,所以我可能遗漏了一些东西。你不能一次替换所有的字典键:你需要依次替换每一个。使用该模式获取匹配集合,然后循环查看每个集合的子匹配,根据需要运行替换。这非常有效。“非常感谢,”蒂姆·威廉姆斯说