VBA中Runtime Error 429:ActiveX组件无法创建对象问题排查
解决Access VBA AES解密时的Runtime Error 429及函数代码问题
首先,你遇到的Runtime Error 429(ActiveX组件无法创建对象),结合DecryptData函数里的代码问题来看,大概率是函数内的变量拼写错误导致创建ActiveX对象失败——毕竟EncryptData能正常运行,说明你的环境里相关加密类ActiveX组件是正常注册可用的。
下面是DecryptData函数里的所有问题及修复方案:
- 变量拼写错误:把
ObjText误写为ojbText,导致创建对象时引用了未定义的变量,直接触发429错误。修复:将所有ojbText改为ObjText。 - 解密逻辑错误:错误调用了
CreateEncryptor方法,解密必须用CreateDecryptor。修复:把CreateEncryptor替换为CreateDecryptor。 - 未赋值就遍历变量:
decryptedBytes在遍历前没有被赋值,会导致空引用错误。修复:在遍历前先通过解密流的Read方法给decryptedBytes赋值。 - 返回值变量名错误:函数定义是
DecryptData,但最后返回的是DecryptedData,变量名不匹配会导致编译或运行错误。修复:将返回语句里的DecryptedData改为DecryptData,或者统一变量命名。
修复后的DecryptData函数示例(基于常见的.NET加密组件COM互操作场景):
Function DecryptData(inputText As String, key As String, iv As String) As String Dim aes As Object Dim decryptor As Object Dim ms As Object Dim cs As Object Dim ObjText As Object ' 修正拼写错误 Dim encryptedBytes() As Byte Dim decryptedBytes() As Byte Dim decryptResult As String ' 统一返回变量名 Set aes = CreateObject("System.Security.Cryptography.AesManaged") aes.Key = StrConv(key, vbFromUnicode) aes.IV = StrConv(iv, vbFromUnicode) ' 替换为解密器 Set decryptor = aes.CreateDecryptor() Set ObjText = CreateObject("System.Text.UTF8Encoding") encryptedBytes = ObjText.GetBytes_4(inputText) Set ms = CreateObject("System.IO.MemoryStream") Set cs = CreateObject("System.Security.Cryptography.CryptoStream") Set cs = cs.Create(ms, decryptor, 1) ' 指定写入模式 cs.Write encryptedBytes, 0, UBound(encryptedBytes) + 1 cs.FlushFinalBlock ms.Position = 0 ReDim decryptedBytes(ms.Length - 1) ' 给decryptedBytes赋值 ms.Read decryptedBytes, 0, ms.Length decryptResult = ObjText.GetString(decryptedBytes) ' 返回正确的函数名对应变量 DecryptData = decryptResult ' 释放对象 Set cs = Nothing Set ms = Nothing Set decryptor = Nothing Set aes = Nothing Set ObjText = Nothing End Function
另外,因为EncryptData能正常运行,说明你的Access环境已经正确注册了相关加密组件,无需额外排查组件注册问题,重点修复DecryptData里的代码错误即可。
内容的提问来源于stack exchange,提问作者MBrann
相关产品推荐
相关产品推荐

