尝试动态创建新模块时Excel删除了附件

时间:2012-02-14 19:37:35

标签: excel-vba vba excel

我有一个小VBA模块,我从一个工作簿调用来更新给定文件夹中的所有Excel工作簿。通过更新我的意思是它复制一个名为GetActiveXControlValues的模块,然后在该文件夹中的每个工作簿上运行此宏。现在当我在我的机器上运行时,一切正常。当我的同事使用相同的文件运行相同的代码时,他们在复制模块后会感到意外。当您查看应该具有名为“GetActiveXControlValues”的新模块的工作簿时,相反,该名称没有模块,而是称为“Module1”。此外,当您查看新模块时,它会以红色显示“已删除附件”。我检查过,我的同事在Excel 2010中拥有与我相同的安全设置。

我启用了所有宏和信任VBA项目对象模型。我提示我启用所有ActiveX控件。我取消选中了“禁用受信任的文档”以及“受保护的视图”选项卡上的所有框。有人以前见过这个或者知道我可以尝试排除故障吗?

示例代码:

Sub CopyModuleAndExecuteIt()
    Dim wb As Workbook
    Dim sFile As String
    Dim sPath As String
    Dim sFullMacroName As String

    SetFolder

    sPath = sExcelFolder
    ChDir sPath
    sFile = Dir("*.xls") ' File Naming Convention

    Do While sFile <> "" ' Start of LOOP

        ' Open each Excel File in the specified folder
        Set wb = Workbooks.Open(sPath & "\" & sFile) ' SET BP HERE!
        Sleep (1000)

        ' Unprotect the Documents using SendKeys Hack
        UnprotectVBADocument

        ' Import the GetActiveXControlValues Module into the Workbook
        wb.VBProject.VBComponents.Import ("D:\GetActiveXControlValues.bas") ' SET BP HERE!

        sFullMacroName = "'" & wb.Name & "'" & "!" & wb.VBProject.VBComponents.Item("GetActiveXControlValues").Name & ".GetActiveXControlValues"

        ' Run the GetActiveXControlValues Macro
        Application.Run (sFullMacroName)

        ' Close the Workbook Saving Changes
        wb.Close True
        sFile = Dir
    Loop ' End of LOOP
End Sub

2 个答案:

答案 0 :(得分:0)

如果您的同事在Excel 2010中具有与您相同的安全设置,那么我想到的下一件事就是“防火墙”。检查他的防火墙设置。

答案 1 :(得分:0)

我正在努力创建一个 AddIn 通过 VBA 代码,当我保存它时,我在Excel工作表中编写代码,我保存为这样的文本:

Attribute VB_Name = "Module_Name"

你必须确定 .bas 文件实际上是纯文本。

我正在使用 VBA 代码创建 AddIn ,我在保存时将代码写入Excel工作表中,我保存为如下文本:

Sub Superheroes()

Dim sBeg as string, sEnd as String, sCatwoman as String, sAntMan as String
Dim vCode As Variant

'' Here is where i put the name i want to call my module
sBeg = "Attribute VB_Name = ""VBA_BasFile""" + vbCrLf + _
        "Private Function fMix(sAnimal as String)as String "

sCatwoman = "Select case sAnimal"+ vbCrLf+ vbTab+"case ""cat"""+ _
            vbCrLf+ vbTab+ "fMix = ""Catwoman"""

sAntMan = vbCrLf+ vbTab+"case ""Ant"""+ vbCrLf+ vbTab+ "fMix = ""AntMan"""+ _
          vbCrLf+ "End Select"

sEnd = vbCrLf+ "End Sub"

vCode = Array(sBeg, sCatwoman, sAntMan, sEnd)

Workbooks.add

Range("A1").Resize(UBound(vCode) + 1, 1) = Application.Transpose(vCode)

With ActiveWorkbook
    .SaveAs path + "VBA_BasFile.bas", xlTextPrinter
    .Close False
End With

End Sub

当我导入到另一个Excel工作簿时,我可以调用 VBA_BasFile 中的任何过程或函数。