繁体   English   中英

如何在VBA中打开并激活另一个工作簿?

[英]How to open and activate another workbook in VBA?

我正在创建一个宏,我需要在1个文件中运行它(称为“Masterfile”),它将打开并在另一个文件(“SurveyReport”)上执行宏,然后给我一个消息框说“完成!” 。

当我手动打开该文件并执行它时,我必须在SurveyReport文件上执行的代码工作正常。 我需要从MasterFile打开SurveyReport的代码似乎也正常工作,我运行下面没有任何问题:

    Sub PivotTable()
    '
    ' PivotTable Macro

    Dim MasterFile As String

    MasterFile = ActiveWorkbook.Name

    Dim SurveyReport As String

    SurveyReport = Application.GetOpenFilename("Excel files (*.xlsx), *xlsx", 1, "Please select the Survey Create Report file", , False)

    Workbooks.Open (SurveyReport)


    End Sub

但是,当我尝试激活SurveyReport文件以便我可以开始在其中执行宏时,我收到“下标超出范围”错误。 我已经尝试在上面的块之后和在SurveyReport文件中执行代码之前使用以下代码:

    Windows(SurveyReport).Activate

这不起作用,没有做到:

    ThisWorkbook.Activate

......只有激活MasterFile的效果。

SurveyReport文件是.xlsx文件。 我尝试将其保存为.xls文件并修改代码,但没有快乐。 我也尝试直接传递文件名(即Windows(“filename.xlsx”)。激活),同样的问题。

ActiveWorkbook就像它在锡上所说的那样 - 无论哪个工作簿在代码运行时都是活动的。
ThisWorkbook 始终是代码所在的工作簿。

您可以设置对特定工作簿的引用,而不是每次只使用它们的名称。 一个名字可以改变,或引用错误的对象....想象你有一个叫Darren的朋友。 每次你提到他,你都会提到他的名字。 一个不了解达伦的人并不知道达伦在你所谈论的世界上所有可用的方面。 现在想象一下你的口袋里有一个Darren的复制品......不,这是一个可怕的神学 - 它不会是复制品,它会引用真正的Darren ......无论如何,我离题了。

此代码设置对工作簿的引用,然后您可以在任何时候使用该引用来引用正确的工作簿:

Sub PivotTable()

    Dim MasterFile As Workbook

    Dim SurveyRptName As String
    Dim SurveyReport As Workbook

    Set MasterFile = ThisWorkbook '

    SurveyRptName = Application.GetOpenFilename("Excel files (*.xlsx), *xlsx", 1, _
        "Please select the Survey Create Report file", , False)
    If SurveyRptName <> "False" Then
        Set SurveyReport = Workbooks.Open(SurveyRptName)
    End If

    SurveyReport.Activate 'You don't need this line.  It doesn't matter if
                          'the workbook is active, the code knows which one
                          'you're talking about in the next line.
    MsgBox "This is " & SurveyReport.Name & _
        " containing " & SurveyReport.Worksheets.Count & " sheets." & vbCr & _
        "The value in cell A1 of the first sheet is " & _
            SurveyReport.Worksheets(1).Range("A1")

End Sub  

编辑:当然,如果你在选择一个文件时按下取消,那么IF...THEN代码后面的行将没有工作参考,你将得到一个Object Variable or With block variable not set - 最好不要如果尚未成功打开Survey Report文件,则运行底部的代码。

缺少答案的部分 - 是当他的变量是STRING时,他试图调用一个对象的方法 - 打开命令和后续命令会给你一个OBJECT - 它具有像.Activate这样的属性和方法。 STRING类型没有这样的方法或属性(可以肯定 - 它可能有其他方法)。 Darren提供的解决方案通过将他的SurveyReport声明为类型工作簿(Excel的一个对象)来解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM