我有两个工作表,一个用于最终用户输入数据的漂亮输入工作表,以及一个用于在输入数据后存储数据的数据表。输入表在前两列(第一个和最后一个)中有名称,在该人的数据之后有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很新,感谢您的帮助。
答案 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