设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: zww3008

[ActiveX] TreeView出错,似与MSCOMCTL.OCX版本有关【已解决】

[复制链接]
 楼主| 发表于 2013-4-3 09:28:43 | 显示全部楼层
问题解决了!
原来就是这么简单,主要是我疏忽了。
方法是,将新版MSCOMCTL.OCX拷贝到有问题的电脑上,然后再进行注册(运行regsvr32 MSCOMCTL.OCX),就这么简单。
我上面说过我也注册过,是我疏忽了,由于不方便在其他电脑上测试,我只是在我自己的电脑上,换成了低版本的MSCOMCTL.OCX,再注册,当然问题解决不了,今天在有问题的电脑上拷贝最新版MSCOMCTL.OCX文件后,再运行regsvr32 MSCOMCTL.OCX注册,问题就解决了!
为了方便,我制成了一个工具,有需要的可看看,尽量选择最新版。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2013-4-3 09:49:40 | 显示全部楼层
试用一下,谢谢
 楼主| 发表于 2013-4-3 11:33:04 | 显示全部楼层
本帖最后由 zww3008 于 2013-4-3 11:35 编辑

我试过以下方法,现在才搞清楚,由于不是MSCOMCTL.OCX文件真的损坏或丢失,只是因旧版本不匹配。导致对控件MSComctlLib的操作,无法识别,不能识别,也就没有对象,也就不能进行引用删除、引用添加等等操作!
原来是我把问题搞复杂了,只需更新MSCOMCTL.OCX文件并注册即可。不过从中也学到不少知识。我把MSCOMCTL.OCX剪切到其他目录,mdb会自动满世界地找到他{:soso_e113:}自动重新建立引用。
真正是由于MSCOMCTL.OCX版本引起的错误时,以下代码无效,但还是共享一下:
==================================
Private Sub Cmd查看_Click()
On Error Resume Next
     Dim r As Reference
    For Each r In References
    '  r.Name = "MSComctlLib"
    MsgBox "类库名:" & r.Name & " GUID:" & r.Guid & " 版本" & r.Major & "." & r.Minor, , "信息"
  '  MsgBox "r.Guid:" & r.Guid
        '    MsgBox "类库名:" & r.Name & _
            Chr(13) + Chr(13) + "类库文件绝对路径:" & r.FullPath & _
        Chr(13) + Chr(13) + "是否内建:" & r.BuiltIn & _
        Chr(13) + Chr(13) + "类库版本号Major=" & r.Major & "    Minor=" & r.Minor & _
        Chr(13) + Chr(13) + "r.Guid=" & r.Guid
   Next
End Sub
Private Sub Cmd删除错误引用_Click()
     Dim r As Reference
On Error Resume Next
'
    For Each r In References
'        If err = 48 Then
           If r.IsBroken Then
              
              Application.References.Remove r '如引用已损坏,删除
              MsgBox r.Name & "引用已损坏,已被取消引用。", , ""
           Else
              MsgBox "未发现错误引用", , ""
              Exit For
           End If
'        End If
    Next
End Sub
Private Sub Cmd修复_Click()
   
On Error GoTo Err_Cmd修复_Click
'On Error Resume Next
     Dim r As Reference
'首先检查CTL引用正常否
    Dim bolFindAdo As Boolean
   
  '  取消错误引用(方法一):
'   For Each r In References
'        If r.Name = "MSComctlLib" Or r.Guid = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}" Then
'          If r.IsBroken Then
'             MsgBox "引用已损坏,删除", , ""
'             References.Remove r '如引用已损坏,删除
'          Else
'             bolFindAdo = True
'             MsgBox "不需要修复!", , ""
'             Exit For
'          End If
'       End If
'   Next
   
  '  取消错误引用(方法二):
   
    Set r = Application.References!MSComctlLib
    If r.IsBroken Then
        Application.References.Remove r '如引用已损坏,删除
        MsgBox r.Name & "引用已损坏,已被取消引用。", , ""
    Else
        bolFindAdo = True
        MsgBox "不需要修复!", , ""
    End If
  '修复MSComctlLib引用
    If bolFindAdo = False Then
       MsgBox "还没引用,现在引用MSCOMCTL.OCX控件。"
       Set r = Application.References.AddFromFile("c:\windows\system32\MSCOMCTL.OCX")
       References.AddFromGuid _
       Guid:="{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}", Major:=2, Minor:=1
     '  References.AddFromGuid _
       Guid:="{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}"
    End If
    '下面重新搜索后确认
'   For Each r In References
'        If r.Name = "MSComctlLib" Or r.Guid = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}" Then
           If r.IsBroken Then
              MsgBox "引用失败!请检查是否存在文件C:\Windows\system32\MSCOMCTL.OCX", , ""
           Else
              If bolFindAdo = False Then MsgBox "修复MSCOMCTL.OCX的引用成功!", , ""
             ' bolFindAdo = True
            '  Exit For
           End If
'        End If
'    Next
     
Exit_Cmd修复_Click:
    Exit Sub
Err_Cmd修复_Click:
    MsgBox err.Description & "加载失败,请联系管理员!", vbInformation, "提示"
Resume Exit_Cmd修复_Click
End Sub

发表于 2013-4-3 15:28:21 | 显示全部楼层
楼主的钻研精神值得学习!
发表于 2016-8-2 11:44:15 | 显示全部楼层
感谢楼主大人,问题终于解决
发表于 2017-7-25 10:18:13 | 显示全部楼层
没有树控件实在是不方便,一直被这个问题纠结,非常感谢楼主,我回去试试这个方法

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-3-29 22:47 , Processed in 0.079525 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表