将其他工作表中的行附加到主工作表

时间:2014-02-12 22:00:12

标签: excel vba excel-vba

二十年来我第一次做到了这一点,这甚至是超级基本的(没有双关语意)。我Sheet1 ("Main Page")根据("Control Sequences")中输入的数据从Column B复制数据Sheet1。我有点工作。我将遇到的问题是当我复制第一组数据,然后想要引入另一组时,代码再次运行整个工作表并覆盖我之前做过的任何调整。我希望能够将一组数据引入column B,手动跳过几行,在Sub test() Dim i As Integer 'Main Page Sheet Row Number Dim n As Integer 'Control Sequences Sheet Row Number Dim x As Integer 'Main Page Current Row Number Dim y As Integer 'Column Number Dim CSrow As Integer 'Current Row Dim NextCS As Integer 'Next Control Sequence Dim NextCSrow As Integer 'Row To Stop At Dim ws1 As Worksheet 'Var Dim ws2 As Worksheet 'Var Set ws1 = Worksheets("Main Page") Set ws2 = Worksheets("Control Sequences") y = 2 'Cycles through the codes in sheet 1 For i = 2 To ws1.Cells(ws1.Rows.Count, y).End(xlUp).row Step 1 For n = 2 To ws2.Cells(ws2.Rows.Count, y).End(xlUp).row Step 1 If ws1.Cells(i, y).Value = ws2.Cells(n, y).Value Then x = i CSrow = ws2.Cells(n, y).row NextCS = ws1.Cells(i, y).Value + 1 NextCSrow = Application.WorksheetFunction.Match(NextCS, ws2.Range("B1:B200"), 0) NextCSrow = NextCSrow - 1 For CSrow = CSrow To NextCSrow y = y + 1 For y = 3 To 7 ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value Next y ' ws1.Cells(x, 8).Formula = ws2.Cells(CSrow, 8).Formula y = y + 1 ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value y = y + 2 ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value x = x + 1 y = 2 Next CSrow End If Next n Next i End Sub 下面键入另一个值,重新运行代码并附加新数据。如果这没有意义,我会尝试提出一个更简单的解释。在VBA吸收5小时后,大脑就被炸了:P这是我到目前为止完整的代码(这是一种蛮力所以要小心):

.End(xlUp)

感谢任何人的帮助和意见。

编辑2014年2月13日
正如下面答案的评论中所提到的,我拿出了 For CSrow = CSrow To NextCSrow ' y = y + 1 ' For y = 3 To 7 ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value ' Next y ' ws1.Cells(x, 8).Formula = ws2.Cells(CSrow, 8).Formula ' y = y + 1 ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value ' y = y + 2 ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value ' x = x + 1 ' y = 2 ws2.Rows(CSrow).Copy Destination:=ws1.Cells(x, 1) x = x + 1 Next CSrow` 一块并且它有效。我也把写循环的主体改为:

Sub test()
    Dim i As Long               'Main Page Sheet Row Number
    Dim j As Long               'Placeholder
    Dim n As Long               'Control Sequences Sheet Row Number
    Dim x As Long               'Main Page Current Row Number
    Dim y As Long               'Column Number
    Dim z As Long
    Dim a As Long
    Dim CSrow As Long           'Current Row
    Dim NextCS As Long          'Next Control Sequence
    Dim NextCSrow As Long       'Row To Stop At
    Dim ws1 As Worksheet        'Var
    Dim ws2 As Worksheet        'Var
    Dim ws3 As Worksheet        'Var
    Dim ws4 As Worksheet        'Var
    ' Set ws1 = Worksheets("Main Page")
    Set ws1 = ActiveSheet
    Set ws2 = Worksheets("Control Sequences")
    Set ws3 = Worksheets("Cost 1")
    Set ws4 = Worksheets("Cost 2")

    If ws1.Name = ws2.Name Or ws1.Name = ws3.Name Or ws1.Name = ws4.Name Then
        End
    End If

    y = 2
    z = 10
    a = ws1.Cells(ws1.Rows.Count, z).End(xlUp).row + 2
    If IsEmpty(ws1.Cells(a, y).Value) Then End

    'Cycles through the codes in sheet 1
    j = ws1.Cells(ws1.Rows.Count, y).End(xlUp).row
    i = ws1.Cells(j, y).row
    For i = i To j Step 1
        For n = 2 To ws2.Cells(ws2.Rows.Count, y).End(xlUp).row Step 1
            If ws1.Cells(i, y).Value = ws2.Cells(n, y).Value Then
                x = i
                CSrow = ws2.Cells(n, y).row
                NextCS = ws1.Cells(i, y).Value + 1
                NextCSrow = Application.WorksheetFunction.Match(NextCS, ws2.Range("B1:B100"), 0)
                NextCSrow = NextCSrow - 1
                For CSrow = CSrow To NextCSrow
                    ' y = y + 1
                    ' For y = 3 To 7
                    '     ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value
                    ' Next y
                    ' ws1.Cells(x, 8).Formula = ws2.Cells(CSrow, 8).Formula
                    ' y = y + 1
                    ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value
                    ' y = y + 2
                    ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value
                    ' x = x + 1
                    ' y = 2
                    ws2.Rows(CSrow).Copy Destination:=ws1.Cells(x, 1)
                    x = x + 1
                Next CSrow
            End If
        Next n
    Next i
End Sub

我有格式化和公式复制而不保留原始参考:D开到第四部分...测试所有变量而不只是1;)我将继续更新此线程...嗯...更新。

2014年2月20日编辑 这是现在的完整代码:

{{1}}

我添加了一个检查,如果用户在任何“模板”表上,代码就会停止。这有点暴力,但它完成了工作,这是我唯一的代码。也许如果我继续这样做,我会尝试更加“精简”。 :D感谢大家的投入和帮助。

1 个答案:

答案 0 :(得分:1)

我想我拥有它。您的问题出在循环的第一行:

For i = 2 To ws1.Cells(ws1.Rows.Count, y).End(xlUp).row Step 1

在循环开始之前尝试动态设置i。为此DIM另一个变量j,然后使用以下内容替换上述行:

j = ws1.Cells(ws1.Rows.Count, y).End(xlUp).row
i = ws1.Cells(j, y).End(xlUp).row
For i = i to j Step 1

当你在它时,将行整数更改为long,因为工作表中的行数多于整数可以处理的行数。