当A发生变化时,Excel会创建一个新行(包含第一行的数据)

时间:2017-12-13 14:39:56

标签: excel vba excel-vba

业余人士 - 抱歉,如果这很简单,我没有得到它。

因此,在我的工作簿中,我有一个计时器,在A2中每3分钟更新一次。在B2,C2,D2等中,我有来自插件的波动值,刷新率非常快。

我需要一个能够记录" log" B2,C2等中的值作为新行,每次A2中的值发生变化时(也有来自定时器的时间)。这是我到目前为止(除了计时器宏,它工作得很好):

Private Sub Worksheet_Calculate()
    Worksheet_Change Range("A2")
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A2")) Is Nothing Then
        Application.EnableEvents = False
        Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Range("A2").Value
        Application.EnableEvents = True
        Application.EnableEvents = False
        Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = Range("B2").Value
        Application.EnableEvents = True
        Application.EnableEvents = False
        Range("C" & Rows.Count).End(xlUp).Offset(1, 0).Value = Range("C2").Value
        Application.EnableEvents = True
        Range("D" & Rows.Count).End(xlUp).Offset(1, 0).Value = Range("D2").Value
        Application.EnableEvents = True
        Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Value = Range("E2").Value
        Application.EnableEvents = True
        Range("F" & Rows.Count).End(xlUp).Offset(1, 0).Value = Range("F2").Value
        Application.EnableEvents = True
        Range("G" & Rows.Count).End(xlUp).Offset(1, 0).Value = Range("G2").Value
        Application.EnableEvents = True
        Range("H" & Rows.Count).End(xlUp).Offset(1, 0).Value = Range("H2").Value
        Application.EnableEvents = True
    End If
End Sub

这段代码的问题在于,当我使用插件输入B2,C2等的值时,一切都很疯狂,它开始创建新行(如果你想自己尝试这个,放{{1作为其中一个值 - 它完美地模拟了我面临的问题。)

回到我的问题,当A2发生变化时,如何让宏只创建一个新行?

欢迎任何帮助,谢谢您的时间!

1 个答案:

答案 0 :(得分:1)

我已经对此进行了测试,它完成了您的预期(使用以下代码替换您的代码并删除workheet_calculate)另外您应该将Sheet1更改为Sheet的任何内容,甚至更改为ActiveSheet:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Sheet1.Range("A2").Address Then 'check to see if changes happend on A2
        Application.EnableEvents = False
        Sheet1.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Sheet1.Range("A2").Value 'copy the row from Row 2 to next empty row
        Sheet1.Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = Sheet1.Range("B2").Value
        Sheet1.Range("C" & Rows.Count).End(xlUp).Offset(1, 0).Value = Sheet1.Range("C2").Value
        Sheet1.Range("D" & Rows.Count).End(xlUp).Offset(1, 0).Value = Sheet1.Range("D2").Value
        Sheet1.Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Value = Sheet1.Range("E2").Value
        Sheet1.Range("F" & Rows.Count).End(xlUp).Offset(1, 0).Value = Sheet1.Range("F2").Value
        Sheet1.Range("G" & Rows.Count).End(xlUp).Offset(1, 0).Value = Sheet1.Range("G2").Value
        Sheet1.Range("H" & Rows.Count).End(xlUp).Offset(1, 0).Value = Sheet1.Range("H2").Value
        Application.EnableEvents = True
    End If
End Sub