【问题标题】:Subscript out of range -- Unable to set open workbook as active workbook下标超出范围 - 无法将打开的工作簿设置为活动工作簿
【发布时间】:2018-09-13 20:34:22
【问题描述】:

我正在尝试从 Results 工作表中复制两个单元格 B2 & C2 到文件夹中的每个工作簿上,然后将单元格粘贴到主工作簿中,从单元格 A1, A2, A3 etc 开始

我收到错误 Subscript out of range,它没有突出显示任何具体内容,但我假设这是因为运行宏的工作簿没有 'Results' 工作表。

它正在打开正确的工作簿Workbooks.Open (Filepath & MyFile),但我似乎无法将新打开的工作簿设置为要从中复制然后关闭的 ActiveWorkbook。

谢谢

    Sub LoopThroughDirectory()

Dim MyFile As String
Dim WorkbookCounter As Long
WorkbookCounter = 1
Dim Filepath As String
Dim wb As Workbook

Filepath = "C:\Test\"

Application.ScreenUpdating = False
MyFile = Dir(Filepath)

'Opens workbooks located C:\Test\ in order
Do While Len(MyFile) > 0
Set wb = Workbooks.Open(Filepath & MyFile)

'Copy cells B2 & C2 from the results worksheet
wb.Worksheets("Results").Range("B2:C2").Copy
Application.DisplayAlerts = False

'Paste cells B2 & C2 to A1
Sheets(WorkbookCounter).Select
ActiveSheet.Paste Destination:=Worksheets(WorkbookCounter).Range("A1")
wb.Close SaveChanges:=False

Application.CutCopyMode = False
WorkbookCounter = WorkbookCounter + 1
If WorkbookCounter > 1000 Then
Exit Sub
End If

MyFile = Dir
Loop
ActiveWorkbook.Save
Application.ScreenUpdating = True

End Sub

【问题讨论】:

标签: vba excel


【解决方案1】:

Workbooks.Open 是一个函数,它返回对已打开的 Workbook 对象的引用 - 而您正在丢弃它。

声明一个Workbook 变量。

Dim wb As Workbook

然后将其分配给Workbooks.Open 调用的结果:

Set wb = Workbooks.Open(Filepath & MyFile)

现在wb 是您使用的工作簿对象 - 无论它是否处于活动状态,都不再重要了。

wb.Worksheets("Results").Range("B2:C2").Copy

'NOTE: paste to destination BEFORE closing the workbook

wb.Close SaveChanges:=False

【讨论】:

  • 非常感谢,但我认为您对我的评价太高了,我应该说我正在关注 youtube 上的教程才能做到这一点。我已经设法打开文件夹中的第一个工作簿(正确!)并复制单元格 B2:C2(我可以看到打开的工作簿,其中突出显示并复制了单元格)。粘贴卡住了,单元格 A1 按我的预期填充,但单元格 A2 没有,我收到错误“应用程序定义或对象定义错误”我将用我现在得到的内容更新原始帖子.
  • @L23P 目前尚不清楚目标工作表应该在哪个工作簿中。使用适当的工作簿对象对其进行限定。此外,您正在复制B2:C2,并粘贴到A1,所以我希望它填充A1:B1 并单独留下A2。尝试调整目标范围的大小以匹配源。
  • 我试过了,现在它没有复制并给我一个超出范围的下标错误。 wb.Worksheets("Results").Range("B2:C2").Copy ActiveSheet.Paste Destination:=Worksheets("Sheet1").Range("A1:B1")
  • 避免ActiveSheet 引用,使用工作表对象。代码将更容易理解,也更健壮。试试wb.Worksheets("Results").Range("B2:C2").Copy Destination:=destinationSheet.Range("A1:B1")
  • 知道了,避免使用 ActiveSheet,这是否意味着 ActiveWorkbook.Save 就在最后?实际上,我什至不确定最后是否需要 ActiveWorkbook.save。我可以直接点击拯救自己,而不是硬编码它。上述建议的新错误:预期:表达式。它不喜欢 ":="
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2016-10-06
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多