vba excel-根据条件查找并替换+;同一单元内多次发生

vba excel-根据条件查找并替换+;同一单元内多次发生,vba,excel,Vba,Excel,我试图写一个VBA代码;我有3天的vba程序员经验。所以,根据我的pascal编程经验,尽我最大的努力 从excel中查找十六进制字符串中的数字,如果是奇数,请检查数字的位置,然后用新数字替换该数字。如果不是奇数,则继续搜索同一字符串中的其他匹配项。 我有15000个需要递归搜索的六进制字符串。范围(B1:B15000) 例如: Hexa string - Cell B1 - 53706167686574746920616c6c9261676c696f2c206f6c696f206520706

我试图写一个VBA代码;我有3天的vba程序员经验。所以,根据我的pascal编程经验,尽我最大的努力

从excel中查找十六进制字符串中的数字,如果是奇数,请检查数字的位置,然后用新数字替换该数字。如果不是奇数,则继续搜索同一字符串中的其他匹配项。 我有15000个需要递归搜索的六进制字符串。范围(B1:B15000)

例如:

Hexa string - Cell B1  - 53706167686574746920616c6c9261676c696f2c206f6c696f20652070657065726f63696e692537
翻译成文本-通心粉�阿格里奥,奥利奥·佩佩罗奇尼

我想换92(�) 对于65(e),但在六边形字符串中,您注意到92数字多次出现,但只有一个92落在奇数位置,需要替换

在excel中,我尝试了以下内容:

=IF(ISODD(IF(ISERROR(SEARCH(92,B5)),0,SEARCH(92,B5)))=TRUE,SUBSTITUTE(B5,92,"27"),"no 92")
这仅适用于单元格中的第一次出现, 尝试对其进行修改以进一步搜索,但没有成功:

=IF(ISODD(IF(ISERROR(SEARCH(92,B6)),0,SEARCH(92,B6)))=TRUE,SUBSTITUTE(B6,92,"27"),IF(ISODD(IF(ISERROR(SEARCH(92,B6,SEARCH(92,B6)+1)),0,SEARCH(92,B6,SEARCH(92,B6)+1)))=TRUE,SUBSTITUTE(B6,92,"27"),"no 92"))

欢迎提出任何建议。

来一个小的自定义项,只查看每一秒的位置,怎么样

Function replaceWhenAtOddPos(ByVal s As String, findStr As String, replaceStr As String)

    replaceWhenAtOddPos = s
    If Len(findStr) <> 2 Or Len(replaceStr) <> 2 Then Exit Function

    Dim i As Long
    For i = 1 To Len(s) Step 2
        If Mid(s, i, 2) = findStr Then s = Left(s, i - 1) & replaceStr & Mid(s, i + 2)
    Next i
    replaceWhenAtOddPos = s
End function

请将以下自定义项放入标准模块中:

Public Function replace_hex(str As String, srch As Integer, repl As Integer) As String
Dim pos As Integer
    pos = InStr(pos + 1, str, CStr(srch))
    Do Until pos = 0
        If pos Mod 2 = 0 Then str = Left(str, pos - 1) & CStr(repl) & Mid(str, pos + 2)
        pos = InStr(pos + 1, str, CStr(srch))
    Loop
replace_hex = str
End Function
并在工作表中这样称呼它:
=replace_hex(A1,92,65)

你好,托马斯,非常感谢您的快速回复。这解决了问题。你好,乔晨,非常感谢您的快速回复和建议。也测试了您的解决方案,但它似乎不会更改奇数位置字符。例如:5461726C79206D6542070616B736F6920656E2067616D62619273字符串,在我设置=replace_hex之后(B1,92,27)-5461726C72706D6574204070676F6270656E2067616D62619273,因此基本上替换搜索字符串中的前92,但忽略奇数位置上的最后92。
Public Function replace_hex(str As String, srch As Integer, repl As Integer) As String
Dim pos As Integer
    pos = InStr(pos + 1, str, CStr(srch))
    Do Until pos = 0
        If pos Mod 2 = 0 Then str = Left(str, pos - 1) & CStr(repl) & Mid(str, pos + 2)
        pos = InStr(pos + 1, str, CStr(srch))
    Loop
replace_hex = str
End Function