Excel中有很多好用的函数,但是有一些复杂的运算还是需要宏来实现。本文介绍下如何利用VB宏实现CRC运算,并且与其他单元格联动,更改字符串后,计算结果自动更新。
VB代码如下,VB作者也不是很熟,网上找找例子,照猫画葫芦,修改修改,见笑。
Function CalcCRC16() As String
Dim cell As Range
Dim hexString As String
Dim hexArray() As Integer
Dim crc As Long
Dim i As Integer
Dim j As Integer
Dim tmp As Integer
Set cell = Application.Caller.Offset(0, -1) ' 取左侧一个单元格
hexString = cell.Value
ReDim hexArray(Len(hexString) / 2 - 1)
polynomial = &H1021 ' 多项式
For i = 0 To Len(hexString) - 1 Step 2
hexArray(i / 2) = Val("&H" & Mid(hexString, i + 1, 2) & "00")
Next i
crc = &H0 ' 初始值
For i = 0 To UBound(hexArray)
crc = crc Xor hexArray(i)
For j = 0 To 7
intStr = Right("0000" & Hex(crc * 2), 4)
tmp = Val("&H" & intStr)
If (crc And &H8000) <> 0 Then
crc = (tmp Xor polynomial)
Else
crc = tmp
End If
Next j
Next i
crc = crc Xor &HFFFF ' 结果异或值
CalcCRC16 = Right("0000" & Hex(crc), 4)
End Function
在excel的开发工具里选择VB编辑器,然后插入模块。修改模块名字,然后就可以写VB代码。
写完之后,表格任选单元格先写一个字符串,然后右边单元格输入公式即可。
此时VB宏只计算一次,如果需要实现输入修改,输出同步修改,可以双击sheet1,加入如下代码,即可在有修改时重新运算。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.CalculateFull
End Sub
实现比较粗糙,大家可以根据需要修改。