【问题标题】:Why can't I define my workbook as an object?为什么我不能将我的工作簿定义为对象?
【发布时间】:2017-01-26 04:57:14
【问题描述】:

为什么我不能通过这两种方式定义工作簿? (我把范围位放在里面只是为了快速测试。)我该如何解决?

这会产生一个"Compile Error: Type Mismatch"

Sub Setwbk()

    Dim wbk As Workbook

    Set wbk = "F:\Quarterly Reports\2012 Reports\New Reports\ _
           Master Benchmark Data Sheet.xlsx"

    Range("A2") = wbk.Name

End Sub

这会创建一个"Runtime Error '91': Object variable or with block variable not set"

Sub Setwbk()

    Dim wbk As Workbook

    wbk = "F:\Quarterly Reports\2012 Reports\New Reports\ _
          Master Benchmark Data Sheet.xlsx"

    Range("A2") = wbk.Name

End Sub

我在这里缺少什么?我已经在 VBA 上苦练了一个月,变得相当老练,但这让我很困惑。我错过了一些基本的东西。
我只想定义一个工作簿,这样我就不必全部输入了!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    这实际上是一个明智的问题。以下是 Excel 2010 帮助中的答案:

    “Workbook 对象是 Workbooks 集合的成员。Workbooks 集合包含当前在 Microsoft Excel 中打开的所有 Workbook 对象。”

    因此,由于该工作簿未打开 - 至少我认为它没有打开 - 它不能设置为工作簿对象。如果它是打开的,您只需将其设置为:

    Set wbk = workbooks("Master Benchmark Data Sheet.xlsx")
    

    【讨论】:

    • 而@Gaffi 给出了答案的其余部分,也是最相关的部分。
    • 我明白了。我必须打开它。我省略了“工作簿”位。我还需要“设置”它。为什么我必须“设置”它? (我想我应该问为什么我还必须“设置”一个范围?)我只是想理解这种语言。是因为它们是对象而不是对象的属性吗?非常感谢!
    • @user1408660 Set 是 VBA 分配 object 变量的方式。由于RangeWorkbook/Worksheet对象,因此您必须将Set 与这些对象一起使用。换句话说,你的假设是正确的!
    • + 1 很好地解释了它:)
    【解决方案2】:

    您需要打开工作簿才能引用它。

    Sub Setwbk()
    
        Dim wbk As Workbook
    
        Set wbk = Workbooks.Open("F:\Quarterly Reports\2012 Reports\New Reports\ _
            Master Benchmark Data Sheet.xlsx")
    
    End Sub
    

    * 如果工作簿已打开,请关注 Doug's answer。为了使这个答案尽可能完整,我在他的回答中加入了我的评论:

    为什么我必须“设置”它?

    Set 是 VBA 分配 object 变量的方式。由于RangeWorkbook/Worksheet对象,因此您必须将Set 与这些对象一起使用。

    【讨论】:

    • 我在上面发布了另一个 q 给 doug glancy。非常感谢您的快速回答!
    猜你喜欢
    • 2021-03-06
    • 2020-05-11
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多