0

のセルに入力された値を更新しようとしていColumn Aます。ほとんど期待どおりに動作する次のスクリプトがあります。セルを更新しますが、指数関数的に大きな数に達するまで更新を続けます。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 Then
        intcolumn = Target.Column
        introw = Target.Row
        Cells(introw, intcolumn) = Cells(introw, intcolumn) * "12"
    End If
End Sub

Aに任意の数字を入力できるようにする方法はありますか?12倍するのは1回だけですか?(1 = 12、2 = 24、3 = 36、4 = 48 など)

4

2 に答える 2

2

セルの値を乗算すると、Worksheet_Changeこのマクロをトリガーするイベントがトリガーされます。したがって、セルA1に「1」を入力すると、これは乗算1 * 12 = 12を引き起こす変更ですが、これも変更であり、12 * 12 = 144を引き起こし、これも変更などです。それが繰り返されている理由です。

これで修正され、操作を実行する前にイベントを無効にしてから、サブルーチンを終了する前にイベントを再度有効にする必要があります。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Application.EnableEvents = False 'Prevent looping based on the 'change' caused by multiplication
    intcolumn = Target.Column
    introw = Target.Row
    Cells(introw, intcolumn) = Cells(introw, intcolumn) * "12"
Application.EnableEvents = True 'allow events again
End If
End Sub
于 2012-12-12T15:41:43.410 に答える
2

変更により、Worksheet_Change イベントが再びトリガーされます。それを追跡するには、何らかのフラグが必要です。

Private changeFlag As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 And Not changeFlag Then
        changeFlag = True
        intcolumn = Target.Column
        introw = Target.Row
        Cells(introw, intcolumn).Value = Cells(introw, intcolumn).Value * 12
    Else
        changeFlag = False
    End If
End Sub
于 2012-12-12T15:38:42.823 に答える