|
本帖最后由 lolmuta 于 2014-2-15 15:05 编辑
可否给个附件,这个控件花了我不少时间,还是叫不出来...
列表视图是来自于这个档案MSCOMCTL.OCX对吧...
不过,想要每台电脑都可以跑,
最简单的就是不要使用“高级”的东西。
但若你非常想要用这个附件,可能的解法。我这一块其实也不是很了解,请高手指正错误
附上MSCOMCTL.OCX这个档案,
程式自动引用并非万能...
我有遇到怎麼樣都引不了的情況,也有遇到引用的不同的東西,卻都可以用的怪現象(ieExploree就是個例子),我覺得這塊很少人有說,也沒有什麼規範,特別是不斷的更新的情況下,今天引用這個,明天可能又改版了,
如果是手動引用,上面那種問題,會降低許多,像引用outlook,手動引用會自動判斷版本(其實所謂的自動應該是去註冊表查,然後引用對的版本),但若是自動引用,就沒那麼簡單了
而且要是引用到錯誤的檔案,但是vba又認定成功,程式是不會說你引錯了,當你打開引用列表發現你都有引用啊…然後就不知道該怎麼辦…因为错的不是VBA的错了,而是错在引用的档案里面的东西有问题
其实只要先移除再引用就可以了,不过要引用到对的
所以目前我们的程式就是先看看有没有,有的话,先删除,然后在自动引用
执行以下程式时,你要巨集安全性,信任存取VBA专案物件模型。这句话说白点,就是取得控制VBA编辑器的控制权,
有了控制權,你在編輯器所作的許多事情,其實都是可以用程式來完成的,甚至可以自動寫code,當然就包括引用了。
还要手动引用一个东西
Microsoft Visual Basic的应用程序扩展5.3 ......这个里面有许多可控制编辑器的方法
然后一开始,先取得,要先取得引用的名称。
在跑之前请先不要引用那个listview的物件
请先跑这一段- Private Sub listReference()
- Dim VBAEditor As VBIDE.VBE
- Dim vbProj As VBIDE.VBProject
- Dim chkRef As Reference
-
- Set VBAEditor = Application.VBE
- Set vbProj = Me.VBProject
- Dim BoolExists As Boolean
- For Each chkRef In vbProj.References
- Debug.Print chkRef.Name
- Next
- Set vbProj = Nothing
- Set VBAEditor = Nothing
- End Sub
复制代码 結果如下:
VBA-
Excel
stdole
Office
MSForms
VBIDE
这先就是你程式一开始引用的东西,不过缩成简短的名称
然后引用listview的那个东西
VBA
Excel
stdole
Office
MSForms
VBIDE
MSComctlLib
发现多了一个东西,就叫mscomctllib这个名字要记起来。
就可以寫下下面这些代码了, 我只寫出最核心的部份(写在的ThisWorkbook中),詳細代碼請看附件
- Private Const listviewFileName As String = "/mscomctl.ocx"
- Sub Ini()
- Dim VBAEditor As VBIDE.VBE
- Dim vbProj As VBIDE.VBProject
- Dim chkRef As Reference
- Dim BoolExists As Boolean
- Set VBAEditor = Application.VBE
- Set vbProj = ActiveWorkbook.VBProject
- If ReferenceExist("MSComctlLib") Then
- RemoveReference "MSComctlLib"
- End If
- vbProj.References.AddFromFile Me.Path & listviewFileName
- Set vbProj = Nothing
- Set VBAEditor = Nothing
- End Sub
复制代码 確定ini()可以跑後,只要再加上- Private Sub Workbook_Open()
- ini
- End Sub
复制代码 就会在开启时,自动引用那个东西了。
最后,還是少引用一些怪怪的东西...
|
|