我设计的Excel文件中有VBA代码,已使用4年,无问题,最近一保存,就显示“该部件的许可证信息没有找到。在设计环境中,你没有合适的许可使用该功能。”,点击两次确定后,显示“文件为保存”,无法保存文件。
    我查看VBA编辑器,有一个表单,可能与使用“Comdlg32.ocx”控件有关,点中该表单,就出现上面的错误信息。该控件已经执行“Regsvr32 Comdlg32.ocx”运行过。最近总出问题?如何解决?    

解决方案 »

  1.   

    是不是最近安装什么软件把老版本的给替换掉了,找个老版本的覆盖后试试
    另外没见你使用该控件的代码,对这个控件来说,可以用DLL文件代替,需要用到API
      

  2.   

    Private Type tagOPENFILENAME
       lStructSize As Long        '结构大小
       hwndOwner As Long          '
       hInstance As Long          '
       strFilter As String        '过滤器字符串
       strCustomFilter As String '选中的过滤器(过滤器索引所指的过滤器)字符串
       nMaxCustFilter As Long     '过滤器最大长度
       nFilterIndex As Long       '选中的过滤器索引,意义与 CommonDialog 控件相同
       strFile As String          '选中的全路径文件名
       nMaxFile As Long           '装载全路径文件名的字符串长度
       strFileTitle As String     '去掉了路径的文件名
       nMaxFileTitle As Long      '装载去掉了路径的文件名字符串长度
       strInitialDir As String    '去掉了文件名的路径(没有最后的反斜杠)
       strTitle As String         '对话框标题,意义与 CommonDialog 控件相同
       flags As Long              '标志,意义与 CommonDialog 控件相同
       nFileOffset As Integer     '路径长度(包括最后的反斜杠)
       nFileExtension As Integer '全路径文件名长度(不计算前面 3 个表示盘符的字符,如 D:)
       strDefExt As String        '默认提取
       lCustData As Long          '
       lpfnHook As Long           '勾子函数地址
       lpTemplateName As String   '
    End TypePrivate Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (ofn As tagOPENFILENAME) As Boolean
    Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (ofn As tagOPENFILENAME) As Boolean
    '返回选择的文件名。输入参数:
    '1.对话框类型(0=保存,1=打开);2.对话框标题;3.过滤器字符串
    '4.过滤器索引;5.标志;6.路径;7.文件名
    Private Function CmdDlg(Optional ByVal DlgType As Boolean = True, _
       Optional ByVal DialogTitle As String, Optional ByVal Filter As String, _
       Optional FilterIndex As Long = 1, Optional flags As Long, _
       Optional ByVal InitialDir As String, Optional ByVal FileName As String, Optional ByRef hWnd As Long = 0) As String
      
    On Error GoTo CmdDlg_Error
    Dim ofn As tagOPENFILENAME
    Dim fResult As Boolean
    If InitialDir = "" Then InitialDir = CurDir
    If Len(Filter) > 0 Then Filter = Replace(Filter, "|", vbNullChar) 'Filter以Chr(0)为分隔符With ofn
       .lStructSize = Len(ofn)
       .hwndOwner = hWnd                                   '0为屏幕句柄
       .strFilter = Filter
       .nFilterIndex = FilterIndex
       .strFile = Left(FileName & String$(255, 0), 255)   '用空字符补足全路径文件名255字节
       .nMaxFile = 255                                    '全路径文件名长度
       .strFileTitle = String$(255, 0)                    '用空字符填充(去掉路径的)文件名
       .nMaxFileTitle = 255                               '(去掉路径的)文件名长度
       .strTitle = DialogTitle                            '对话框标题
       .flags = flags
       .strDefExt = ""
       .strInitialDir = InitialDir
       .hInstance = 0
       .strCustomFilter = String(255, 0)                  '用空字符填充选中的过滤器
       .nMaxCustFilter = 255                              '选中的过滤器长度
       .lpfnHook = 0
    End With
    If DlgType Then fResult = GetOpenFileName(ofn) Else fResult = GetSaveFileName(ofn)
    If fResult Then
       CmdDlg = Left(ofn.strFile, InStr(ofn.strFile, vbNullChar) - 1)
       'FilterIndex = ofn.nFilterIndex                    '返回选中的过滤器索引
    Else
       CmdDlg = vbNullChar
    End If
    CmdDlg_Error:
    End Function
    Private Sub Command1_Click()
    CmdDlg True, "打开", "*.txt", 1, 0, "C:\"
    End Sub
      

  3.   

    我认为需要重新注册一下Comdlg32.ocx控件。
    左下角点开始,然后点运行,然后输入 regsvr32 "Comdlg32.ocx所在的全路径包括文件名"
      

  4.   

       运行 regsvr32 "Comdlg32.ocx所在的全路径包括文件名"后,仍然不行。
        该文件复制到其他电脑可以正常运行。
        以启用宏打开该文件,进入VBA编辑器,点击包含“Comdlg32.ocx”控件的表单,就显示“该部件的许可证信息没有找到。在设计环境中,你没有合适的许可使用该功能”。
        以禁用宏打开该文件,点击包含“Comdlg32.ocx”控件的表单,可以正常显示该表单及Comdlg32.ocx控件。删除该控件,运行新的控件(regsvr32 Comdlg32.ocx),再向该表单添加该控件,保存后文件后,再打开该文件,都正常,然后再保存后打开该文件,就不能保存了,显示“该部件的许可证信息没有找到”等。
        该问题以前使用3、4年,从来没有出问题,就去年和今年部分电脑出现该问题,是否与目前新的操作系统或者新的office有关?
            
      

  5.   

    将下面的文本粘贴到文本编辑器中,然后存为以.reg为扩展名的文件。双击后将信息添加到注册表中。然后用鼠标右键点击一个动态链接库或OCX控件,在弹出的环境菜单中你将会看到Register和Unregister的选项。运用这个方法的前提是你的计算机上必须有regsvr32.exe文件。
    REGEDIT4
    [HKEY_CLASSES_ROOT\.ocx]
    @="ocxfile"
    [HKEY_CLASSES_ROOT\ocxfile]
    @=”OCX”
    [HKEY_CLASSES_ROOT\ocxfile\shell\Register\command]
    @="RegSvr32 \"%1\""
    [HKEY_CLASSES_ROOT\ocxfile\shell\Unregister\command]
    @="RegSvr32 /u \"%1\"" 
    REGEDIT4
    [HKEY_CLASSES_ROOT\.dll]
    @="dllfile"
    [HKEY_CLASSES_ROOT\dllfile]
    @=”DLL”
    [HKEY_CLASSES_ROOT\dllfile\shell\Register\command]
    @="RegSvr32 \"%1\""
    [HKEY_CLASSES_ROOT\dllfile\shell\Unregister\command]
    @="RegSvr32 /u \"%1\"" 
      

  6.   

    一劳永逸地解决问题就是用API,不使用OCX,因为OCX可能由于版本的原因出现各种问题
    上面的文本是注册ocx和dll用的,不用去记忆那些繁琐的DOS命令格式
      

  7.   

    请问大侠,你前面发的API是VB代码吗?有无VBA代码?因为复制到Excel的VBA中,不能使用。