2016-05-09 51 views
1

我在表單上構建了一個名爲report的數據驗證列表,每次從列表中選擇一個項目時,我需要運行一個宏。現在我有下面的代碼,但它不起作用。它在VBA運行,但是當我選擇在我的工作表中的項目也不會跑,好像我當你已經改變了沒有提及宏在數據驗證選擇後運行事件宏

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Target.Address(True, True) = "$B$3" Then 
     Select Case Target 
      Case "ABCP" 
       Call Macro1 
      Case "Accounting Policy" 
       Call Macro2 
      Case Else 
        'Do Nothing 
     End Select 
    End If 
End Sub 
+0

的'Worksheet_SelectionChange(BYVAL目標作爲範圍)'子被稱爲每次你在工作表中選擇一個範圍。您選擇的範圍將作爲子目錄中的「Target」參數傳遞。如果您選擇了「$ B $ 3」單元格,則只會在'If'語句內執行您的代碼。 –

+0

如果我使用Worksheet_Change,該怎麼辦? –

+0

每次更改單元格值時都會調用Worksheet.Change https://msdn.microsoft.com/en-us/library/office/ff839775.aspx –

回答

2

如果你想運行的程序(從數據驗證列表中選擇,然後你想要一個Worksheet_Change事件宏,而不是一個Worksheet_SelectionChange。

此外,如果工作表上的任何內容將要改變,那麼你將要禁用事件,所以事件宏不要試圖在自己之上運行。

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$B$3" Then 
     On Error GoTo bm_Safe_Exit 
     Application.EnableEvents = False 
     Select Case Target.Value2 
      Case "ABCP" 
       Call Macro1 
      Case "Accounting Policy" 
       Call Macro2 
      Case Else 
        'Do Nothing 
     End Select 
    End If 
bm_Safe_Exit: 
    Application.EnableEvents = True 
End Sub 

當B3從列表中選擇新值時,應啓動正確的子過程。如果m Macro1和Macro2繼續存在問題,您將不得不提供更多的細節(和代碼)。

+0

非常感謝您的回答。只是一個愚蠢的問題,我應該將這些代碼放在模塊中的宏代碼之後,還是應該放在工作表中? –

+0

像Worksheet_Change這樣的事件宏只能從工作表代碼表而不是模塊代碼表中操作。右鍵單擊工作表的名稱選項卡,然後選擇查看代碼。當VBE打開時,粘貼到標題爲** Book1 - Sheet1(Code)**的工作表中。 – Jeeped

+0

我覺得它現在非常接近,但爲什麼它在運行之後要求我選擇宏? –

0

上面的代碼似乎對我來說工作得很好。

你把代碼放在工作表代碼中嗎?而不是一個模塊?

enter image description here

+0

是的,我已經完成了 –