You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB自定义加解密函数运行提示argument not optional错误如何解决?

问题原因及修复方案

报错argument not optional的解决

你定义的CleanEncryptSTR函数包含3个必传参数:待处理字符串、密码、加解密标识布尔值,调用时缺传任意一个都会触发该错误。
正确调用示例:

  • 加密操作:CleanEncryptSTR("待加密内容", "自定义密码", True)
  • 解密操作:CleanEncryptSTR("待解密内容", "和加密一致的密码", False)

满足「字符类型不变」需求的代码修正

原代码问题:AllowedChars集合包含&、;两个符号,且将数字、大小写字母放在同一集合做偏移运算,会导致数字加密后变为字母、字母加密后变为符号,不符合你的需求。
以下是修正后的完整代码,将三类合法字符拆分处理,保证加密后数字仍为数字、大写字母仍为大写字母、小写字母仍为小写字母,不在三类范围内的字符原样保留:

Public Function CleanEncryptSTR(MyString As String, MyPassword As String, Encrypt As Boolean) As String
' Encrypt True: 加密   False: 解密
    Dim i As Integer
    Dim ASCToAdd As Integer
    Dim ThisChar As String
    Dim ThisASC As Integer
    Dim NewASC As Integer
    Dim MyStringEncrypted As String
    ' 拆分三类字符池,独立处理
    Dim NumChars As String, UpperChars As String, LowerChars As String
    Dim PoolLength As Integer, CurrentPool As String
    
    NumChars = "0123456789"
    UpperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    LowerChars = "abcdefghijklmnopqrstuvwxyz"

    If Len(MyPassword) > 0 Then
        For i = 1 To Len(MyString)
            ThisChar = Mid(MyString, i, 1)
            ' 判断当前字符所属的字符池
            ThisASC = InStr(NumChars, ThisChar)
            If ThisASC > 0 Then
                PoolLength = Len(NumChars)
                CurrentPool = NumChars
            Else
                ThisASC = InStr(UpperChars, ThisChar)
                If ThisASC > 0 Then
                    PoolLength = Len(UpperChars)
                    CurrentPool = UpperChars
                Else
                    ThisASC = InStr(LowerChars, ThisChar)
                    If ThisASC > 0 Then
                        PoolLength = Len(LowerChars)
                        CurrentPool = LowerChars
                    Else
                        ' 不在合法字符池内,原样保留
                        MyStringEncrypted = MyStringEncrypted & ThisChar
                        GoTo NextLoop
                    End If
                End If
            End If
            
            ' 偏移计算逻辑和原设计保持一致
            ASCToAdd = Asc(Mid(MyPassword, i Mod Len(MyPassword) + 1, 1))
            If Encrypt Then
                NewASC = ThisASC + ASCToAdd
            Else
                NewASC = ThisASC - ASCToAdd
            End If
            NewASC = NewASC Mod PoolLength
            If NewASC <= 0 Then
                NewASC = NewASC + PoolLength
            End If

            MyStringEncrypted = MyStringEncrypted & Mid(CurrentPool, NewASC, 1)
NextLoop:
        Next i
    Else
        MyStringEncrypted = MyString
    End If

    CleanEncryptSTR = MyStringEncrypted
End Function

修正说明:

  • 拆分三类独立字符池,每个字符仅在所属池内做偏移运算,不会跨类型跳转
  • 保留原有的密码流偏移逻辑,加解密规则和原设计完全兼容
  • 过滤了原代码中的符号字符,不会出现加密后输出符号的问题

内容的提问来源于stack exchange,提问作者TestingGroundz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:30:04