使用ThisWorkbook不起作用

时间:2017-09-25 19:36:37

标签: vba excel-vba excel-2016 excel

此脚本曾用于在Office 2010中工作,但自从我们升级到2016年后,它不再有效。我一直在玩代码没有解决方案。请帮忙! :)

我收到订单时收到的每周报告,并使用VBA将其格式化为Oracle格式,无需用户干预即可上传。我打开模板文件(PRIMARY TEMPLATE - Desert Storm.xlsx)并将其粘贴到每周不同命名的报告中(ThisWorkbook)。

运行时错误91:对象变量或未设置块

Sub templateOracleLoader()
    'Customer # Invoice Number  Sale Date   Prod. Name  Price   Sales Units Total   UPC number  Oracle Code Customer name (j)   PO# (k)
    'OPEN TEMPLATE
    Application.AskToUpdateLinks = False
    Application.DisplayAlerts = False
    Dim sPath As String, sFile As String
    Dim wb As Workbook
    sPath = "C:\Users\douglas.futato\Desktop\"
    sFile = sPath & "PRIMARY TEMPLATE - Desert Storm.xlsx"
    Set wb = Workbooks.Open(sFile)
    'COPY TEMPLATE PASTE IN BBU DOC
    Dim tmplt As Workbook
    Set tmplt = Workbooks("PRIMARY TEMPLATE - Desert Storm.xlsx")
    With ThisWorkbook
        tmplt.ActiveSheet.Copy After:=ActiveSheet.paste
    End With
    'CLOSE TEMPLATE
    Windows("PRIMARY TEMPLATE - Desert Storm.xlsx").Activate
    ActiveWindow.Close False
End Sub

1 个答案:

答案 0 :(得分:3)

(relevant to OP's revision 1)

Dim tmplt As Workbook

那是宣告Workbook变量。

tmplt.ActiveSheet.Copy After:=.Sheets("INVOICE DETAILS")

那引用了tmplt对象,它仍然是未分配的,即它的引用是Nothing:你不能在Nothing上调用成员,因此,对象引用不是{{1 } - >运行时错误91。

Set,或找出您需要使用的内容。您的帖子中没有足够的信息让我们准确猜出您的意思。您的意思是使用Set tmplt = {something}代替wb吗?如果是,请将tmplt替换为tmplt.ActiveSheet。如果您打算从wb.ActiveSheet复制,请执行ThisWorkbook

注意,我很确定你不能在不“活跃”的工作簿上使用.ActiveSheet。更喜欢使用ActiveSheet个对象而不是Worksheet个东西。

(relevant to OP's revision 2)

.Activate

这里有几件事。您想要关闭Dim tmplt As Workbook Set tmplt = Workbooks("PRIMARY TEMPLATE - Desert Storm.xlsx") With ThisWorkbook tmplt.ActiveSheet.Copy After:=ActiveSheet.paste End With 'CLOSE TEMPLATE Windows("PRIMARY TEMPLATE - Desert Storm.xlsx").Activate ActiveWindow.Close False ,而不是Workbook。删掉那部分:

Window

并将其替换为:

Windows("PRIMARY TEMPLATE - Desert Storm.xlsx").Activate
ActiveWindow.Close False

现在,tmplt.Close SaveChanges:=False 问题。不要使用ActiveSheet。甚至不能使用ActiveSheet对象限定ActiveSheet - 只是不要使用Workbook。您刚刚打开的工作簿的活动工作表是在上次关闭/保存工作簿时工作表恰好处于“活动状态”:您无法保证您正在使用所需的工作表。

使用ActiveSheet对象,然后获取所需的工作表 - 明确地:

Worksheet

现在你对你想要的Dim source As Worksheet Dim sh As Worksheet For Each sh In tmplt.Worksheets If sh.CodeName = "Source" Then ' users can't easily tamper with CodeName. Set source = sh Exit For End If Next 知道有一个坚如磐石的引用(您可以通过索引或名称来获取它,但用户通常可以轻松地重新排序工作表,或重命名标签,阻止你的努力),使用它:

Worksheet

注意,您应该执行相同的练习来确定目的地/ source.Copy After:=ThisWorkbook.ActiveSheet 参数。

另请注意:

After

tmplt.ActiveSheet.Copy After:=ActiveSheet.paste 不返回任何内容,在那里不合法。