1

私はExcelマクロを使用して見つけたこの簡単なコードを書きました。

Private Sub Macro3(ByVal Target As Range)
    If Not Intersect(Target, Range("A2:A2")) Is Nothing Then
        Application.EnableEvents = False
        Range("A3:A31").Value = Range("A2:A30").Value
        Application.EnableEvents = True
    End If
End Sub

しかし、作成した後、マクロを見つけることができず、VBA エディターで実行することもできません。私を助けてください。私は使っているms office 2010

編集

私が実際に実装したいもの。

シートの A1 セルに継続的に変化する値があります。それが変更されるとすぐに、それをA2にコピーし、A2の値をA3などにコピーしたい...

4

2 に答える 2

2

ビデオの01:00に説明されているように、

  • コードは Sheet1 (またはサーバー データのキャプチャに使用するシート) に配置する必要があります。つまり、VBA の左上のプロジェクト エクスプローラー ペインでシートの名前をダブルクリックして、そのコード ウィンドウにアクセスする必要があります。

  • Sub() の名前は、Youtube に示されているとおりに正確に使用する必要があります ... Private Sub Worksheet_Change(ByVal Target As Range)。コードを手で入力するか、コード ウィンドウの上の選択ボックスから [ワークシート] と [変更] を選択します。「ワークシート」を選択すると最終的に自動的に作成される「Sub Selection_Change」サブを削除します ( を含むEnd Sub)。

  • 特定のIf Not Intersect(...)セルの変更のみが残りのコードによって処理されることを気にします

  • 最初の行にブレークポイントを設定すると ( Private Sub ...Debug/Toggle Breakpoint または {F9} を使用)、{F8} を使用してコードをステップ実行し、監視することができます。

編集:

いくつかのグーグルの後...=RTD()変更マクロをトリガーしません(多くの人を失望させます)-そのため、さまざまな戦略が必要です。

=RTD()時々データをフェッチし(時間間隔X)、現在の[A2]とは異なるセルCに入れます。すべての X/2 を実行し、C <> [A2] かどうかをチェックするコード ブロックを作成できます ... はいの場合は C を [A2] に移動し、古い値を下にコピーします。

例:

モジュール「TimerFunctions」を作成し、このコードを追加します

Public IsTimer As Boolean

Sub TimerSet(IntervalSec As Date, TimerProcName As String)
    If IsTimer Then Application.OnTime Now() + IntervalSec, TimerProcName, , True
End Sub


Sub TimerAction()
    ' look for new value ... e.g. compare RTD cell [A1] with last stored value [A2]
    If [A2] <> [A1] Then
        ' your original code - move whole stack one down
        Range("A3:A31").Value = Range("A2:A30").Value
        ' copy new value on top of stack
        [A2] = [A1]
    End If

    ' do it again in 2 seconds
    TimerSet TimeValue("00:00:02"), "TimerAction"
End Sub

シート1

Private Sub Worksheet_Activate()
    IsTimer = True
    TimerSet TimeValue("00:00:02"), "TimerAction"
End Sub

Private Sub Worksheet_Deactivate()
    IsTimer = False
End Sub

2 秒ごとに RTD 関数で新しい値がチェックされ、見つかった場合はその値がスタックの一番上に保存され、残りの 30 は 1 プッシュ ダウンされます。これは、シートにいる限りすぐに機能します。Sheet2 に変更する (= Sheet1 を無効にする) と、Sheet1 に戻る (= シートを有効にする) まで、このメカニズムは停止します。

この時限処理が常に実行される必要がある場合は、アクティブなシートが別のシートであってもすべてが機能するように、セルのアドレス指定にもう少し力を入れる必要があります。

于 2013-08-26T07:37:09.833 に答える
0

次のマクロを実装して試すこともできます

Sub Macro()
  Dim n As Integer
    n = 1
  Do
    Application.EnableEvents = False
    Range("A2").EntireRow.Insert
    Range("A2").Value = Range("A1").Value
    Application.Wait Now + TimeValue("0:00:10")
    Application.EnableEvents = True
  Loop Until n != 1
End Sub

定期的な時間間隔でデータ列バイスを保存できるようになりました。

于 2013-09-03T10:07:49.377 に答える