【问题标题】:vba run other excel files macrosvba 运行其他excel文件宏
【发布时间】:2018-01-22 12:55:39
【问题描述】:

我有以下代码:

Sub MacroRunner()
Dim Nomefile As String, Nomefolder As String
Nomefolder = ActiveWorkbook.Path

Nomefile = Dir(Nomefolder & "\*.xlsb")
Workbooks.Open (Nomefolder & "\" & Nomefile)
ActiveWorkbook.Worksheets(2).Select
Application.Run "Nomefile!listaIdprodotto"  '<-------- "nomefile" variable not returned

Application.DisplayAlerts = False
ActiveWindow.Close
End Sub

问题在由左箭头标记的行中; Excel 不返回变量值,导致自身无法找到要执行的宏。 感谢您的帮助。

【问题讨论】:

  • 您的代码是否遇到任何错误消息?如果nomefile 为空白,我预计Workbooks.Open (Nomefolder &amp; "\" &amp; Nomefile) 行会失败。

标签: vba excel


【解决方案1】:

你应该有点不同的引用(如果 Nomefile.xlsb 是文件):

Application.Run "'Nomefile.xlsb'!listaIdprodotto" 

甚至(如果Nomefile 是一个变量):

Application.Run "'" & Nomefile & "'!listaIdprodotto"

Source

【讨论】:

    【解决方案2】:

    最好更具体地说明您要处理的文件和工作表。

    Nomefolder = ActiveWorkbook.Path
    这不一定是包含代码的工作簿。如果您在运行代码之前立即创建一个新工作簿,那么这将等于一个空字符串 - 它是当前位于顶部(活动)的任何工作簿。

    Nomefile = Dir(Nomefolder &amp; "\*.xlsb")
    这将返回文件夹中具有xlsb 扩展名的第一个文件。如果没有创建今天的文件,它将返回上一个文件并再次运行昨天的更新。
    如果它是每天生成的文件,则查找具有正确日期的文件名。

    ActiveWorkbook.Worksheets(2).Select
    再次 - ActiveWorkbook 的同样问题。这也正在查看标签顺序中的第二张工作表,如果有人移动它,它可能不是您想要的工作表。按名称引用工作表(仍可更改)。最好通过用户无法更改的工作表 CodeName 进行引用,但这会打开一个不同的蠕虫水壶,因为您引用的工作表不在包含代码的工作簿中。

    Application.Run "Nomefile!listaIdprodotto"
    当您将Nomefile 括在双引号中时,它不会将其视为变量,而是将其视为名为Nomefile 的文件。要将其视为变量,需要将其写为Application.Run Nomefile &amp; "!listaIdprodotto"。如果文件名包含空格,则需要按照 Vityata 所写的方式编写:Application.Run "'" &amp; Nomefile &amp; "'!listaIdprodotto"。这将文件名括在单引号中。

    我将代码重写为:

    Public Sub Test()
    
        Dim Nomefile As String, Nomefolder As String
        Dim wrkBk As Workbook
    
        'Nomefolder = ActiveWorkbook.Path
        Nomefolder = ThisWorkbook.Path
        'Nomefile = Dir(Nomefolder & "\*.xlsb")
        Nomefile = Nomefolder & "\WorkbookWithCode.xlsb"
    
        'Open the workbook, run the code and close the workbook.
        Set wrkBk = Workbooks.Open(Nomefile)
        Application.Run "'" & wrkBk.Name & "'!listaIdprodotto"
        wrkBk.Close
    
    End Sub
    

    这里的主要区别是我将整个工作簿设置为一个变量 - Set wrkBk = ....。从那以后,我总是可以参考正确的工作簿,而不必担心它是否活动

    【讨论】:

    • 您的所有提示都可以正常工作。我知道这是语法问题。谢谢大家帮助我!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多