vba excel - 查找并替换条件+在同一单元格内多次出现

时间:2017-09-26 07:25:27

标签: excel vba excel-vba

我正在尝试编写VBA代码;我有3天的vba程序员经验。所以根据我的pascal编程经验尽我所能。

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

示例:

Hexa string - Cell B1  - 53706167686574746920616c6c9261676c696f2c206f6c696f20652070657065726f63696e692537

翻译成文本 - 意大利语all aglio,olio e peperocini

我想用65(e)替换92( ),但是在六进制字符串中你注意到有多次出现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"))

欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

小型UDF怎么样,只关注每一个位置?

public static void RegisterBundles(BundleCollection bundles)
        {
bundles.Add(new ScriptBundle("~/bundles/jscode").Include(
           "~/Scripts/UIScripts/Module1/MainCode1.js",
           "~/Scripts/UIScripts/Module2/MainCode2.js",
           "~/Scripts/UIScripts/Module3/MainCode3.js"
           ));
}

呼叫:

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

答案 1 :(得分:0)

请将以下UDF放在标准模块中:

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)