Excel VBA使用单元格引用从其他工作簿复制数据

Excel VBA使用单元格引用从其他工作簿复制数据,vba,excel,reference,Vba,Excel,Reference,我在单元格B1中声明了文件名,我正在尝试从另一个工作表导入数据。当前,这将导致订阅超出范围错误。有什么简单的方法可以解决这个问题吗?还是另一种更喜欢的方式?唯一的要求是单元格中包含来自另一个工作簿的数据(文本),而不是引用该工作簿的公式 Sub UpdateFileInfo() If (Range("B1") = "") Then Range("A2:R200").Value = "" Else Filename = Range("B1").Val

我在单元格B1中声明了文件名,我正在尝试从另一个工作表导入数据。当前,这将导致订阅超出范围错误。有什么简单的方法可以解决这个问题吗?还是另一种更喜欢的方式?唯一的要求是单元格中包含来自另一个工作簿的数据(文本),而不是引用该工作簿的公式

Sub UpdateFileInfo()
    If (Range("B1") = "") Then
        Range("A2:R200").Value = ""
    Else
        Filename = Range("B1").Value  

        Range("A2:R200") = Workbooks(Filename).GetActiveSheet.Range("A2:R200").Value

    End If
End Sub

出现此错误是因为工作簿未打开

要做到这一点,您必须在写入范围(“A2:R200”)以打开工作簿的命令之前包含一行。但是,您将打开多个工作簿,因此您可能希望使用变量使其更清晰,如下所示:

Sub UpdateFileInfo()

    Dim LocalWorkbook As Workbook
    Dim RemoteWorkbook As Workbook

    Set LocalWorkbook = ActiveWorkbook

    If (Range("B1") = "") Then
        Range("A2:R200").Value = ""
    Else
        FullFilename = Range("B1").Value
        Set RemoteWorkbook = Workbooks.Open(Filename:=FullFilename, ReadOnly:=True)

        LocalWorkbook.ActiveSheet.Range("A2:R200") = RemoteWorkbook.ActiveSheet.Range("A2:R200").Value

        RemoteWorkbook.Close SaveChanges:=False
    End If
End Sub

一般来说,当您收到订阅超出范围错误时,这是因为您使用不存在的键或索引引用集合的元素(在本例中为工作簿集合)或数组的元素。

如果您已经知道源工作表名称(例如:“Sheet1”),则可以使用此选项

Option Explicit

Sub UpdateFileInfo2()
    With Range("A2:R200") ' reference target range
        If Range("B1") = "" Then ' if currently active sheet B1 cell is empty
            .ClearContents ' clear referenced range content
        Else
            .FormulaR1C1 = "='C:\Users\...\[" & Range("B1").Value & "]Sheet1'!RC" ' fill referenced range with formulas pointing at the corresponding cell in the wanted sheet of the wanted workbook
            .Value = .Value ' get rid of formulas and leave values only
        End If
    End With
End Sub
否则,您可以使用以下模式:

Sub UpdateFileInfo2()
    With Range("A2:R200") ' reference target range
        If Range("B1") = "" Then ' if currently active sheet B1 cell is empty
            .ClearContents ' clear referenced range content
        Else
            .Value = Workbooks.Open(Range("B1").Value).ActiveSheet.Range(.Address).Value ' have refereneced range values as the newly opened workbook activesheet corresponding one
            ActiveWorkbook.Close false ' close newly opened workbook
        End If
    End With
End Sub
同时,如果您的
范围(“B1”).Value
不包含文件的完整路径,请添加它:

Sub UpdateFileInfo2()
    With Range("A2:R200") ' reference target range
        If Range("B1") = "" Then if currently active sheet B1 cell is empty
            .ClearContents ' clear referenced range content
        Else
            .Value = Workbooks.Open("C:\Users\...\" & Range("B1").Value).ActiveSheet.Range(.Address).Value ' have refereneced range values as the newly opened workbook activesheet corresponding one
            ActiveWorkbook.Close false ' close newly opened workbook
        End If
    End With
End Sub


什么是
GetActiveSheet
?您需要从中读取的工作簿是否已打开?为什么必须打开工作簿才能从中复制数据?有没有办法在不打开另一个工作簿的情况下复制它?此外,通过添加您提到的行,我得到了另一个错误1004据我所知,您必须打开工作簿或刷新引用它的公式,才能从工作簿中获取数据。以只读方式打开文件会非常快,您可以在最后关闭工作簿。但是,如果确实不想打开工作簿,可以将引用远程工作簿的公式放在本地工作簿中,然后在刷新后立即用它们的值替换。感谢您提供了简单的解决方案!不客气。请参见最后一次编辑。如果我的回答解决了你的问题,那么你可以考虑把它标记为“接受”。非常感谢。