将范围复制到另一个工作表

时间:2021-01-03 21:18:54

标签: excel vba

我有 3 张表:DATA、BUILD 和 RESULT。
DATA - 包含所有数据
BUILD - 通过 VBA 过程(如下)和命令按钮迭代的 1 行。
结果 - 我需要将 BUILD 表的每个迭代行放在哪里。

以下部分代码预计将新行添加到 RESULTS 表中。
在 RESULTS 表中,有时在第 2567 行、有时在 237 等中复制行。
我无法理解 VBA 如何确定放置复制行的行的逻辑。

Sheets("RESULTS").Range("A2" & i + 1).Value = Sheets("BUILD").Range("D4").Value 'League Name
Sheets("RESULTS").Range("B2" & i + 1).Value = Sheets("BUILD").Range("E4").Value 'Home Team
Sheets("RESULTS").Range("C2" & i + 1).Value = Sheets("BUILD").Range("F4").Value 'Away Team

这是完整的代码:

Sub btn_NextMatch()
    Application.ScreenUpdating = False
    Application.Volatile
    Dim Last_row As Double
    Dim Last_Col As Integer
    Dim i As Integer
    Dim sheet As String
    sheet = ActiveSheet.Name
    
    Sheets("BUILD").Select
    i = Range("A1").Value
     
    Sheets("DATA").Select
    Last_row = Range("A" & Rows.Count).End(xlUp).Row
    Last_Col = ActiveSheet.Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, LookIn:=xlValues).Column
    Last_colletter = Split(Cells(1, Last_Col).Address, "$")(1)
    If i = Last_row Then
        i = 1
    End If
    
    Sheets("BUILD").Range("C2").Value = Sheets("DATA").Range("C" & i + 1).Value 'MatchID
            
    Sheets("BUILD").Range("D4").Value = Sheets("DATA").Range("D" & i + 1).Value 'League Name
    Sheets("BUILD").Range("E4").Value = Sheets("DATA").Range("F" & i + 1).Value 'Home Team
    Sheets("BUILD").Range("F4").Value = Sheets("DATA").Range("G" & i + 1).Value 'Away Team
    
    Sheets("BUILD").Select
    
    If i = Last_row Then
        Range("A1").Value = 1
    Else
        Range("A1").Value = i + 1
        Sheets("RESULTS").Range("A2" & i + 1).Value = Sheets("BUILD").Range("D4").Value 'League Name
        Sheets("RESULTS").Range("B2" & i + 1).Value = Sheets("BUILD").Range("E4").Value 'Home Team
        Sheets("RESULTS").Range("C2" & i + 1).Value = Sheets("BUILD").Range("F4").Value 'Away Team
    End If
    
    Application.ScreenUpdating = True
    
    Sheets(sheet).Select
    
End Sub

2 个答案:

答案 0 :(得分:1)

我不建议使用偏移量来解决之前的问题。以下是代码中更正的一些项目:

  1. 将最后一行、最后一列等声明为 Long。 Excel 中有超过 100 万行,整数最多只能处理 32,767。之后,您将重载该值。

  2. 通过将它们设置为变量来缩短工作簿名称。无需 Dim 作为字符串。

  3. 通过限定您的工作表和变量来避免 SelectActivate。这意味着提供所需的完整信息以指定位置 ThisWorkbook.Worksheets("Sheet1").Range("A1") 与可以是任何工作表的 Range("A1")。这不仅可以确保正确的位置,而且可以通过避免更改工作表来加速您的代码。

     Sub btn_NextMatch()
     Application.ScreenUpdating = False
     Application.Volatile
     Dim Last_row As Long
     Dim Last_Col As Long
     Dim i As Long
    
     Dim wks1 As Worksheet
     Dim wks2 As Worksheet
     Dim wks3 As Worksheet
    
     Set wks1 = ThisWorkbook.Worksheets("BUILD")
     Set wks2 = ThisWorkbook.Worksheets("DATA")
     Set wks3 = ThisWorkbook.Worksheets("RESULTS")
    
     i = wks1.Range("A1").Value
    
     Last_row = wks2.Range("A" & Rows.Count).End(xlUp).Row
     Last_Col = wks2.Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, LookIn:=xlValues).Column
     Last_colletter = Split(wks2.Cells(1, Last_Col).Address, "$")(1)
     If i = Last_row Then
         i = 1
     End If
    
         wks1.Range("C2").Value = wks2.Range("C" & i + 1).Value 'MatchID
         wks1.Range("D4").Value = wks2.Range("D" & i + 1).Value 'League Name
         wks1.Range("E4").Value = wks2.Range("F" & i + 1).Value 'Home Team
         wks1.Range("F4").Value = wks2.Range("G" & i + 1).Value 'Away Team
    
     If i = Last_row Then
        wks1.Range("A1").Value = 1
     Else
         wks1.Range("A1").Value = i + 1
         wks3.Range("A" & i + 1).Value = wks1.Range("D4").Value 'League Name
         wks3.Range("B" & i + 1).Value = wks1.Range("E4").Value 'Home Team
         wks3.Range("C" & i + 1).Value = wks1.Range("F4").Value 'Away Team
     End If
    
     Application.ScreenUpdating = True
    End sub
    

答案 1 :(得分:0)

Darrel H. 是对的。如果您将迭代连接到您正在执行的单元格地址,则相当于:“A2”和 25 变为 A225,您真正想要的是“A27”。解决此问题的一种方法是使用偏移功能。你重写的代码应该是这样的:

Sheets("RESULTS").Range("A2" & i + 1).offset(rowoffset:=i + 1).value = Sheets("BUILD").Range("D4").Value 'League Name'