将单元格更改为右侧,与当前单元格的更改一样多

时间:2012-12-17 19:45:36

标签: excel vba excel-vba

我有火车到达/离开时间表,每条支线都在一个单独的行上。我需要让电子表格自动检测单元格中的更改,并将所有单元格从中更改为相同的时间。单元格具有时间格式。我该怎么做?


到目前为止我尝试过:

我在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. 如果右侧的单元格包含某些内容且其格式为时间,请向其添加Tmp

    继续直到单元格为空。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分: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的第一次经历,所以代码很糟糕,但它确实有效。