2008-10-07 90 views
19

有沒有辦法在Excel中使用VBA捕獲單元格中的單擊操作?我並不是指Worksheet_SelectionChange事件,因爲如果多次單擊單元格,它將不會觸發多次。 BeforeDoubleClick也不能解決我的問題,因爲我不想要求用戶雙擊那個順序。Excel中的OnClick VBA

我目前的解決方案可以與SelectionChange事件一起工作,但它似乎需要使用全局變量和其他次優編碼實踐。它也似乎容易出錯。

回答

18

顯然,沒有完美的答案。但是,如果你想允許用戶

  1. 選擇特定的細胞
  2. 讓他們改變這些細胞, 和
  3. 陷阱每一次點擊,甚至重複點擊 在同一個小區,

那麼最簡單的方法似乎是將焦點從選定的單元格移開,以便點擊它將觸發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 
0

我不這麼認爲。但是,您可以創建一個形狀對象(或者藝術字或類似的東西)鉤子Click事件並將該對象放置到指定單元格的位置。

+0

嗯,這樣做的麻煩在於我想知道它是什麼單元格,並且有我想要捕捉它的任意數量的行,以及它被捕獲的行(SelectionChange給我一個很好的範圍爲此)... – haslo 2008-10-07 14:46:09

+0

用戶應該也能夠輕鬆地編輯工作表,沒有像「你必須點擊這個按鈕,如果你手動添加一條新線不會工作」的限制。但我相當肯定有沒有辦法(VBA不會再讓我感到驚訝),我不妨正式接受你的答案...... – haslo 2008-10-07 14:47:55

1

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事件做出了非常好的評價,如果你需要選擇它,那麼你需要使用子類。]

+0

全局變量只是醜陋的,這就是全部:)我之所以用這裏的原因特別是因爲我還在事件處理期間更改了工作表,將行復制粘貼到另一個表中。 它實際上只是一個小應用程序,VB.NET或C#(雖然我更喜歡它們)略高於頂端。 – haslo 2008-10-09 08:51:54

+0

除此之外,非常好的見解,謝謝! – haslo 2008-10-09 08:52:31

5

爲了捕獲重複點擊同一個單元格,您需要將焦點移動到不同的單元格,以便每次單擊,你實際上在移動選擇。

當您單擊任何單元格時,下面的代碼將選擇屏幕上可見的左上方單元格。顯然,它有一個缺陷,即它不會在左上方的單元格中捕獲點擊,但可以進行管理(例如,如果活動單元格在左上方,則選擇右上角的單元格)。

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 
0

這爲我工作.....

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