Vba 选择类范围的方法失败错误1004

Vba 选择类范围的方法失败错误1004,vba,excel,Vba,Excel,大家干杯!下面的代码用于将数据从一个工作簿传输到另一个工作簿。我设定了道路和一切。代码完成了一半的工作。然而,它告诉我,班级范围选择不当,我不明白这是怎么回事 在代码中,我将注释保留在获取错误的行上。此外,如何确保每次将数据从wb2传输到wb1时,不会覆盖已存储在wb1中的数据 提前谢谢 注: wb1是一个工作簿,它有传递数据的按钮,需要粘贴 wb2:是需要打开并从中复制数据的工作簿 Private Sub Transferdata_Click() Dim intChoice As Int

大家干杯!下面的代码用于将数据从一个工作簿传输到另一个工作簿。我设定了道路和一切。代码完成了一半的工作。然而,它告诉我,班级范围选择不当,我不明白这是怎么回事

在代码中,我将注释保留在获取错误的行上。此外,如何确保每次将数据从wb2传输到wb1时,不会覆盖已存储在wb1中的数据

提前谢谢

注:

  • wb1是一个工作簿,它有传递数据的按钮,需要粘贴
  • wb2:是需要打开并从中复制数据的工作簿

    Private Sub Transferdata_Click()
    
    
    Dim intChoice As Integer
    Dim strPath As String
    Dim filname As String
    
       Dim wb1            As Workbook ' the workbook where I paste the data
       Dim wb2              As Workbook 'the workbook I copy the data
    
         Set wb1 = ActiveWorkbook
    
    
        MsgBox ("Please open the workbook you need to transfer the data from")
    
    
    Call Application.FileDialog(msoFileDialogOpen).Filters.Clear
    
    intChoice = Application.FileDialog(msoFileDialogOpen).Show
    
    If intChoice <> 0 Then
    
    strPath = Application.FileDialog( _
    msoFileDialogOpen).SelectedItems(1)
    
    
    filname = Split(strPath, "\")(UBound(Split(strPath, "\")))
    
    Application.ScreenUpdating = False
    
    Workbooks.Open Filename:=strPath
    
    
       Windows(filname).Activate
        Set wb2 = ActiveWorkbook
    
       wb2.Sheets("File").Range("A3").Select ' I get the error here. don't understand why
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
    
    wb1.Activate
    
       wb1.Sheets("File2").Select
       Range("A4").Select
           Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False ' how can I make sure here that every time when I copy the data from wb2 to wb1 won't overwrite the data that is already in wb1? to paste the data starting from the row that is empty? 
    
    
    
    Application.ScreenUpdating = True
    
    End If
    End Sub
    
    Private Sub Transferdata\u Click()
    选择整数
    将strPath设置为字符串
    将文件名设置为字符串
    将wb1设置为工作簿“粘贴数据的工作簿”
    Dim wb2作为工作簿“我复制数据的工作簿”
    设置wb1=ActiveWorkbook
    MsgBox(“请打开需要从中传输数据的工作簿”)
    调用Application.FileDialog(msoFileDialogOpen).Filters.Clear
    intChoice=Application.FileDialog(msoFileDialogOpen.Show)
    如果选择0,那么
    strPath=Application.FileDialog(_
    msoFileDialogOpen)。选择编辑项(1)
    filname=Split(strPath,“\”)(UBound(Split(strPath,“\”))
    Application.ScreenUpdating=False
    工作簿。打开的文件名:=strPath
    Windows(文件名)。激活
    设置wb2=ActiveWorkbook
    wb2.Sheets(“文件”).Range(“A3”)。选择“我在这里得到错误”。不明白为什么
    范围(选择,选择。结束(xlDown))。选择
    选择,复制
    wb1.激活
    wb1.工作表(“文件2”)。选择
    范围(“A4”)。选择
    Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
    :=False,Transpose:=False'在这里,我如何确保每次将数据从wb2复制到wb1时不会覆盖已经在wb1中的数据?要粘贴从空行开始的数据?
    Application.ScreenUpdating=True
    如果结束
    端接头
    

    • 我认为这应该行得通。删除所有的选择和激活,并将工作簿变量分配给两者

      Private Sub Transferdata_Click()
      
      Dim intChoice As Long
      Dim strPath As String
      Dim filname As String
      Dim wb1 As Workbook ' the workbook where I paste the data
      Dim wb2 As Workbook 'the workbook I copy the data
      
      Set wb1 = ActiveWorkbook
      MsgBox ("Please open the workbook you need to transfer the data from")
      Call Application.FileDialog(msoFileDialogOpen).Filters.Clear
      intChoice = Application.FileDialog(msoFileDialogOpen).Show
      
      If intChoice <> 0 Then
          strPath = Application.FileDialog( _
          msoFileDialogOpen).SelectedItems(1)
          filname = Split(strPath, "\")(UBound(Split(strPath, "\")))
          Application.ScreenUpdating = False
          Set wb2 = Workbooks.Open(Filename:=strPath)
          With wb2.Sheets("File")
              .Range("A3", .Range("A3").End(xlDown)).Copy
          End With
          With wb1.Sheets("File2")
              .Range("A" & .Rows.Count).End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
          End With
          Application.ScreenUpdating = True
      End If
      
      End Sub
      
      Private Sub Transferdata\u Click()
      我的选择很长
      将strPath设置为字符串
      将文件名设置为字符串
      将wb1设置为工作簿“粘贴数据的工作簿”
      Dim wb2作为工作簿“我复制数据的工作簿”
      设置wb1=ActiveWorkbook
      MsgBox(“请打开需要从中传输数据的工作簿”)
      调用Application.FileDialog(msoFileDialogOpen).Filters.Clear
      intChoice=Application.FileDialog(msoFileDialogOpen.Show)
      如果选择0,那么
      strPath=Application.FileDialog(_
      msoFileDialogOpen)。选择编辑项(1)
      filname=Split(strPath,“\”)(UBound(Split(strPath,“\”))
      Application.ScreenUpdating=False
      设置wb2=Workbooks.Open(文件名:=strPath)
      使用wb2.Sheets(“文件”)
      .Range(“A3”),.Range(“A3”).End(xlDown)).Copy
      以
      带wb1.Sheets(“文件2”)
      .Range(“A”和.Rows.Count).End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
      以
      Application.ScreenUpdating=True
      如果结束
      端接头
      
      正如Rory在评论中提到的,最好避免使用。在这种情况下选择。我认为调暗范围变量并使用它来复制/粘贴会更容易:

          Dim rng As Range
          Set rng = wb2.Sheets("File").Range("A3")
          wb2.Sheets("File").Range(rng, rng.End(xlDown)).Copy
      
      您可以对粘贴操作执行相同的操作。为避免覆盖数据,首先检查A4单元格中是否存在任何数据。如果有数据,您可以使用xlDown获取最后一行数据,然后再通过该行

      Dim rng2 As Range
      If wb1.Sheets("File2").Range("A4") = "" Then
          Set rng2 = wb1.Sheets("File2").Range("A4")
      Else
          Set rng2 = wb1.Sheets("File2").Range("A4").End(xlDown).Offset(1,0)
      End If
      rng2.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
              :=False, Transpose:=False 
      

      除非工作表和工作簿处于活动状态,否则无法选择范围。(你也应该避免选择,因为这通常是不必要的)谢谢你的帮助。我在wb1.Sheets(“File2”)的
      行中收到以下错误消息
      对象变量或未设置块变量
      运行宏时粘贴到的工作簿是否处于活动状态?使用
      Activeworkbook
      有点冒险。如果代码在该文件中,您可以使用
      此工作簿
      。它表示它处于活动状态。我试着换成这个工作簿。相同的错误..您可以改为尝试文件名吗
      Set wb1=Workbooks(“name”)
      @SRJ,很抱歉延迟了重播。代码现在可以工作了。这是我的错,因为我没有注意那张纸的名字。这真是太棒了。非常感谢