有沒有辦法在Excel中使用VBA捕獲單元格中的單擊操作?我並不是指Worksheet_SelectionChange
事件,因爲如果多次單擊單元格,它將不會觸發多次。 BeforeDoubleClick
也不能解決我的問題,因爲我不想要求用戶雙擊那個順序。Excel中的OnClick VBA
我目前的解決方案可以與SelectionChange
事件一起工作,但它似乎需要使用全局變量和其他次優編碼實踐。它也似乎容易出錯。
有沒有辦法在Excel中使用VBA捕獲單元格中的單擊操作?我並不是指Worksheet_SelectionChange
事件,因爲如果多次單擊單元格,它將不會觸發多次。 BeforeDoubleClick
也不能解決我的問題,因爲我不想要求用戶雙擊那個順序。Excel中的OnClick VBA
我目前的解決方案可以與SelectionChange
事件一起工作,但它似乎需要使用全局變量和其他次優編碼實踐。它也似乎容易出錯。
顯然,沒有完美的答案。但是,如果你想允許用戶
那麼最簡單的方法似乎是將焦點從選定的單元格移開,以便點擊它將觸發Select事件。
一種選擇是按照上面的建議移動焦點,但這會阻止單元格編輯。另一種選擇是將選擇範圍擴大到一個單元格(左/右/上/下),因爲這允許編輯原始單元格,但是如果該單元格單獨再次單擊,則會觸發Select事件。
如果您只想捕獲單個單元格列的選擇,則可以在右側插入隱藏列,擴展選擇以在用戶單擊時將隱藏單元格包含在右側,並且這會給您一個可編輯的每次單擊它時可以捕獲的單元格。代碼如下所示
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'prevent Select event triggering again when we extend the selection below
Application.EnableEvents = False
Target.Resize(1, 2).Select
Application.EnableEvents = True
End Sub
我不這麼認爲。但是,您可以創建一個形狀對象(或者藝術字或類似的東西)鉤子Click事件並將該對象放置到指定單元格的位置。
SelectionChange是內置於Excel對象模型中的事件。它應該完全按照你的想法做,任何時候用戶點擊任何地方都可以觸發......
我不確定我是否理解你對全局變量的反對,如果你使用Application.SelectionChange事件。但是,如果您使用工作簿類代碼(用於捕獲Workbook.SelectionChange事件)或Worksheet類代碼隱藏(以捕獲Worksheet.SelectionChange)事件,則不需要任何操作。 (除非你的問題是VBA中的「全局變量重置」問題,對於這個問題只有一個解決方案:任何地方都有錯誤處理,不要允許任何未處理的錯誤,而是將錯誤記錄和/或「軟報告」爲一條消息)
您可能還需要捕獲Worksheet.Activate()和Worksheet.Deactivate()事件(或Workbook類中的等效項)和/或Workbook.Activate和Workbook.Deactivate( )事件,以便您知道用戶何時切換了工作表和/或工作簿。該窗口激活和停用事件應該使這種方法完成。他們都可以調用相同的確切程序,但是,它們都表示相同的事情:如果您願意,用戶更改了「焦點」。
如果你不喜歡VBA,順便說一句,你可以使用VB.NET或C#做同樣的事情。
[編輯:當用戶在當前選中的單元格內點擊時,Dbb對SelectionChange事件做出了非常好的評價,如果你需要選擇它,那麼你需要使用子類。]
爲了捕獲重複點擊同一個單元格,您需要將焦點移動到不同的單元格,以便每次單擊,你實際上在移動選擇。
當您單擊任何單元格時,下面的代碼將選擇屏幕上可見的左上方單元格。顯然,它有一個缺陷,即它不會在左上方的單元格中捕獲點擊,但可以進行管理(例如,如果活動單元格在左上方,則選擇右上角的單元格)。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'put your code here to process the selection, then..
ActiveWindow.VisibleRange.Cells(1, 1).Select
End Sub
這爲我工作.....
Private Sub Worksheet_Change(ByVal Target As Range)
If Mid(Target.Address, 3, 1) = "$" And Mid(Target.Address, 2, 1) < "E" Then
' The logic in the if condition will filter for a specific cell or block of cells
Application.ScreenUpdating = False
'MsgBox "You just changed " & Target.Address
'all conditions are true .... DO THE FUNCTION NEEDED
Application.ScreenUpdating = True
End If
' if clicked cell is not in the range then do nothing (if condttion is not run)
End Sub
注:此功能在實際使用中重新計算數據透視表,如果用戶在數據範圍內增加了一個項目的A4到D500。在那裏受到保護,並在片未受保護的部分,從而爲點擊支付的實際檢查,如果列小於「E」只要你想包含或排除任何數量的區域中的邏輯可以得到複雜的
block1 = row > 3 and row < 5 and column column >"b" and < "d"
block2 = row > 7 and row < 12 and column column >"b" and < "d"
block3 = row > 10 and row < 15 and column column >"e" and < "g"
If block1 or block2 or block 3 then
do function .....
end if
嗯,這樣做的麻煩在於我想知道它是什麼單元格,並且有我想要捕捉它的任意數量的行,以及它被捕獲的行(SelectionChange給我一個很好的範圍爲此)... – haslo 2008-10-07 14:46:09
用戶應該也能夠輕鬆地編輯工作表,沒有像「你必須點擊這個按鈕,如果你手動添加一條新線不會工作」的限制。但我相當肯定有沒有辦法(VBA不會再讓我感到驚訝),我不妨正式接受你的答案...... – haslo 2008-10-07 14:47:55