Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 从文本文件导入并运行宏_Vba_Excel_Excel 2007 - Fatal编程技术网

Vba 从文本文件导入并运行宏

Vba 从文本文件导入并运行宏,vba,excel,excel-2007,Vba,Excel,Excel 2007,我试图简单地将一个测试宏导入到我当前的Excel工作簿中。然后运行宏。我用的是Excel 2007。我得到了一个错误: 运行时错误“1004”: 无法运行宏“DoKbTest”。宏可能 此工作簿中不可用,或者所有宏都可能被禁用 如果我将一行代码改为:Set oBook=oExcel.Workbooks.Add,它就可以正常工作。为什么在我参考此工作簿时失败 代码如下: Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Can

我试图简单地将一个测试宏导入到我当前的Excel工作簿中。然后运行宏。我用的是Excel 2007。我得到了一个错误:

运行时错误“1004”:

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

如果我将一行代码改为:Set oBook=oExcel.Workbooks.Add,它就可以正常工作。为什么在我参考此工作簿时失败

代码如下:

  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

如果您独立于beforesave事件运行代码(例如,作为独立的公共子项运行),则代码将正常工作。

我使用的是Excel 2013,而您的代码实际会出现不同的错误,并且无论我是否添加您的集合oBook=oExcel.Workbooks.add行,错误都是一致的:

运行时错误“1004”:无法对Visual Basic项目进行编程访问 不可信

通过启用“对VBA项目对象模型的信任访问”设置,可以修复此问题。2013年,这又一次被纳入:

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

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

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


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

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

当您将它放在其他工作簿中时,它会起作用,因为其他工作簿中的代码不会影响工作簿中的代码,除非它们被引用

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

oXL.OnTime Now, "DoKbTest"

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

我实际上已经检查了对VBA项目对象模型的信任访问权限。您的.bas文件是否位于受信任的位置?它在我的桌面上。这是可信的吗?不是默认的;它位于信任中心下,与上面的路径类似。有关详细信息,请参阅。如果您在查找它时遇到困难,按下“保存”按钮时,我将如何调用它?我在一个公共子系统中将它分离出来,然后调用Import_VB,仍然是相同的错误。对,我做了相同的操作-可能会告诉你对不起。我只是觉得你不能把beforesave事件和添加代码模块的操作混为一谈。我只是做了一个按钮并从click事件调用了Sub,它给了我同样的错误。我在重新启动计算机后再次尝试了完全相同的设置,结果成功了。从BeforeSave事件调用时!我真的很困惑。