Keith™ 发表于 2014-10-8 12:40:39

Excel VBA程序导入程序

我已经搜索过了,但找不到这样做的方法,也许这是做不到的 有没有办法通过编程将excel电子表格代码从另一个电子表格导入VBA IDE 我有500个左右的电子表格需要更新代码,我不想剪切/粘贴到所有500个;我希望有一段代码可以在主文件每次打开时更新它。

RICVBA 发表于 2014-10-8 13:49:12

我似乎记得看到了一些允许你访问VBE代码段的东西,但我也记得一些关于MS锁定它的事情,因为这是virii感染VBA模块的方式之一。

RICVBA 发表于 2014-10-8 13:51:08

我害怕那个,或者类似的事情 我也认为RR在那天做了一些事情,但没有办法找到答案 谢谢Keith

mmelone 发表于 2014-10-9 03:37:52

我知道这是可以做到的。我在此引用几年前遇到的一件事,并将其放在可能的未来,Excel VBA具有VBE对象,其对象层次结构简化版本为:VBE VBProject&nbsp&nbsp VBComponent&nbsp&nbsp&nbsp&nbsp 代码模块&nbsp&nbsp&nbsp&nbsp 设计师&nbsp&nbsp&nbsp&nbsp 属性&nbsp&nbsp 参考VBProject对象应该是您所想要的;我们正在寻找一名开发人员,因为通过这种方式,您也可以编写代码来添加和删除VBA模块或插入VBA代码,但还有一个安全问题,Keith告诉您,VBA宏试图修改VBA项目中的组件时抛出的错误消息取决于Excel“信任中心”对话框中的设置。您可以按如下方式查看和更改此设置:;选择文件->选项;在“Excel选项”对话框中,单击“信任中心”选项卡;在“信任中心”选项卡中,单击“信任中心设置”按钮;在“信任中心”对话框中,单击“宏设置”选项卡,或者,您可以使用开发人员;代码#10140;宏安全命令,直接转到带有标记为“的复选框”的对话框;信任访问VBA项目对象模型“;默认情况下应关闭。即使您选择信任工作簿中包含的宏,如果关闭此设置,宏也无法修改VBA项目。此设置适用于所有工作簿:您可以't仅为特定工作簿更改了它
通过VBA检测此设置是尝试访问VBProject对象,然后检查错误,如通过以下代码所示:
On Error Resume Next
Set x = ActiveWorkbook.VBProject
If Err0 Then
    MsgBox “Your security settings do not allow this macro to run.”
    Exit Sub
End If[
On Error GoTo 0作为创建项目的开发人员,您需要启用对Visual Basic项目设置的信任访问,我认为您可以找到VBComponent对象's“;“导出”&引用;删除“;,和“;“导入”;方法对您的特定需求非常有用
通过他们的方式,您可以向用户分发(或自己使用)一个包含宏的工作簿,该宏替换VBA模块,以使用存储在文件中的更新版本进行更新
希望这能帮助你,再见

mmelone 发表于 2014-10-9 10:34:13

好的,这有助于现在了解如何导入ThisWorkbook 谢谢

RICVBA 发表于 2014-10-9 11:53:42

启动时,每个工作簿都由VBProject对象表示
若要使用早期绑定访问它,请建立对Microsoft Visual Basic for Applications扩展性库的引用。工作簿对象具有返回VBProject对象的VBProject属性
例如Dim VBProj As VBProject
Set VBProj = ActiveWorkbook.VBProject 创建一个对象变量,该变量表示活动工作簿#039;然后您可以访问VBProject'通过VBComponents集合创建组件(用户窗体、模块、类模块和文档模块),如Dim VBC As VBComponent 然后是Set VBC = ThisWorkbook.VBProject.VBComponents(1) 或Set VBC = ThisWorkbook.VBProject.VBComponents(“Module1”) 例如,您可以用类似的方式列出工作簿中的所有模块Sub ListModules()
    Dim VBProj As VBProject
    Dim VBComp As VBComponent
    Dim CodeMod As CodeModule
   
    Dim FirstLine As Long
    Dim mssg As String
   
    ' set active workbook's VB Project
    Set VBProj = ActiveWorkbook.VBProject
   
    ' Loop through its components
    For Each VBComp In VBProj.VBComponents
   
      Set CodeMod = VBComp.CodeModule
      
      FirstLine = CodeMod.CountOfDeclarationLines + 1
      Do Until FirstLine >= CodeMod.CountOfLines
            mssg = mssg & VBComp.Name & ": " & CodeMod.ProcOfLine(FirstLine, vbext_pk_Proc) & vbNewLine
            FirstLine = FirstLine + CodeMod.ProcCountLines(CodeMod.ProcOfLine(FirstLine, vbext_pk_Proc), vbext_pk_Proc)
      Loop
      
    Next VBComp
   
    MsgBox mssg
End Sub 在这里,您还可以看到VBComponent属性的使用;代码模块;以及后一种性质和方法。按F1键可以找到其中的联机帮助

RICVBA 发表于 2014-10-9 14:49:23

谢谢,这应该让我朝着正确的方向开始

RICVBA 发表于 2015-5-4 14:41:53

如果有人正在搜索此表单,寻找如何实现此目的的想法,我将采取以下措施确保每个人都在运行最新的代码(此代码正在Excel中使用)
创建一个简单的Excel加载项,该加载项包含从标准位置(我在共享网络文件夹中)将模块加载到vba的代码 加载项永远不会更改,因此适合每个人加载到Excel副本中 这是我为插件编写的代码 它位于;本手册“;章节:
Private Sub app_WorkbookActivate(ByVal Wb As Workbook)
'Register the ###### Macros
Debug.Print "Registering ###### Macros"
Call RegisterMacros
End Sub
Private Sub Workbook_Open()
On Error Resume Next
Application.EnableEvents = True
Set app = Application
'Remove ######Functions
Set mf = Application.VBE.VBProjects("*your addin name*").VBComponents.Item("*your module file name*")
Application.VBE.VBProjects("*your addin name*").VBComponents.Item("*your module file name*").Name = "*your module file name*remove"
Application.VBE.VBProjects("*your addin name*").VBComponents.Remove mf
'Add ######Functions from network
Application.VBE.VBProjects("*your addin name*").VBComponents.Import "*your file location here\*your module file name*.bas"
End Sub
使用此代码,每当打开Excel时,它都会重命名并删除模块(如果存在) 然后将模块导入VBA app_WorkbookActivate事件调用我模块中的一个函数,该函数注册我用Excel编写的所有宏(因此所有用户定义的函数都存储在“UserFunctions”下,而不是存储在自定义文件夹中)
It'这一切都很简单,但在过去的10年里,它一直对我有效 唯一需要记住的是,如果您对模块进行任何更改并保存,您需要;“出口”;模块 如果你不't、 您保存的更改将; 如果你不't、 下次启动Excel时,您保存的更改将被保存的模块覆盖。
页: [1]
查看完整版本: Excel VBA程序导入程序