2014-02-14 118 views
4

我有一个非常简单的VBA脚本时,大写选定单元格:Excel的VBA - 善用列所有选定单元格上双击

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
    ActiveCell.Value = UCase(ActiveCell.Value) 
End Sub 

它能正常工作,但有时我想利用所有的细胞在选定的列中,但只有当我双击列本身。似乎我不能在点击列字段时收到Worksheet_BeforeDoubleClick的事件。

有没有一些解决方法呢?

+0

我能想到用'SelectionChange'一种解决办法,但是这将需要一个三击我猜 – sam092

+0

@ sam092请张贴代码为例。如果没有人提出任何更好的,我会接受该解决方案:) – julumme

+0

为什么不按快捷键时,按下将做你所需要的? –

回答

1

就像我刚才提到的,为什么不是一个快捷键?您可以为您的宏的快捷键如下图所示

enter image description here

现在,所有你需要做的就是选择列,按下快捷键。

而且,代替循环遍历列中的每个单元格,这里是基于ONE LINER HACK的代码Peter Albert

把它放在一个模块中。

Sub ChangeToUpper() 
    Dim rng As Range 

    '~~> Check if what the user selected is a valid range 
    If TypeName(Selection) <> "Range" Then 
     MsgBox "Select a range first." 
     Exit Sub 
    End If 

    Set rng = Selection 

    rng = WorksheetFunction.Transpose(Split(UCase(Join(_ 
      WorksheetFunction.Transpose(rng), vbBack)), vbBack)) 
End Sub 

截图:

enter image description here

+0

啊,这是很大的妥协,我会接受这个。谢谢! – julumme

1

如果DoubleClick不是必需的,您可以使用BeforeRightClick。如果你想保持原来的右键快捷菜单,你可以导入module和检查按Ctrl/ALT /移

Option Explicit 

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 
    Dim condition As Boolean 
    condition = True ' check Ctrl/Alt/Shift using http://www.cpearson.com/excel/KeyTest.aspx 
    If condition Then 
     MsgBox "Right Click at " & Target.Address 
     Cancel = True 
    End If 
End Sub 

另一种选择是在宏选项Ctrl+[]分配给一个宏,而不是一个事件处理和调用宏来处理Selection对象。

+0

我是新来的这个VBA的东西,但例如拿着一个控制或shift键和按列字段将完全正常,而不是双击我认为。有没有简单的电话来检查一些关键的状态? (而不是导入一个完整的模块) – julumme

+0

好吧,如果你是新的,那么导入一个模块,并使用API​​函数本身可以用作练习:)你需要帮助导入模块和检查条件吗? –

+0

我想这不是真的那么多关于导入问题,但人们因为他们不喜欢未知的东西而不得不查看导入的代码的大块大块而感到恼火:) – julumme