VBA:将数据复制到检查记录是否存在的工作表

时间:2015-07-07 20:46:33

标签: excel excel-vba vba

我有两个工作表,一个用于最终用户输入数据的漂亮输入工作表,以及一个用于在输入数据后存储数据的数据表。输入表在前两列(第一个和最后一个)中有名称,在该人的数据之后有2或3列。现在我的代码占用了所有5列,将其读入动态数组并将其写入数据表工作表。 可以随时添加或减去输入表中的名称数量。我想知道excel检查名称是否已经在数据表中的方法,以及它们是否只是覆盖该人的数据。如果该人不存在,则创建一个新行并为该人复制数据。

现在我的代码基本上复制整个数组,找到数据表中的下一个可用行,然后在那里写整个数组。问题是如果我有5个人,并且我运行我的代码两次执行此操作,我会得到同一个人的两个不同实例。我无法将我的Range更改为activecell并使用输入页面的最新迭代覆盖它,因为人们有不同的分组变量。因此,当在不同页面上选择Group1时,输入页面仅填充Group1成员,然后填充Group2等。但我需要将它们全部保存到同一张表中。

这就是代码现在的样子:

Dim BehvData() As Variant
Sheets("i_Behavior").Activate
BehvData = Range("A8", Range("A8").End(xlDown).Offset(0, 4))
Worksheets("BehvDataSheet").Select
Range("A3").Select
Range(ActiveCell.End(xlDown), ActiveCell.End(xlDown).Offset(UBound(BehvData, 1) - 1, 4)).Value = BehvData
Erase BehvData

我对VBA很新,感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这样的事可能对你有用吗?

Sub test()
    Dim i As Long
    Dim NextAvailableRow As Long
    Dim ExistingDataRow As Long
    With ThisWorkbook.Sheets("i_Behavior")
        For i = 8 To .Range("A8").End(xlDown).Row
            If WorksheetFunction.IsNumber(Application.Match(.Range("A" & i).Value, ThisWorkbook.Sheets("BehvDataSheet").Range("A:A"), 0)) Then
                'EDIT: update only column E for existing value in column A
                ExistingDataRow = Application.Match(.Range("A" & i).Value, ThisWorkbook.Sheets("BehvDataSheet").Range("A:A"), 0)
                ThisWorkbook.Sheets("BehvDataSheet").Range("E" & ExistingDataRow) = .Range("E" & i).Value
            Else
                NextAvailableRow = LastRow("BehvDataSheet", "A") + 1
                ThisWorkbook.Sheets("BehvDataSheet").Range("A" & NextAvailableRow & ":E" & NextAvailableRow) = .Range("A" & i & ":E" & i).Value
            End If
        Next i
    End With
End Sub

Public Function LastRow(SheetName As Variant, Col As Variant) As Long
    Application.Volatile True
    With ThisWorkbook.Sheets(SheetName)
        If .Cells(.Rows.Count, Col).Value <> "" Then
            LastRow = .Rows.Count
            Exit Function
        End If
        LastRow = .Cells(.Rows.Count, Col).End(xlUp).Row
    End With
End Function