Excel VBA从外部工作表导入数据-变量工作表名称

Excel VBA从外部工作表导入数据-变量工作表名称,excel,vba,import,filenames,worksheet,Excel,Vba,Import,Filenames,Worksheet,我希望做到以下几点: 目标工作表中的CommandButton打开源文件(选择哪个文件的对话框) 在源文件中查找工作表(始终使用相同的名称-“性能”) 复制一个单元格区域(实际上是两个单独的区域-待添加) 确保目标工作表(与源工作表中的单元格I2同名)存在 将值粘贴到目标工作表中的相同范围 关闭源文件 到目前为止,我有: Private Sub CommandButton1_Click() Dim SourceFile As String Dim SourceBook As Workbook

我希望做到以下几点:

  • 目标工作表中的CommandButton打开源文件(选择哪个文件的对话框)
  • 在源文件中查找工作表(始终使用相同的名称-“性能”)
  • 复制一个单元格区域(实际上是两个单独的区域-待添加)
  • 确保目标工作表(与源工作表中的单元格I2同名)存在
  • 将值粘贴到目标工作表中的相同范围
  • 关闭源文件
  • 到目前为止,我有:

    Private Sub CommandButton1_Click()
    
    Dim SourceFile As String
    Dim SourceBook As Workbook
    Dim DestinationBook As Workbook
    Dim desiredName As String
    
    Set DestinationBook = ThisWorkbook
    
    SourceFile = Application.GetOpenFilename(fileFilter:="Excel Macro-Enabled Workbook (*.xlsm), *.xlsm")
    
    Set SourceBook = Workbooks.Open(SourceFile)
    
    SourceBook.Sheets("Performance").Activate
    desiredName = ActiveSheet.Range("I2")
    Application.CutCopyMode = True
    SourceBook.ActiveSheet.Range("E25:I64").Copy
    DestinationBook.Activate
    
    If WorksheetExists = False Then
    
            MsgBox "Couldn't find " & desiredName & " sheet within destination workbook"
    
        Call SourceBook.Close(False)
    
        Exit Sub
    
    Else
    
    
    Range("E25:I64").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Application.CutCopyMode = False
    
    Call SourceBook.Close(False)
    
    End If
    
    End Sub
    
    Function WorksheetExists() As Boolean
    
    Dim sh As Object
    
        For Each sh In DestinationBook.Worksheets
          If sh.Name = desiredName Then WorksheetExists = True: sh.Activate
          Exit For
        Next
    
    End Function
    
    我收到运行时错误“424”:需要对象

    有什么建议吗


    提前谢谢

    这里是对您最新代码的修改。注意这些添加:1)“Option Explicit”确保您正确声明了所有变量,2)变量已分配给重要的工作簿、工作表和范围,3)所需变量将传递给
    工作表列表
    函数。为此,应在
    目标手册
    中提供名为“性能”和“测试表”的工作表,并在
    源代码手册
    I2
    中提供名为“测试表”的工作表。请记住,这只是一个尝试“让你走”,所以我希望你需要修改

    Option Explicit
    Sub test()
    
    Dim SourceFile As String
    Dim SourceBook As Workbook, performanceSh As Worksheet
    Dim DestinationBook As Workbook
    Dim desiredName As String
    Set DestinationBook = ThisWorkbook
    
    SourceFile = Application.GetOpenFilename(fileFilter:="Excel Macro-Enabled Workbook (*.xlsm), *.xlsm")
    Set SourceBook = Workbooks.Open(SourceFile)
    Set performanceSh = SourceBook.Sheets("Performance")
    desiredName = performanceSh.Range("I2")
    Application.CutCopyMode = True
    performanceSh.Range("E25:I64").Copy
    If WorksheetExists(DestinationBook, desiredName) = False Then
            MsgBox "Couldn't find " & desiredName & " sheet within destination workbook"
        SourceBook.Close(False)
        Exit Sub
    Else
    Range("E25:I64").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    SourceBook.Close(False)
    End If
    End Sub
    
    Function WorksheetExists(destWk As Workbook, theName As String) As Boolean
    Dim sh As Object
        For Each sh In destWk.Worksheets
          If sh.Name = theName Then WorksheetExists = True: sh.Activate
          Exit For
        Next
    End Function
    

    谢谢Tony,重点是我想让它自己确保正确的目的地工作表处于活动状态。右侧目标工作表的名称等于刚刚打开的源文件中源工作表中单元格I2的内容。从技术上讲,它应该返回到正确的目标工作表,因为这是按钮所在的位置,但我想绝对确保它不会意外更改-目标文件中有多个工作表,并且必须分别对每个工作表执行相同的操作。它们的格式都完全相同,所以容易混淆好吧,我添加了更多代码来解决这个问题。希望它能帮上忙。就快到了,但它似乎在刚打开的源代码工作簿中寻找工作表,但找不到。为了澄清,单元格I2位于源工作簿和名为“性能”的源工作表中,目标文件中的目标工作表与源工作表中I2的内容相同。假设源工作表在I2中显示STACK,我希望它在目标工作簿中找到名为STACK的工作表并粘贴到那里。我现在修改了代码以解决您的问题。谢谢Tony,我按原样复制,目前它不起作用-弹出消息框(未找到…),尽管工作表确实存在,但没有错误。那么,问题就出在函数中了,因为它说这是错误的——可能是它在源工作簿中搜索目标工作表,而不是目标工作簿?如果是,我如何将其定向回搜索目的地?