对于初学者来说,我是自学的并且仍在学习(我从这个网站中学到了很多)。话虽这么说,请不要以为有些明显。如果您的解决方案太复杂,我将需要更改代码。
我想完成的是;如果您在" Sheet3"," Sheet4"one_answers" Sheet5"上选择单元格A10,那么我希望一个消息框中出现在Sheets(" Sheet6")的信息中。范围(" A1")。
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Count = 1 Then
If Not Intersect(Target, Range("A10")) Is Nothing Then ' this range is where you click to get the msgbox
Dim rng As Range, s As String, x As String
Set rng = Sheets("Sheet6").Range("A1") ' this defines x
s = "Define: " ' s is what appears first
x = s & rng.Value ' x is what appears after s
MsgBox x
End If
End If
End Sub
我想发生的事情;如果您在" Sheet3"," Sheet4"one_answers" Sheet5"中,并在这三张纸中选择A10,则将显示在代码中定义的消息框中。
什么在起作用;目前,这是直接在" Sheet5"中的私人子。当它在这里时,如果选择了单元格A10(在" sheet5"中),则根据我想要的消息框中的" sheet6" a1中的信息。
什么不起作用;因为这是一个私人子,在" sheet5"内
我试图通过移动代码并将其宣布为所有工作表工作,但到目前为止都没有成功。
对于不同的方法,只需在ThisWorkbook
对象内输入一次。
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Select Case Sh.Name
Case Is = "Sheet3", "Sheet4", "Sheet5"
If Target.Address = "$A$10" Then
MsgBox Worksheets("Sheet6").Range("A1").Value
End If
End Select
End Sub
Worksheet_selectionChange必须在工作表的私人模块中。但是,它可以在公共模块中调用另一个例程
所以如果您放置
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
CheckSelection target
End Sub
进入三张纸中的每一个,然后可以将代码放在公共模块中
Public Sub CheckSelection(Target as range)
etc
听起来像一个有趣的项目!要扩展答案的更多信息,当您使用Worksheet_SelectionChange
事件时,这是发生在特定对象的事件。这就是为什么它仅适用于在其背后具有代码的一张纸。要在多个纸上进行这项工作,您可以采用以下三种方法之一。
选项1 :将代码复制到每个工作表对象。从某种意义上说,这是最简单的方法,但是在多个位置维护相同代码的副本可能是凌乱的。
选项2 :将代码放在标准模块中的公共功能中。这样,您可以在一个位置维护代码例程,并使用最少的必要代码从每个工作表中调用。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MySpecialFunction Target
End Sub
在大多数情况下,您可能会发现这是满足需求的最有效方法。
选项3 :另一种更高级的方法是使用包装类别对象。这使您可以动态地将功能应用于任何活动表,而无需在每个工作表中添加(选项2)代码。虽然这更复杂,但它允许您将事件驱动的代码应用于任何工作表,甚至是用户创建的新工作表。
要执行此操作,在项目中创建一个类模块,然后将其命名clsMyClass
。然后粘贴以下代码:
Option Explicit
Public WithEvents MySheet As Worksheet
Private Sub MySheet_SelectionChange(ByVal Target As Range)
' Do neat stuff here...
End Sub
这里的关键是WithEvents
声明。这就是使您可以从对象变量中点击事件的原因。(但是您只能从类对象而不是标准模块中执行此操作。)
然后在您的Workbook_Open()
事件或项目中的其他地方,您可以添加将所有当前工作表添加到集合中的功能,从而使您可以利用所有这些工作表的SelectionChange
事件,而无需添加代码每个人。
Option Explicit
Private mcolSheets As Collection
Public Sub ActivateCodeForAllWorksheets()
Dim wks As Worksheet
Dim cSheet As clsMyClass
' Initialize module-level collection
Set mcolSheets = New Collection
For Each wks In ActiveWorkbook.Worksheets
' Create new instance of class
Set cSheet = New clsMyClass
' Set to the current worksheet in our loop,
' and add to the collection so the sheet object
' reference perists after this sub finishes.
Set cSheet.MySheet = wks
mcolSheets.Add cSheet
Next wks
End Sub
在现实生活中,这对于诸如将特殊格式应用于文本框时将其焦点应用于文本框,并且在大量对象上具有一致的情况而无需数百行重复代码时,这可能非常有用。
我希望这很有帮助!