2017-08-04 52 views
1

我希望做到以下几点:VBA导入数据 - 变量工作表的名称

  1. 命令按钮在目标工作表打开源文件(对话框,选择其中之一)
  2. 找到源文件
  3. 复制单元格范围内 - 的工作表(“性能”总是相同的名称)(实际上是几个不同的范围的 - 要添加)
  4. 确保目的地片(其具有相同的名称作为细胞I2在源表中)存在
  5. 粘贴值到目标工作表相同的范围
  6. 关闭源文件

我有这个至今:

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

这是对您最新代码的修改。注意这些增加:1)“Option Explicit”确保你已经正确地声明了所有变量,2)变量已被分配给重要的工作簿,工作表和范围,3)需要的变量被传递给WorkSheetExists函数。为此,在DestinationBook中应该有工作表名为“Performance”和“testSheet”,在SourceBook中应该有I2中的“testSheet”。请记住,这只是一个“让你走”的尝试,所以我希望你需要修改。

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 
+0

谢谢托尼,重点是虽然我希望它自己确保正确的目标工作表是活动的。正确的目标工作表是一个名称与源文件中单元格I2的内容相同的文件夹。从技术上讲,它应该回到正确的目的地表单中,因为这是按钮所在的位置,但我想确保它不会意外更改 - 目标文件中有多个表单,并且必须执行相同的操作为每个单独执行。它们的格式都完全一样,所以很容易混淆 –

+0

好吧,我已经添加了更多代码来解决这个问题。希望能帮助到你。 –

+0

几乎在那里,但它似乎正在寻找刚刚打开的源工作簿中的工作表 - 它不会找到它。为了说明,单元格I2位于名为“性能”的源工作簿和源表单中,目标文件中的目标表单与源表单中I2的内容相同。说源表单说I2中的STACK,我希望它在目标工作簿中找到名为STACK的工作表并粘贴在那里。 –

相关问题