【问题标题】:Event click cell事件点击单元格
【发布时间】:2019-04-11 20:00:21
【问题描述】:

我刚刚创建了一个新文件并放入了数据(A1 到 A10 行),我想知道每次单击单元格 A 时如何从单元格中获取数据,如果它不为空(例如:当我单击 A 列的第三行,以便获得它的值)。 我看到了“Worksheet_SelectionChange”方法,但它不适用于我的示例,因为我们必须打开文件代码并将函数放入其中,我想在创建文件时直接执行此操作。 这是我的例子

sub test(name as string)
  sheet.add

  ActiveSheet.name=name
  i=2

  while i < 10 
    cells(i,1)=i
    i=i+i
  Wend
end sub

【问题讨论】:

  • 您要求提供 VBA 代码,因此需要将其放在您正在创建的工作簿上。您需要什么来检索单击的单元格上的值?如果是用于稍后的过程,您可以将其检索为其他内容,但您仍然需要代码。
  • 有可能有一个worksheet_change,即使它引用了一个工作簿而不是带有代码的工作簿。但是,这将要求代码知道新制作的 wb 是什么。您必须打开第二个 WB 来保存代码
  • 在我的宏启动时创建了我的工作表,因此当我的工作表尚不存在时,我无法插入代码。我已经看过你的链接,但我希望它是我的通用函数,这样它就不会在每次创建工作表时插入
  • @mordiop 那么您每次都在创建一个新的 WS 还是一个新的 WB?

标签: excel vba


【解决方案1】:

Worksheet_SelectionChange 事件不一定必须驻留在特定于工作表的模块中。例如,它还可以驻留在 class module 中,并且对于本例来说很重要的是 ThisWorkbook 模块(尽管它被命名为 Workbook_SheetSelectionChangeevent)。

如果您总是想触发 Workbook_SheetSelectionChange 事件,无论 在选择更改的工作表中,尝试以下操作

'place in the ThisWorkbook module
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

'Do stuff

MsgBox "Changes were made in worksheet: " & Sh.Name, vbInformation

End Sub

如果您只想在最新制作的 WS 上触发事件

1)您可以确保最新制作的 WS 始终是 WB 中的最后一个

'In a regular module
Sub addnwsheet()
Dim shtname As String

With ThisWorkbook

shtname = "temp" & .Sheets.Count
'add a sheet at the end
.Sheets.Add(after:=.Sheets(.Sheets.Count)).Name = shtname

End With

End Sub

'place in the ThisWorkbook module
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

If Sh.Index = ThisWorkbook.Sheets.Count Then
    'Do stuff

    MsgBox "Selection changed in worksheet: " & Sh.Name, vbInformation
End If

End Sub

2) 更安全的方法是将新制作的工作表声明为Global 变量。这些是持久的和公开的。

'In a regular module
Global nwsht As Sheet

Sub addnwsheet()
Dim shtname As String

With ThisWorkbook

    shtname = "temp" & .Sheets.Count
    'add a sheet at the end
    .Sheets.Add(after:=.Sheets(.Sheets.Count)).Name = shtname
    Set nwsht = .Sheets(shtname)

End With

End Sub

'place in the ThisWorkbook module
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

If Sh = nwsht Then
    'Do stuff

    MsgBox "Selection changed in worksheet: " & Sh.Name, vbInformation
End If

End Sub

编辑

如果你想指定事件应该触发的范围

'place in the ThisWorkbook module
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim r as Range
    Set r = Workbooks(REF).Sheets(REF).Range("D2:D100") 'event will only get triggered by this range

    If Not Intersect(Target, r) Is Nothing Then
        'Do stuff

        MsgBox "Selection changed in worksheet: " & Sh.Name, vbInformation
    End If

    End Sub

【讨论】:

  • 我拿走了你的代码,它可以工作。但是这里每个单元格更改都会触发该方法,我希望它只在 B 列上。如果我单击 B 列中的一个单元格,它将开始。谢谢你。谢谢。
  • 我添加了一个代码,您可以使用它指定一个范围@mordiop
猜你喜欢
  • 2012-09-27
  • 2015-09-25
  • 2021-02-07
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多