2016-09-21 8 views
1

列「AK」のデータと列「AL」のボタンがあります。数百行あり、その行に基づいて相対参照を使用するため、すべてのボタンに1つのマクロしかありません。Excel VBA - 隣接セルの更新に基づいてボタンの表示を変更します。

隣接するセルにデータがある場合にのみボタンを表示します。次の擬似コードは、私が達成しようとしているものを説明します

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Column = 37 Then 
     If Target.Value = 0 Then 
      Shapes(Target.offset(0, 1)).Visible = False 
     Else 
      Shapes(Target.offset(0, 1)).Visible = True 
     End If 
    End If 
End Sub 

これを行う理由は、AKの値が他の値に基づいて計算し、一度だけ、すべての必須フィールドが完了している表示されていることです。ボタンは、すべての詳細が完了したら、自動化タスクでのみ使用可能にする必要があります。個々のボタンを個別に呼び出しなくても、実際のコードはどのように動作しますか?

答えて

1

シェイプをシート上の位置で直接参照できるかどうかはわかりません。
このコードでは、変更したばかりのセルの右にあるものが見つかるまで各シェイプが表示され、セルの内容に基づいて可視性が変更されます。
(Target.Value <> "")は、TRUE/FALSEを返します。
これは、ボタンが正しいセルに配置されている(わずかに高すぎると上のセルを返す)場合にのみ機能します。

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim shp As Shape 

    For Each shp In ThisWorkbook.Worksheets("Sheet1").Shapes 
     If shp.TopLeftCell.Address = Target.Offset(, 1).Address Then 
      shp.Visible = (Target.Value <> "") 
      Exit For 'Exit the loop - the correct button has been found. 
     End If 
    Next shp 

End Sub 

編集:
それは単一のセルのみが変更され、その後、変更されたセルの各依存性細胞に注目されていることを確認しますので、私は、コードを更新しました。
これはおそらく、依存セルが別のシートにある場合にはうんざりします。

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim rUpdated As Range 
    Dim shp As Shape 
    Dim rCell As Range 

    If Target.Cells.Count = 1 Then 
     'Hopefully someone will have better code than On Error.... 
     On Error Resume Next 
     Set rUpdated = Range(Target.Dependents.Address) 
     On Error GoTo 0 
     If Not rUpdated Is Nothing Then 
      'Look at each dependent cell in rUpdated. 
      For Each rCell In rUpdated 
       'Look at each shape in the sheet and cross-reference with rCell. 
       For Each shp In Target.Parent.Shapes 
        If shp.TopLeftCell.Address = rCell.Offset(, 1).Address Then 
         shp.Visible = (Target.Value = 0) 
         Exit For 'Exit the loop - the correct button has been found. 
        End If 
       Next shp 
      Next rCell 
     End If 
    End If 

End Sub 

NB:How can I run a VBA code each time a cell get is value changed by a formula?

+0

ありがとう:私はここから依存性細胞を検査するためのアイデアを得ました!ターゲットが手動で更新され、単一のセルが更新されている限り、ターゲットは更新されます。複数のセルを更新すると動作しませんが、それは大したことではありません。 また、計算されたセル、つまり他のセルの値に基づいて更新するセルに基づいて、ボタンを更新したいと考えました。それは可能ですか? – fileinster

+0

更新されたコードを確認します.1つのセルが変更され、計算されたセルで動作する場合にのみ発生します。 –

+0

驚くばかり!私はそれを保護するためにいくつかのIfステートメントを入れなければなりませんでした。そうでなければ少しぎこちなくなり、今はうまくいきます。 – fileinster

関連する問題