| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2164 人关注过本帖
标题:问一个VB6生成VBA的问题
只看楼主 加入收藏
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
结帖率:95.56%
收藏
已结贴  问题点数:20 回复次数:6 
问一个VB6生成VBA的问题
十多年前曾写过一只程式,用VB6读取EXCEL内数据资料,经整理汇总后吐出一个新的EXCEL档案,
且连宏和EXCEL内的按钮都能附上。 (EXCEL图表功能强大)

网搜关键字 : 用程式寫程式 (VBProject / VBComponents)

最近又有个类似需求,但是因为太久没用,不知道为何无法运行。
xlBook的Struct下VBProject出现 "不信任以程式设计方式存取 Visual Basic 专案"
这个要怎么让它变信任?
搜索更多相关主题的帖子: VB6 程式 生成 EXCEL VBA 
2022-01-18 17:20
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
找到原因了,太久没用EXCEL了。只是那个信任选项能否用程式进行勾选?

不要投我
2022-01-18 17:46
约定的童话
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:56
帖 子:246
专家分:1442
注 册:2021-8-1
收藏
得分:20 
回复 2楼 yz1025
目前来看没法实现...
2022-01-18 18:04
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
虽然无法用程式变更信任度,但是可以用程式判断EXCEL是否允许使用宏。
再让使用者手动去开启信任,以便程式的运行。
程序代码:
If isConf(xlapp) = False Then                               '测试是否信任存取VB专案
        'i = xlapp.VBE
        MsgBox "请手动修改EXCEL巨集安全性层级为低 !"
        MsgBox "请手动选取EXCEL [信任存取 Visual Basic 专案] 核取方块 !"

        '以下两行现在还能不能用就不清楚了,有心人可以试试
'        xlapp.SendKeys "%q%tmss{tab}l~"                             '设定巨集安全层级为低
'        xlapp.SendKeys "%q%tmst{tab}{tab}v~"                        '设定EXCEL信任存取VB专案
Else
......
......
Exit Function

Public Function isConf(xlapp As Object) As Boolean

Dim myProject As Variant, comp As Variant
Dim code As Integer, Description As String

 
On Error GoTo ErrorHandling
    
    Set myProject = xlapp.VBE.ActiveVBProject '不信任的话用xlapp.VBE应该意思也一样
    On Error GoTo 0
    isConf = True
    If myProject Is Nothing Then
        isConf = False
    End If

 
Exit Function

ErrorHandling:
    code = Err.Number
    Description = Err.Description
'    MsgBox "isConf" & " " & code & " " & Description 'Description => 就会显示不信任了
    Resume Next
End Function


[此贴子已经被作者于2022-1-19 08:38编辑过]


不要投我
2022-01-19 08:37
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏(1)
得分:0 
参考VFP代码,可改VB代码
程序代码:
** vba宏代码
TEXT TO vbaCode TEXTMERGE NOSHOW PRETEXT 7
    sub test2()
        for i = 1 to 10
            for j = 1 to 10
                cells(i,j).value = i*j
            next
        next
    end sub
ENDTEXT

oExcel = CREATEOBJECT("Excel.Application")
oExcel.DisplayAlerts = 0

** 修改注册表,开启“信任对VBA工程对象模型的访问”
regKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\"+oExcel.Version+"\Excel\Security\AccessVBOM"
se = CREATEOBJECT("WScript.Shell")
se.RegWrite(regKey, 1, "REG_DWORD")

oExcel.WorkBooks.Add
** 添加新模块
myModule = oExcel.ActiveWorkbook.VBProject.VBComponents.Add(1)
** 写入宏代码
myModule.CodeModule.AddFromString(vbaCode)
** 运行宏代码
oExcel.Run("test2")
** 清除宏代码
oExcel.ActiveWorkbook.VBProject.VBComponents.Remove(myModule)
** 修改注册表,关闭“信任对VBA工程对象模型的访问”
se.RegWrite(regKey, 0, "REG_DWORD")

2022-01-19 10:09
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
回复 5楼 吹水佬
哈,都一样,VB6或VFP呼叫VBA的指令都一样。

再透漏一个方法 :
xlapp.VBE.ActiveVBProject.VBComponents.Import App.Path & "\mdlVBACode.bas"  '汇入空白模组到EXCEL内
xlapp.VBE.ActiveVBProject.VBComponents.Import App.Path & "\Data.cls"        '汇入空白类别到EXCEL内

'依据Sname的号码将代码写入到EXCEL档案内的ThisWookbook或Sheet或模块或类别里
xlBook.VBProject.VBComponents(Sname).CodeModule.AddFromString(...)    '... => 就是整页的代码了

当然EXCEL内能使用的按钮或其他控制项,也都能由外部VB6替EXCEL生成,在连动VBA变化资料,产生图表或其他需求的功能。

不要投我
2022-01-19 12:30
yz1025
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:491
专家分:919
注 册:2012-10-26
收藏
得分:0 
说这么多,其实还有另一个方法可以替代,就是设计EXCEL范本,
所有EXCEL宏代码都写好,新增EXCEL时用范本(.xlt)去产生新(.xls)会比较简单,
只是比较死板,要看需求了。

不要投我
2022-01-19 12:41
快速回复:问一个VB6生成VBA的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031427 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved