【问题标题】:Display Value of a cell based off the Row value of another. Log Tracking根据另一个单元格的行值显示一个单元格的值。日志跟踪
【发布时间】:2016-06-16 16:50:12
【问题描述】:

我正在尝试创建用于版本跟踪的电子表格,但有一个单独的表格来捕获对第一个表格的更改,并且需要包含一些额外的信息。这是当前正在运行的脚本。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Log" Then Exit Sub
Application.EnableEvents = False
On Error Resume Next
With Sheets("Log").Cells(Rows.Count, 1).End(xlUp)

    .Offset(1, 0).Value = Environ("UserName")
    .Offset(1, 1) = Sh.Name
    .Offset(1, 3) = Target.Address
    .Offset(1, 4) = "'" & Target.Formula
    .Offset(1, 5) = Previous
    Previous = ""
    .Offset(1, 6) = Now
End With
Application.EnableEvents = True

结束子

被修改的单元格在第 3 列中被捕获为 Target.Address。我希望能够引用 Target.Address's Row 并在第一张表的同一行上显示 A 列的值。 .

例如:在工作表 1 上修改了单元格 D7。日志表显示 $D$7 作为目标地址的值。在另一个单元格中,我想知道 A7 的值是什么,target.address 的行是 7。当我尝试不同的公式时,它将位于示例中缺少的 .Offset(1, 2) = 位置而不是使用 vba。

恐怕很难找到正确的问题或措辞。

任何建议将不胜感激! 提前谢谢你,

【问题讨论】:

  • cells(target.row, "A")?
  • 不幸的是,这似乎不起作用:(
  • 如果你需要它的健壮性,你应该尝试删除On Error Resume Next
  • 如果你用正确的表格来限定它应该?
  • 原谅我的无知 :( 但是我如何用正确的表格来证明它?

标签: excel vba lookup


【解决方案1】:

处理多个更改的单元格:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    Const LOG_SHEET As String = "Log"

    Dim c As Range

    If Sh.Name = LOG_SHEET Then Exit Sub

    For Each c In Target.Cells

        With Sheets(LOG_SHEET).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow

            .Cells(1).Value = Environ("UserName")
            .Cells(2).Value = c.EntireRow.Cells(1).Value 'server name
            .Cells(3).Value = Sh.Name
            .Cells(4) = c.Address(False, False)
            .Cells(5) = "'" & c.Value
            .Cells(6) = Now

        End With

    Next c

End Sub

您无需在此处禁用事件,因为“如果日志表退出”行会处理此问题。

【讨论】:

  • 如果您不禁用事件,它不是将脚本的每次写入都检测为更改事件并重新触发,变成循环吗?我过去曾遇到过这个问题,但不确定它是否是特定于版本的。
  • 此处If Sh.Name = LOG_SHEET Then Exit Sub 可将任何可能产生的环路短路。
  • 这似乎也没有抓住我正在寻找的东西。 cell2.values 留空
  • 在我的测试中为我工作,所以不确定您的特定工作簿中的问题。
【解决方案2】:

您可以仅使用Target.Value2 属性来处理更改的值。您的脚本将如下所示:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = "Log" Then Exit Sub
    Application.EnableEvents = False
    On Error Resume Next
    With Sheets("Log").Cells(Rows.Count, 1).End(xlUp)

        .Offset(1, 0).Value = Environ("UserName")
        .Offset(1, 1) = Sh.Name
        .Offset(1, 2) = Target.Value2
        .Offset(1, 3) = Target.Address
        .Offset(1, 4) = "'" & Target.Formula
        .Offset(1, 5) = Previous
        Previous = ""
        .Offset(1, 6) = Now
    End With
    Application.EnableEvents = True
End Sub

【讨论】:

  • 应该记住,Target 可能并不总是单个单元格 - 用户可以同时更改多个单元格,在这种情况下 Target 将包含所有这些单元格。
  • 这是一个有效的注释。从描述看来,这似乎不太可能是他们过程中的一个功能步骤。用Target.Count 检测这个有意义吗?这会检测到多区域选择吗?
  • 所做的每个更改都被捕获为一个单独的条目。跟踪修改了哪些单元格、更改了什么以及原始单元格值。修改另一个单元格后,将添加具有这些更改的另一行。即使它的同一个单元格修改了两次。制作了 2 个单独的条目。
  • 也许这将有助于解释我想要更详细地捕获的内容:电子表格有一个服务器名称列表、更改类型、授权者、实施者等。服务器名称从不更改,因此日志主要捕获修改类型的更改以及修改日期由谁批准等。这是有效的,但我想提取列 A 中的服务器名称的值。所以当 D E F 是更改日志包括修改 D E F 的行上 A 的值。所以我不必在工作表之间来回切换并说哦 D:7 那是服务器 XYZ
  • A1=ServerA B1=Change Type C1=Employee A. 用户将 Employee A 修改为 Employee B. 日志显示 User:xYZ modified $C$1 Employee B previous= Employee A. 我希望脚本查看修改后的单元格 $C$1 并说 Row=1 A1 是什么? A1=ServerA 所以日志看起来像 User XYZ Modified ServerA $C$1 Employee B Employee A
猜你喜欢
  • 2018-01-04
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多