在Excel VBA中是否可以在另一个模块中更改模块的源代码

我有一个Excel .xlam文件,在function区中添加一个button来执行以下操作:

  1. 扫描ActiveSheet的一些预设参数
  2. 取我的源文本(一个string值,直接在VBA模块中硬编码),并用步骤1中检索的参数replace指定的区域
  3. 生成一个包含计算文本的文件

我这样保存源文本,因为它可以被密码保护,我不需要在.xlam文件的任何地方拖动另一个文件。 源文本保存在一个名为“源”的单独模块,看起来像这样(感谢VBA没有Heredocs):

'Source Module Public Function GetSource() As String Dim s As String s = "" s = s & "This is the first line of my source text" & vbCrLf s = s & "This is a parameter {par1}" & vbCrLf s = s & "This is another line" & vbCrLf GetSource = s End Function 

该function正常工作。 我的问题是如果我想更新源文本,我现在必须在.xlam文件中手动执行。 我想要做的就是在另一个模块中构build一个Sub ImportSource() ,它将parsing某个文件,以编程方式重build“Source”模块,然后用我的计算源代码replace该模块。 我不知道的是如何/如何用stringvariables中的某个值replace模块的源代码。

这就像元编程最糟糕的和哲学上的我反对做到我的核心。 但是,实际上,我想知道是否以及如何去做。

我现在意识到,你真正想做的是以一种VBA可访问的方式在你的文档中存储一些值,但这对电子表格的用户是不可读的。 查尔斯·威廉姆斯的build议,以存储在工作表中命名的范围内的值,并解决您的问题,你不希望用户有权访问的值,你将不得不encryptionstring…

在这篇文章中描述了“正确的方式”,但是这是相当多的工作。

在这里find一个更短的程序。 它只是使用一个硬编码密钥进行简单的XORencryption – 但对于“大多数目的”而言,这应该足够了。 关键将被“隐藏”在你的macros中,因此不能被窥探(好,不容易)。

现在你可以使用这个函数,我们称它为encrypt(string) ,把你的string转换成电子表格中的一个值:

 range("mySecretCell").value = encrypt("The lazy dog jumped over the fox") 

当你需要使用它时,你可以使用它

 Public Function GetSource() GetSource = decrypt(Range("mySecretCell").value) End Function 

如果您使用XOR版本(第二个链接), encryptdecrypt将是相同的function…

这是否能更好地满足您的需求?

您可以以编程方式“导出”和“导入”.bas文件。 要做你所问的,那就必须是这个方法。 我不相信有可能修改内存中的代码。 看到这篇文章

正如@brettdj已经指出,他的链接到cpearson.com/excel/vbe.aspx ,你可以使用VBA扩展性库以编程方式更改为VBA模块的代码! 要使用它,请在VBA编辑器工具 – > 参考中select库。 请注意,您还需要更改信任中心中的选项,然后select: Excel选项 – > 信任中心 – > 信任中心设置 – > macros设置 – > 信任对VBA项目对象模型的访问

然后像下面的代码应该做的工作:

私人mCodeMod作为VBIDE.CodeModule

 Sub UpdateModule()
     Const cStrModuleName As String =“Source”

     Dim VBProj As VBIDE.VBProject
     Dim VBComp As VBIDE.VBComponent

    设置VBProj =工作簿(“___ YourWorkbook __”)。VBProject

     '删除模块
     VBProj.VBComponents.Remove VBProj.VBComponents(cStrModuleName)

     '添加模块
    设置VBComp = VBProj.VBComponents.Add(vbext_ct_StdModule)
     VBComp.Name = cStrModuleName
    设置mCodeMod = VBComp.CodeModule

     '添加程序头并开始
     InsertLine“公共函数GetSource()作为string”
     InsertLine“Dim s As String”,1
     InsertLine“”

     '添加文字
     InsertText ThisWorkbook.Worksheets(“Sourcetext”)_
         .Range( “___ YourRange___”)

    完成程序
     InsertLine“GetSource = s”,1
     InsertLine“结束函数”

结束小组

 Private Sub InsertLine(strLine As String,_
    可选IndentationLevel As Integer = 0)
     mCodeMod.InsertLines _
         mCodeMod.CountOfLines + 1,_
        空间(IndentationLevel * 4)和strLine
结束小组

 Private Sub InsertText(rngSource As Range)
    昏暗的范围
     Dim strCell As String,strText As String
    昏暗我作为整数

     Const cLineLength = 60
     rngSource.Cells中的每个rng
         strCell = rng.Value
        对于i = 0到Len(strCell)\ cLineLength
             strText = Mid(strCell,i * cLineLength,cLineLength)
             strText =replace(strText,“”“,”“”“”“”)
             InsertLine“s = s&”“”&strText&“”“”,1
        接下来我
    下一个rng
结束小组