VBA:方法“;“移动”;“对象的定义”;“工作表”;失败

VBA:方法“;“移动”;“对象的定义”;“工作表”;失败,vba,excel,Vba,Excel,我用VBA编写了一个简单的模块,当将其保存为宏时效果很好,但当我将其保存为外接程序并运行时,它的行为很奇怪。 它给出错误:对象“表”的方法“移动”失败 然后打开1号文件中的图纸(代码中x=1) 谢谢大家的帮助。我没有尝试过用另一个系统来检查我的MS Excel中的安全问题,但我没有锁定代码或工作表密码 代码: Sub-opensheets() Dim openfiles 作为整数的Dim x 关于错误转到错误处理程序 Application.ScreenUpdating=False openfi

我用VBA编写了一个简单的模块,当将其保存为宏时效果很好,但当我将其保存为外接程序并运行时,它的行为很奇怪。 它给出错误:对象“表”的方法“移动”失败 然后打开1号文件中的图纸(代码中x=1)

谢谢大家的帮助。我没有尝试过用另一个系统来检查我的MS Excel中的安全问题,但我没有锁定代码或工作表密码

代码:

Sub-opensheets()
Dim openfiles
作为整数的Dim x
关于错误转到错误处理程序
Application.ScreenUpdating=False
openfiles=Application.GetOpenFilename_
(文件过滤器:=“Microsoft Excel文件(*.xls;*.xlsx),*.xls;*.xlsx”_
MultiSelect:=真,标题:=“选择Excel文件!”)
如果TypeName(openfiles)=“Boolean”,则
MsgBox“您至少需要选择一个文件”
去出口
如果结束
x=1

如果您试图从另一本书中获取所有工作表,并将它们移动到当前工作簿(包含代码的工作簿)的末尾,那么这对我来说是有效的:

...
While x <= UBound(openfiles)
    Dim wb as Workbook
    Set wb = Workbooks.Open(Filename:=openfiles(x))
    wb.Sheets().Move After:=ThisWorkbook.Sheets _
      (ThisWorkbook.Sheets.Count)
    x = x + 1
Wend
...
。。。

如果代码在外接程序中运行,
ThisWorkbook
引用外接程序。相反,您可能希望显式地引用刚刚打开的工作簿。可能是这样的:

Dim wkb As Workbook

While x <= UBound(openfiles)
    Set wkb = Workbooks.Open(Filename:=openfiles(x))
    Sheets().Move After:=wkb.Sheets(wkb.Sheets.Count)
    x = x + 1
Wend
Dim wkb作为工作簿

x时,是否要将所有工作表从打开的工作簿移动到当前工作簿?编写代码时,需要在代码中明确说明源工作簿和目标工作簿。到目前为止,它看起来并不干净。它作为宏而不是外接程序工作的事实很奇怪。当您将其作为宏运行时,它仍然在模块中还是在工作表或工作簿对象中?您是否尝试过激活工作表或将工作簿分配给工作簿变量?您好,代码不平衡,工作正常,但我也很惊讶,为什么它在保存为加载项时出错,而作为宏工作正常。也许我犯了一个愚蠢的错误。我将其保存为宏启用工作簿中的宏,同时将其用作宏。上面的代码作为宏可以正常工作,但保存为加载项时会出错。如果有人能将其另存为加载项并检查是否仍然发生错误,那就太好了。在这种情况下,请参阅上面的@Joe的答案,因为您希望在同一工作簿中移动工作表,而不是从一个工作簿移动到另一个工作簿:
。。。虽然我刚刚运行了x,但我的Excel 2010中没有任何问题。尝试关闭并重新打开Excel。警告:您正在将图纸移动到位,因为您正在选择所有图纸并在最后一张图纸之后移动它们,所以请尝试只移动一张图纸。尝试使用
wb.Sheets(1)。移动后:=wb.Sheets(wb.Sheets.Count)
。感谢您的回复,因为Joe说Addin被称为此工作簿,所以我声明了一个变量,但它仅打开一个文件的工作表。我正在尝试将其他文件工作表打开到当前文件中。将crntfile设置为工作簿集crntfile=ActiveWorkbook,而x则将
Dim wa设置为工作簿集wa=Application.ActiveWorkbook
放在循环前,将wb.Worksheets()放在循环后复制:=wa.Sheets(wa.Sheets.Count)
并确保启动时只有当前电子表格打开了加载项。以上是我的发言。您是对的。此工作簿指的是加载项。上面的代码将单独打开所有新文件,但我希望将文件中的所有图纸都放在当前文件中。有什么建议吗。对不起,我是VBA的初学者。
Dim wkb As Workbook

While x <= UBound(openfiles)
    Set wkb = Workbooks.Open(Filename:=openfiles(x))
    Sheets().Move After:=wkb.Sheets(wkb.Sheets.Count)
    x = x + 1
Wend