【问题标题】:Excel 2013 VBA: Subscript out of Range (Error 9)Excel 2013 VBA:下标超出范围(错误 9)
【发布时间】:2016-02-29 14:07:54
【问题描述】:

所以我有这个代码:

Sub CopyItems()
    Dim Source As String
    Dim Target As String

    'Dim SourceSheet As String
    'Dim TargetSheet As String

    Source = "Source.xlsm"
    Target = "needChange.xlsm"

    'SourceSheet = "Sprint backlog"
    'TargetSheet = "Sheet1"

    Workbooks(Source).Sheets("Sprint backlog").Range("B6:B15").Copy
    Workbooks(Target).Sheets("Sheet1").Range("A14:A23").Paste '<-ERROR here
End Sub

它给了我标题中表达的运行时错误“9”。代码非常简单,我完全被难住了。 我在网上阅读,似乎是因为名称不存在,但是工​​作表和工作簿都存在,名称相同。任何代码之间都没有空格或奇怪的字符。

基本上我想将 Source.xlsm 中的“Sprint backlog”工作表中从 B6 到 B15 的列复制到 needChange.xlsm 的 Sheet1 中的 A14 到 A23 范围

我试过了,没有任何运气:

Workbooks(Source).Sheets("Sprint backlog").Range("B6:B15").Copy _
Workbooks(Target).Sheets("Sheet1").Range("A14:A23").PasteSpecial

并且还用现在注释掉的内容修改了代码。

我怀疑宏无法访问目标文件 (needChange.xlsm),因为它找不到或无法访问它并因此返回问题,但我不知道如何用代码修复它。 .

如果有帮助,则在运行宏时,此代码中的两个工作簿对我来说都是打开且可访问的。

我正在向你寻求帮助。

非常感谢。 最好的问候。

【问题讨论】:

  • 要么工作簿不名为“needChange.xlsm”,工作表不名为“Sheet1”,要么您在 Change 事件中运行了一些其他代码,但其中有错误。
  • fwiw,只需使用目的地左上角的单元格作为目标范围。 .Range("A14") 将根据源的大小和形状进行调整;你不需要.Range("A14:A23")
  • 要查明错误,您可以使用中间对象和/或在调试时使用即时窗口。比如Dim wb As Workbook, Set wb = Workbooks(Target), Dim sh As Worksheet, Set sh = wb.Sheets("Sheet1")等。
  • Rory - img 我检查了三次,工作表名称相同:( Jeeped - 谢谢,请记住这一点。dev1998 - 我看到了,事情是......当这段代码是最终的并且将要使用的路径可能不一样。

标签: excel excel-2013 vba


【解决方案1】:

这比预期的要棘手。我从这个网页http://ccm.net/faq/24666-excel-vba-copy-data-to-another-workbook 大量借用。

我必须添加对工作表的引用以进行复制和粘贴以使其正常工作。

发布的代码需要打开两个工作簿,但如果您给它一个路径名,您可以打开 wbTarget。在这种情况下,您可以注释掉出现在 -OR- 之后的两行。

代码也可以保存和关闭目标工作簿。

Sub CopyOpenItems()
   '
   ' CopyOpenItems Macro
   ' Copy open items to sheet.
   '
   ' Keyboard Shortcut: Ctrl+Shift+O
   '
   Dim wbTarget            As Workbook 'workbook where the data is to be pasted
   Dim wbThis              As Workbook 'workbook from where the data is to copied
   Dim strName             As String   'name of the source sheet/ target workbook

   'set to the current active workbook (the source book)
   Set wbThis = ActiveWorkbook

   'get the active sheetname of the book
   strName = ActiveSheet.Name

   'open a workbook that has same name as the sheet name
   'Set wbTarget = Workbooks.Open("C:\YourPath\needChange.xlsm")

    ' - OR -
    Workbooks("needChange.xlsm").Activate
    Set wbTarget = ActiveWorkbook


   'select cell A1 on the target book
   'wbTarget.Range("A1").Select

   'clear existing values form target book
   'wbTarget.Range("A1:M51").ClearContents

   'activate the source book
   wbThis.Activate

   'clear any thing on clipboard to maximize available memory
   Application.CutCopyMode = False

   'copy the range from source book
   wbThis.Sheets("Sprint backlog").Range("B6:B15").Copy

   'paste the data on the target book
   wbTarget.Sheets("Sheet1").Range("A14").PasteSpecial

   'clear any thing on clipboard to maximize available memory
   Application.CutCopyMode = False

   'save the target book
   'wbTarget.Save

   'close the workbook
   'wbTarget.Close

   'activate the source book again
   wbThis.Activate

   'clear memory
   Set wbTarget = Nothing
   Set wbThis = Nothing

End Sub

【讨论】:

  • 嗨 - 我使用了你的代码并对其进行了一些修改 - 但现在一切正常。谢谢:)
  • 无需激活或选择工作簿,只需在复制时打开即可。
【解决方案2】:

如果你只复制值(没有公式、图片、格式),一个简单的

Workbooks(Target).Sheets("Sheet1").Range("A14:A23").value = Workbooks(Source).Sheets("Sprint backlog").Range("B6:B15").value 不错。

(在同一行代码中,只有这里的窗口大小使它看起来像 2)。

对于多个值:

Workbooks(Source).Sheets("Sprint backlog").Range("B6:B15").Copy _ Workbooks(Target).Sheets("Sheet1").Range("A14:A23").

(两行)

注意_ 表示下一行是在同一行上,只是为了更容易阅读代码。 (你在第二个代码中犯了那个错误)

注意 2range().paste 不存在,只有 sheets().pasterange().pastespecial

注意 3:当然,所有工作簿和工作表都必须存在,并且与使用的名称完全相同...

注意 4:复制/粘贴仅在两个工作簿都已打开时才有效。对于已关闭的文件,情况就不同了。

简而言之,您犯了两个错误:_range().paste

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多