如果选中一个单元格(从多个表单中select),则显示消息框

对于初学者来说,我是自学成才,还在学习(我从这个网站学到很多东西)。 话虽如此,请不要以为明显。 如果解决scheme太复杂,我将需要帮助修改代码。

我想要完成的是 如果在“Sheet3”,“Sheet4”和“Sheet5”上select单元格A10,则需要一个消息框,其中显示来自Sheets(“Sheet6”)的信息。Range(“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 

我想要发生什么; 如果您处于“工作表3”,“工作表4”和“工作表5”中,并在这三个工作表中selectA10,则会出现在代码中定义的消息框中。

什么是工作; 目前这是一个直接在“Sheet5”中的私有子。 当它在这里时,如果单元格A10(在“Sheet5”中)被选中,来自“Sheet6”A1的信息就会出现在消息框中。

什么不工作; 因为这是一个私人小组,并在“Sheet5”里面,我正努力使它与“Sheet3”和“Sheet4”中的A10一起工作。

我试图通过移动代码并将其声明为公共子代码来为所有表单工作,但是目前为止还没有成功。

Worksheet_SelectionChange必须位于工作表的专用模块中。 然而,它然后可以调用公共模块中的另一个例程

所以,如果你把

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) CheckSelection target End Sub 

在你的三个工作表中,你可以把你的代码放在一个公共模块中

  Public Sub CheckSelection(Target as range) etc 

对于不同的方法,只需要在ThisWorkbook对象中input一次。

 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事件时,这是发生在特定对象的事件。 这就是为什么它只适用于具有代码背后的代码片。 要在多个工作表中完成这项工作,您可以采取以下三种方法之一。

选项1 :将代码复制到每个工作表对象。 从某种意义上来说,这是最简单的方法,但是在多个位置维护相同代码的副本可能很麻烦。

选项2 :将您的代码放入标准模块的公共function中。 这样,您可以在一个位置维护您的代码例程,并使用最小的必要代码从每个工作表中调用此代码。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) MySpecialFunction Target End Sub 

对于大多数情况,您可能会发现这是处理需求的最有效的方法。

选项3 :另一种更高级的方法是使用包装类对象。 这使您可以dynamic地将您的function应用于任何活动工作表,而无需将(选项2)代码添加到每个工作表。 虽然这更复杂,但是它允许您将事件驱动的代码应用到任何工作表,甚至是用户创build的新代码。

为此,请在您的项目中创build一个类模块,并将其命名为clsMyClass 。 然后粘贴下面的代码:

 Option Explicit Public WithEvents MySheet As Worksheet Private Sub MySheet_SelectionChange(ByVal Target As Range) ' Do neat stuff here... End Sub 

这里的关键是WithEvents声明。 这就是允许你从一个对象variables中获取一个事件 。 (但是你只能从一个类对象,而不是一个标准模块。

然后,在您的Workbook_Open()事件或项目中的其他位置,可以添加将所有当前工作表添加到集合的function,使您可以利用所有这些工作表的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 

在现实生活中,这对于诸如将特殊格式应用于文本框(当它具有焦点时)以及在不需要数百行重复代码的情况下使这种行为在大量对象上保持一致是非常有用的。

我希望这是有帮助的!