1

我试图简单地将测试宏导入我当前的 Excel 工作簿。然后运行宏。我在 Excel 2007 上。我收到错误:

运行时错误“1004”:

无法运行宏“DoKbTest”。该工作簿中的宏可能不可用,或者所有宏都可能被禁用。

如果我将一行代码更改为:Set oBook = oExcel.Workbooks.Add它工作正常。为什么当我引用 ThisWorkbook 时它会失败?


这是代码:

  Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

      Dim oXL As Excel.Application
      Dim oBook As Excel.Workbook
      Dim oSheet As Excel.Worksheet
      Dim i As Integer, j As Integer
      Dim sMsg As String

    ' Create a new instance of Excel and make it visible.
      Set oXL = GetObject(, "Excel.Application")
      oXL.Visible = True

    ' Add a new workbook and set a reference to Sheet1.
      Set oBook = ThisWorkbook
      oBook.Activate

      Set oSheet = Sheets("Overview")
      oSheet.Activate

      sMsg = "Fill the sheet from in-process"
      MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground

    ' The Import method lets you add modules to VBA at
    ' run time. Change the file path to match the location
    ' of the text file you created in step 3.
      oXL.VBE.ActiveVBProject.VBComponents.Import "C:\Users\jstockdale\Desktop\KbTest.bas"

    ' Now run the macro, passing oSheet as the first parameter
      oXL.Run "DoKbTest", oSheet

    ' You're done with the second test
      MsgBox "Done.", vbMsgBoxSetForeground

    ' Turn instance of Excel over to end user and release
    ' any outstanding object references.
      oXL.UserControl = True
      Set oSheet = Nothing
      Set oBook = Nothing
      Set oXL = Nothing

End Sub

和 .bas 文件

Attribute VB_Name = "KbTest"

   ' Your Microsoft Visual Basic for Applications macro function takes 1 
   ' parameter, the sheet object that you are going to fill.

   Public Sub DoKbTest(oSheetToFill As Object)
      Dim i As Integer, j As Integer
      Dim sMsg As String
      For i = 1 To 100
         For j = 1 To 10

            sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
            oSheetToFill.Cells(i, j).Value = sMsg
         Next j
      Next i
   End Sub
4

3 回答 3

0

如果您的代码独立于“beforesave”事件运行 - 例如作为独立的公共子程序,您的代码将起作用。

于 2013-07-12T13:52:12.317 回答
0

当调用 BeforeSave 事件时,VBA 收集有关环境的所有数据以运行它的子程序。当您通过在事件中添加代码来更改环境时,VBA 不会返回并轮询环境以查看已更改的内容,而是使用它已经知道的内容。

当您将它放在不同的工作簿中时,它会起作用,因为另一个工作簿中的代码不会影响您的工作簿中的代码(除非它们可能被引用)。

您可以尝试使用 OnTime 让 VBA 自行重置。将代码放在标准模块中并使用

oXL.OnTime Now, "DoKbTest"

这将使该宏排队以尽快运行。当 BeforeSave 退出时,DoKbTest 将运行,但它将是独立的,因此 VBA 将重新初始化所有内容。

于 2013-07-12T22:07:23.990 回答
-1

我正在使用 Excel 2013,并且使用您的代码,我实际上得到了一个不同的错误,并且无论我是否添加您的Set oBook = oExcel.Workbooks.Add行,该错误都是一致的:

运行时错误“1004”:对 Visual Basic 项目的编程访问不受信任

这可以通过启用“信任对 VBA 项目对象模型的访问”设置来解决。这是在(再次,在 2013 年):

File 
 - Options 
  -  Trust Center 
   -   Trust Center Settings
    -    Macro Settings.

文档中:

此安全选项使未经授权的程序更难构建可能损害最终用户系统的“自我复制”代码

换句话说,该设置旨在防止蠕虫在用户不知情的情况下将代码添加到工作簿中。

还要验证文档是否位于受信任的位置;有关详细信息,请参见此处

于 2013-07-12T14:25:23.487 回答