我正在尝试编写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"))
欢迎任何建议。
答案 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)