此脚本曾用于在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
答案 0 :(得分:3)
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
个东西。
.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
不返回任何内容,在那里不合法。