如果选择一个单元格(从多个纸上),请显示消息框



对于初学者来说,我是自学的并且仍在学习(我从这个网站中学到了很多)。话虽这么说,请不要以为有些明显。如果您的解决方案太复杂,我将需要更改代码。

我想完成的是;如果您在" 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

在现实生活中,这对于诸如将特殊格式应用于文本框时将其焦点应用于文本框,并且在大量对象上具有一致的情况而无需数百行重复代码时,这可能非常有用。

我希望这很有帮助!

最新更新