1

以下のExcel2007のVBAコードを修正するのを手伝ってください。誰かが私のニーズに合ったフォーラムの1つでこのコードを提供してくれました。しかし、このコードを実行しているときに問題が発生します。私はプログラマーではないので、修正できませんでした。だからこれを克服するのを手伝ってください。

問題は....メッセージが最初から最後まで継続的にポップアップしていることです。例:セル「P7」の値が0を超えて1に達すると、問題のないポップアップメッセージが表示されます。ただし、セルの値は他のセル(リアルタイムデータ)の計算から導出されるため、セルの値が1から2、2から2.5、3などのように0を超えて変動し続ける場合があります。このため、セル値が連続して増加するたびにポップアップメッセージが表示されます。セルの値が0を超えた場合にのみポップアップするはずですが、0.5から1、1から2、2から2.5、3などの増分ごとではありません。上記の問題に加えて、たとえば、セル値「P7」が0を超えて1.5になり、そこに留まり、その後、「P8」または「P9」、あるいはその両方のセル値が0を超えます。

以下は参考のためのコードです。

Private Sub Worksheet_Calculate() 
    'Dimension variables
    Dim c As Range, Str1 As String

    'Set up a range to loop thru
    For Each c In Range("P7:P77,S7:S77")
        'Test if that cell contains a number >0
        If IsNumeric(c.Value) And c.Value > 0 Then
            'Which column are we in to calculate
            'The offset to column U and decide whether
            'to use Buy or Sell as our string
            Select Case c.Column
                Case Is = 16
                    Str1 = "Buy "
                    oset = 5
                Case Is = 19
                    Str1 = "Sell "
                    oset = 2
            End Select

           'Popup the message box
            MsgBox Str1 & c.Offset(, oset)
        End If
    Next
End Sub
4

1 に答える 1

0

まず、私もプログラマーではありませんが、ここではある程度のコーディングの理解が求められます。これを解決するには、私が恐れている最初の基本を超えてしまいます。それを念頭に置いて、これがあなたの質問に対する私の答えです。

これを解決するには、次の 2 つのことを行います。

  1. 変更前の範囲の状態を保存する
  2. すでにこのチェックに入っていることを示すステータスを持っているため、再度アクティブ化する必要はありません

PART 1 状態の保存

チェックした範囲の状態を同じサブルーチンに保存します。使用されていないブックの一部にセルをコピーするか、パブリック変数として VBA コードに保存します。

次に、確認に加えてIf IsNumeric(c.Value) And c.Value > 0、最後に保存した数値が <=0 であるかどうかを確認する必要があります。したがって、If ステートメントは次のようになります。

If IsNumeric(c.Value) And c.Value > 0 And d.Value <= 0 Then

dコピー セルはどこにありますか。これらのセルが配置されている場所を決定する必要があります (できれば、固定オフセットを使用するか、まったく同じセル内の非表示のシートに配置する必要があります!

または、次元が 7 ~ 77、16 ~ 19 のパブリック変数 pubVar() を使用して、Workbook_Open で次元化できます。

If IsNumeric(c.Value) And c.Value > 0 And pubVar(c.Row(), c.Column())<= 0 Then

どのルートを使用する場合でも、スクリプトの最後に、セルの状態を実際に保存するセクションを含める必要があります。Range("P7:P77,S7:S77").Copy 値を に貼り付けますRange(<where you want it>).PasteSpecial ...。または、変数に値を割り当てることによって、Variant

PART 2 ステータスを持つ

パブリック変数を使用できるステータスを取得するには、booAlreadyChecking というブール値を取得し、そのブール値 + コードをチェックして、現在のコードにラップされた値を変更します。

If Not booAlreadyChecking Then 'Check if there is already another check running
    booAlreadyChecking = True 'Indicate that there is already a check so not another one will be started 
    For Each c In Range("P7:P77,S7:S77")
        ...
    Next
    booAlreadyChecking = False 'Enable a new check once this one is completed
End If
于 2013-03-14T16:05:26.993 に答える