【问题标题】:Logging All Changes in Specific Format in Excel Sheet在 Excel 工作表中以特定格式记录所有更改
【发布时间】:2019-05-24 09:52:46
【问题描述】:

我有一个名为 STOCKS 的 Excel 工作表,它可以自动更新股票行情,例如股票名称、时间、最后交易价格、买入价、卖出价等。

Stock Name | Time | Last Trade Rate | Bid Price | Offer Price
1 ACC      | 10.40am| 42            | 41        | 43
2 INFY     | 10.40am| 100           | 99        | 101
3 TECH     | 10.40am| 140           | 136       | 142

每只股票的价格和其他所有行值每秒都在变化,并且会随着价格变化或出价、出价变化而自动更新。

我添加了一个名为 LOGSSHEET 的单独工作表

Excel 代码要做什么:

如果任何列中的任何单元格值发生更改,那么我希望在复制/记录整个列的 LOGSHEET 中记录相同的值

例如,如果 INFY 股票的出价发生变化,则整个行(在这种情况下,行包含股票 INFY)应记录/复制到 LOGSHEET 中

示例: 2 INFY | 10.40am| 100 | 99 | 101

类似地,如果说另一个或相同脚本的要约价格或时间或最后交易率更改,则它会显示粘贴/记录在先前记录的条目下方,例如:

2 INFY     | 10.40am| 100           | 99.10        | 101
3 TECH     | 10.40am| 140.50           | 136       | 142

等等……

我不是 Excel VBA 程序员,但我发现这段代码记录了一些内容,但不是整个行的组织。

我找到了一个代码,它以一种杂乱无章的方式做类似的事情,但不是我想要的

示例代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim strAddress As String
    Dim val
    Dim dtmTime As Date
    Dim Rw As Long

    If Intersect(Target, Range("A1:M1000")) Is Nothing Then Exit Sub
       'change range to suit
    dtmTime = Now()
    val = Target.Value
    strAddress = Target.Address


    Rw = Sheets("Log Sheet").Range("A" & Rows.Count).End(xlUp).Row + 1
    With Sheets("Log Sheet")
        .Cells(Rw, 1) = strAddress
        .Cells(Rw, 2) = val
        .Cells(Rw, 3) = dtmTime
        .Cells(Rw, 3) = Stocks
    End With
End Sub

【问题讨论】:

  • 所以您只想复制更改为Log Sheet的行并添加一个名为what...Time Stamp的列?您在哪里输入更改的时刻?
  • 也不需要添加单独的时间戳......即使该行中任何单元格中的任何一个值发生变化,也只需复制整行......等等......

标签: excel vba


【解决方案1】:

将以下代码复制到 STOCKS 工作表模块中。如果其中的单元格值发生更改(未测试),这将跨行复制。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim lRowLogSheet As Long

    'adjust the below target range to suit your needs
    If Intersect(Target, Range("C4:C8")) Is Nothing Then Exit Sub

    'find the last row in the log sheet
    lRowLogSheet = Sheets("LOGSSHEET").Range("A" & Sheets("LOGSSHEET").Rows.Count).End(xlUp).Row + 1

    'set the values of the row
    Sheets("LOGSSHEET").Range("A" & lRowLogSheet, "E" & lRowLogSheet).Value = Sheets("STOCKS").Range("A" & Target.Row, "E" & Target.Row).Value

End Sub

【讨论】:

  • 刚刚测试,它正在创建多个条目...例如,如果同一行内同时更改 3 个不同的值,则它正在创建 3 个条目。
  • @vinayagarwal 不客气。请将此标记为关闭线程的答案。谢谢。
【解决方案2】:

你就是这样做的:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Rw As Long

    If Intersect(Target, Range("A1:M1000")) Is Nothing Then Exit Sub

    With ThisWorkbook.Sheets("Log Sheet")
        Rw = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        Me.Rows(Target.Row).Copy .Cells(Rw, 1)
    End With

End Sub

【讨论】:

  • 嗨,如果同一列中的 2 个值同时更改会发生什么 - 它会粘贴 2 次还是只粘贴一次....desired 只是一次
  • 当您谈论列时,您的意思是行,对吗??
  • 是的,如果在同一行同时更改两个值,则只有 1 次粘贴。
  • 刚刚测试,它正在为同一行中的同时更改创建多个条目,而不是一个条目先生
  • 这意味着它们不是同时...使用此代码输入。所以脚本首先更新一个单元格,然后是另一个。
猜你喜欢
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多