我正在尝试将测试宏导入到当前的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
答案 0 :(得分:0)
如果您独立于“beforesave”事件运行代码,则代码将起作用 - 例如,作为独立的公共子代。
答案 1 :(得分:0)
调用BeforeSave事件时,VBA会收集有关环境的所有数据以运行它的subs。当您通过在事件中添加代码来更改环境时,VBA不会返回并轮询环境以查看更改的内容,它使用已知的内容。
当您将其放在不同的工作簿中时,它可以正常工作,因为另一个工作簿中的代码不会影响工作簿中的代码(除非它们可能被引用)。
您可以尝试使用OnTime让VBA重置自己。将代码放在标准模块中并使用
oXL.OnTime Now, "DoKbTest"
这将排队该宏以尽快运行。当BeforeSave退出时,DoKbTest将运行,但它将是独立的,因此VBA将重新初始化所有内容。
答案 2 :(得分:-1)
我正在使用Excel 2013,并且使用您的代码我实际上会收到不同的错误,无论是否添加Set oBook = oExcel.Workbooks.Add
行,错误都是一致的:
运行时错误'1004':对Visual Basic Project的编程访问是 不信任
通过启用“信任访问VBA项目对象模型”设置来解决此问题。这是(再次,在2013年):
File
- Options
- Trust Center
- Trust Center Settings
- Macro Settings.
此安全选项使未经授权的程序更加困难 构建可能损害最终用户系统的“自我复制”代码
换句话说,该设置旨在防止蠕虫在用户不知情的情况下将代码添加到工作簿中。
同时验证文档是否位于受信任位置;有关详细信息,请参阅here。