在Excel VBA中是否可以在另一个模块中更改模块的源代码
我有一个Excel .xlam文件,在function区中添加一个button来执行以下操作:
- 扫描ActiveSheet的一些预设参数
- 取我的源文本(一个string值,直接在VBA模块中硬编码),并用步骤1中检索的参数replace指定的区域
- 生成一个包含计算文本的文件
我这样保存源文本,因为它可以被密码保护,我不需要在.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
版本(第二个链接), encrypt
和decrypt
将是相同的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 结束小组