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

OK、これで正しい方向に進むことができます。

最初に、すべての元のセル値を保存する必要があります。したがって、次のVBAコードは、最初の200行の列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

現在、このコードは決して完璧ではありません。たとえば、有効な時刻を入力したかどうかはチェックされません。また、行の残りの列に入力された値が時間かテキストかどうかを確認しません。しかし、私が言ったように、それがあなたを正しい方向に向けることを願っています。

于 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 に答える