0

我有火车到达/出发时刻表,每条支线都在单独的一行。我需要让电子表格自动检测单元格中的变化,并在相同的时间内将所有单元格从它向右更改。单元格具有时间格式。我怎么做?


到目前为止我已经尝试过:

我在 SE 上的其他问题中找到了这段代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub

但是我无法理解将它放在哪里以及如何使其自动工作,除了为特定范围工作之外,这可能与我发现它的问题不同。


UPD:我在 VBA 中寻找的逻辑:

  1. 等到一个单元格被选中,如果它有时间格式,将其值复制到Tmp.
  2. 将新旧值之间的差异保存到Tmp.
  3. 如果右侧的单元格包含某些内容并且其格式为Time,请添加Tmp

    继续,直到单元格为空。

4

3 回答 3

0

如果您知道时间之间的差异有多大,那么您可以根据该差异计算新时间。

例如 A1 是10:07,A2 是10:14。不必每次都单独输入,您可以将 A2 设置为=A1+TIME(0,7,0). 然后,当您将 A1 更改为 时10:15, A2 将自动更改为10:22

于 2012-12-17T20:03:09.900 回答
0

好的,这可能会让您朝着正确的方向开始:

您首先要存储所有原始单元格值。因此,以下 VBA 代码将 A 列中前 200 行的值存储到一个数组中。您需要先运行此代码,可能是在打开工作簿时:

Dim contents(200) As Variant
Public Sub StoreOriginalValues()
    ' save all existing values
    For r = 1 To 200  ' change for number of rows you have
        contents(r) = Worksheets(1).Cells(r, 1).Value
    Next
End Sub

存储原始单元格值后,您可以在 Worksheet_Change 事件中放置代码,以便每当用户更改 A 列中的单元格时,您都可以比较原始值和新值并找出差异。然后,您可以将此差异应用于该行中的其余列:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Column = 1 Then  ' only check for changes in column A
        originalvalue = contents(Target.Row)
        newvalue = Target.Value
        contents(Target.Row) = Target.Value

        difference = newvalue - originalvalue
        Set chgcell = Cells(Target.Row, Target.Column + 1)

        Do While Not IsEmpty(chgcell)
            chgcell.Value = chgcell.Value + difference
            Set chgcell = chgcell.Offset(0, 1)  ' move one column to right
        Loop
End If

End Sub

现在这段代码绝不是完美的。例如,它不会检查他们是否输入了有效时间。它也不会检查在该行的其余列中输入的值是否是时间或文本或诸如此类。但就像我说的,我希望它能为你指明正确的方向。

于 2012-12-17T21:58:56.057 回答
0

我的解决方案:

Dim oldVal
Dim diff

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldVal = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
ActiveCell.Offset(-1, 0).Select
Application.EnableEvents = True
diff = Target.Value - oldVal

If Not diff = 0 Then
While Not ActiveCell.Offset(0, 1) = "#"
Application.EnableEvents = False
ActiveCell.Offset(0, 1).Select
Application.EnableEvents = True

If Not ActiveCell Is Nothing _
And Not ActiveCell = "" _
And TypeName(ActiveCell) = TypeName(ActiveCell.Offset(0, -1)) Then

Application.EnableEvents = False
ActiveCell.Value = ActiveCell.Value + diff
Application.EnableEvents = True

End If
Wend
End If

End Sub

这是我很长一段时间以来第一次使用 VB,所以代码很糟糕,但它确实有效。

于 2012-12-17T23:15:07.323 回答