2016-09-21 36 views
1

我在「AK」列中有一個數據,在「AL」列中有一個按鈕;有幾百行,所有按鈕只有一個宏,因爲它使用基於它所在行的相對引用。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 

注:我的想法從這裏檢查依賴的細胞:How can I run a VBA code each time a cell get is value changed by a formula?

+0

謝謝!只要目標手動更新並且只要單個單元格更新,它就可以工作。如果我更新多個單元格,那麼它不起作用,但這不是什麼大問題。 此外,我希望按鈕更新的基礎上計算的單元格,即根據其他單元格的值更新的單元格;那可能嗎? – fileinster

+0

檢查更新後的代碼 - 只有當單個單元格更改並且與計算單元格一起工作時,它纔會觸發。 –

+0

太棒了!我不得不放入一些If語句來保護它,否則它會變得有點眩暈,現在它運行良好。 – fileinster

相關問題