下标超出范围 用于从一张工作表复制到另一张工作表的宏中的运行时错误“9”

Subscript out of range Run time error'9' in macro used to copy from one sheet to another

提问人:ADAN ALEJANDRO RAMIREZ QUINTER 提问时间:11/8/2023 最后编辑:braXADAN ALEJANDRO RAMIREZ QUINTER 更新时间:11/10/2023 访问量:77

问:

我是编写宏的新手,只是了解它是如何工作的。我需要将数据从一个工作簿复制到另一个工作簿上,这是我想出的宏:

Option Explicit
Sub CopyMainTable()
    Dim SourceWorkbook As Workbook
    Dim DestWorkbook As Workbook
    
    ' Set references to the source and destination workbooks
    Set SourceWorkbook = Workbooks("Monthly Report.xlsx")
    Set DestWorkbook = Workbooks("ANNUAL REPORT.xlsx")
    
    ' Copy data from source to destination
    SourceWorkbook.Sheets("SITE1").Range("B19:Av43").Copy Destination:=DestWorkbook.Sheets("SITE1").Range("B19")
    
    Set SourceWorkbook = Nothing
    Set DestWorkbook = Nothing

    
End Sub

问题是当它运行时会出现一个运行时错误 9:下标超出范围,我检查了两个工作簿上的单元格,它们确实一一对一对

我确保所有名字拼写正确,并检查了工作表上的单元格

VBA Excel-2010

评论

0赞 Scott Craner 11/8/2023
工作簿是否打开?您是否仔细检查了(如复制粘贴)工作簿名称和后缀以及工作表名称?
0赞 Black cat 11/8/2023
也许您的实际文件夹与文件所在的位置不同。为两个源定义完全限定的路径名。"C:\Users\...\...\Monthly Report.xlsx"
0赞 ADAN ALEJANDRO RAMIREZ QUINTER 11/8/2023
我记得我确实使用 workbook.open 语句在代码中打开了它,它告诉我该文件不存在,我已经检查了我在问题中提到的拼写,但我不确定如果文件路径位于同一文件夹中,它们必须如何引用,我正在尝试使用相对路径,因为这些工作簿必须在不同的机器之间移动,但我可以计算所有需要编译的工作簿位于同一文件夹中
0赞 ADAN ALEJANDRO RAMIREZ QUINTER 11/8/2023
我故意避免使用绝对路径,以便我的书编译的文件夹和工作簿可以在不同的机器之间移动并互换,因为我昨天才开始学习,我不确定绝对路径是否会使它不可移动,但它不会影响我这样做
0赞 ADAN ALEJANDRO RAMIREZ QUINTER 11/8/2023
我发现的另一件奇怪的事情是,每当我打开工作簿时,它都会在表格中填充来自另一个工作簿的正确信息,尽管当我运行它时崩溃了

答:

0赞 CDP1802 11/10/2023 #1
Option Explicit

Sub CopyMainTable()

    Dim wbSource As Workbook, wbDest As Workbook
    Dim wsSource As Worksheet
    Dim rngCopy As Range
    Dim sFolder As String, sourceFile As String, s As String
   
    ' Set references to the source and destination workbooks
    Set wbDest = ThisWorkbook
    sFolder = wbDest.Path & "\"
    sourceFile = "Monthly Report.xlsx"
    
    ' check source file exists then open
    s = sFolder & sourceFile
    On Error Resume Next
    Set wbSource = Workbooks.Open(s, ReadOnly:=True)
    If wbSource Is Nothing Then
        MsgBox sourceFile & " not found in " & sFolder, vbCritical
        Exit Sub
    Else
        ' check sheet
        Set wsSource = wbSource.Sheets("SITE1")
        If wsSource Is Nothing Then
            MsgBox "Sheet SITE1 not found in " & wbSource.Name, vbCritical
            wbSource.Close
            Exit Sub
        End If
    End If
    On Error GoTo 0
    
    ' Copy data from source to destination
    Set rngCopy = wsSource.Range("B19:AA43")
    rngCopy.Copy Destination:=wbDest.Sheets("SITE1").Range("B19")
    
    MsgBox rngCopy.Address & " copied from " & wbSource.Name, vbInformation
    wbSource.Close

End Sub