gpt4 book ai didi

vba - ThisWorkbook 不工作

转载 作者:行者123 更新时间:2023-12-04 21:55:10 24 4
gpt4 key购买 nike

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

我收到了一份带有订单的每周报告,并使用 VBA 将其格式化为 Oracle 格式,以便在无需用户干预的情况下上传。我正在打开模板文件 (PRIMARY TEMPLATE - Desert Storm.xlsx) 并将其粘贴到每周不同名称的报告中 (ThisWorkbook)。

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

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

最佳答案

(relevant to OP's revision 1)

Dim tmplt As Workbook

那是声明 Workbook多变的。
tmplt.ActiveSheet.Copy After:=.Sheets("INVOICE DETAILS")

那是引用 tmplt对象,仍然未分配,即它的引用是 Nothing : 你不能在 Nothing 上调用成员,因此,对象引用不是 Set -> 运行时错误 91。
Set tmplt = {something} ,或找出您需要处理的内容。您的帖子中没有足够的信息让我们准确猜测您的意思。您的意思是使用 wb而不是 tmplt ?如果是,则替换 tmplt.ActiveSheetwb.ActiveSheet .如果您打算从 ThisWorkbook 复制,然后执行 .ActiveSheet .

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

(relevant to OP's revision 2)
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 .甚至没有资格 ActiveSheetWorkbook对象 - 只是不要使用 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
ActiveSheet.Paste不返回任何东西,那里不合法。

关于vba - ThisWorkbook 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46412904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com