每次单元格更改时,将单元格的值存储到特定列中的新行

时间:2018-01-10 07:23:00

标签: excel vba excel-vba row

在我的非工作示例中,我使用单元格C5作为单元格来输入值。 我想要做的是:每次在单元格C5中输入新值时,该值应该从A1开始存储在A列中。

(例如:我输入数字1.205 - 它存储在A1中,然后我输入数字1.572 - 它存储在A2中,依此类推。)

我知道我的方法可能远非正确,所以任何帮助都表示赞赏。我已经尝试了几种不同的方法来实现这一点,但我无法使其工作,我已经实现的最大值是能够存储到A列的第2行。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim SourceCell As Range
    Dim CheckCell As Range
    Dim I As Integer

    I = 1
    Set SourceCell = Range("C5")
    Set CheckCell = Range("A" & I)

    If IsEmpty(CheckCell) Then
        CheckCell.Value = SourceCell         
    ElseIf Not IsEmpty(CheckCell) Then
        I = I + 1
        Set CheckCell = Range("A" & I)
        CheckCell.Value = SourceCell   
    End If
End Sub

2 个答案:

答案 0 :(得分:1)

您只需要检查更改的单元格是否为C5,如果是,则查找A列中最后使用的单元格并写下面的值:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$C$5" Then 'check if changed cell is C5
        Dim lRow As Long
        lRow = Range("A" & Cells.Rows.Count).End(xlUp).Row 'find last used row in column A

        Application.EnableEvents = False 'prevent triggering another change event
        Cells(lRow + 1, "A").Value = Target.Value 'write value in column A
        Application.EnableEvents = True
    End If
End Sub

请注意,我添加了Application.EnableEvents = False以防止通过将值添加到A列来触发另一个Change事件。

注意:我建议always use Long instead of Integer使用它进行行计数。 Excel有比Integer更多的行。

答案 1 :(得分:0)

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim tgt As Range
    Set tgt = Range("C5")
    If Intersect(Target, tgt) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    Cells(LastRow, 1) = Target.Value
    Application.EnableEvents = True    

End Sub

Function LastRow(Optional ByVal ws As Worksheet = ActiveSheet, Optional ByVal col As Variant = "A") As Long
    With ws
        LastRow = .Cells(.rows.Count, col).End(xlUp).Row
    End With
End Function