【问题标题】:VBA - Detecting a cell change within the context of a macroVBA - 在宏的上下文中检测单元格更改
【发布时间】:2013-07-23 15:38:38
【问题描述】:

我正在尝试创建一个宏,允许用户选择一列并将该列的功能扩展到工作表的其他区域。不过,我无法理解如何进行这项工作。该例程的基本逻辑是:

(1) Ask user to select column of interest
(2) Listen for cell click event
(3) Extract the features of the column chosen by the user
(4) Apply relevant features in area of the worksheet where the cell was active at the beginning of the macro

Excel 是否能够“侦听”此类函数中的事件?如果是这样,它将如何实施?谢谢。

更新

我的目标是创建一个可以在任何文件中使用的宏。宏的目的是向表中添加一个附加列,其中包含可用于检查表中项目的复选框。唯一让我失望的是在某些情况下,一个表可能包含彼此不同的合并列。例如:

C1    C2
1     A
1     B
2     A

在 Excel 中,上表可能合并了单元格 A1 和 B1。我希望用户能够灵活地确定是否需要两个复选框(将复选框与第 1 列关联)或三个复选框(将复选框与第 2 列关联)。因此,当宏运行时,我希望提示用户选择其中一列,然后将在该列中观察到的合并放在 C3 中。然后在 C3 中,我将在与表格关联的每个单元格中插入一个复选框。

如果知道要复制哪一列以及距表末尾有多少列,则下面的代码将执行列合并复制/粘贴部分。由于我想在各种表上使用此宏,因此我需要对其进行调整以即时运行。

Sub copyMerges(sourceArea As Range, colOffset As Long)

    Dim row, col As Long
    Dim c, c2 As Range

    col = 1
    For row = 1 To sourceArea.Rows.Count
          Set c = sourceArea.cells(row, col)
          If c.MergeArea.cells.Count > 1 Then
               Set c2 = c.Offset(0, colOffset)
               If c2.MergeArea.cells.Count = 1 Then
                    c2.Resize(c.MergeArea.Rows.Count, 1).Merge
               End If
          End If
    Next col
End Sub

【问题讨论】:

  • 您可以使用设置为 type=8 的输入框来允许用户选择范围...或者您可以使用 worksheet_selectionchange 事件。

标签: excel vba events listener


【解决方案1】:

Excel-VBA 能够执行您所追求的一切。但是您要求的太多而没有提供任何东西(通常,询问者必须包含代码或任何类型的指示,说明他/她尝试了什么以及失败的原因)。

作为一个粗略的介绍(一些有助于研究/开始编码/提出更精确问题过程的指南):

  1. 要求用户选择感兴趣的列 -> 一个消息框 (MsgBox)。
  2. 监听单元格点击 -> 由给定工作表的选择更改事件触发的方法(给定Worksheet VBA file中的Worksheet_SelectionChange,即Microsoft Excel Objects下)。
  3. 提取用户选择的列的特征 -> 你必须对Ranges,更具体地说CellsRowsColumns有一些了解。
  4. 在单元格所在的工作表区域应用相关功能 在宏的开头处于活动状态 -> 与上述相同,您必须对 Ranges 以及 VBA 如何与单元格交互进行一些研究/阅读/试错。

------- 更新

Worksheet_SelectionChange 每次选择更改时都会调用,但您的代码不需要执行;例如,您可以包含以下内容:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If (Selection.Address = "cell name you want") Then
       'YOUR CODE
    End If

    'OR

    If (Selection = "the range you want") Then
       'YOUR CODE
    End If

    'ETC.

End Sub

我坚持认为,这些都是粗略的迹象,表明找到解决问题的正确途径。你的问题是可能吗?答案是:是的+一些迹象。但是不要指望一个完整的工作代码和照顾每一个细节(主要是当你没有提供任何代码时)。我希望现在一切都清楚了。

------- 问题更新后更新

现在事情变得更加清晰了,但您仍然要求太多事情,并且或多或少地提出了一般性的问题。我将在上面的几行中给出进一步的指示,即帮助您开始研究/编码的初步想法:

  • 在你的情况下,我要做的第一件事是仔细考虑我想要什么,并确保我无法以更简单的方式完成它;例如:只有一个宏并提供它(宏以及逻辑上关联的 Excel 文件)并要求用户在此文件中粘贴他们想要的内容。这个小小的改变会让事情变得轻松很多。
  • 如果您不想考虑上述替代方案,则必须将研究重点放在处理外部工作簿上。最棘手的问题是处理单元选择跟踪和相关事件。 Tim Williams 提供的链接肯定会在这方面为您提供帮助。我个人对这种方法的实际可靠性有些怀疑,主要是在同时处理多个工作簿时。您必须进行研究/测试,不仅在实际实施方面,而且在可靠性方面(请记住,这不是一个太常见的实施,因此您不会找到太多的在线支持)。李>
  • 一旦解决了上述问题(您可以从外部工作簿访问与单元格选择相关的事件),您就可以开始关注上述Ranges 以及 VBA 与单元格通信的方式;这次你会在互联网上找到大量的信息:代码、意见等。
  • 此时您不必担心您在更新的答案中提到的具体问题,一旦您对 VBA 有了适当的了解,所有这些都将很容易解决(从外部工作簿中检索事件可能会出现问题;检索存储的信息(例如表及其名称)或多或少是容易的 -> 在信息不多与信息很多的意义上)。

总而言之,我在您想要的内容中看到的主要问题是从外部工作簿中检索某些信息;如果您可以避免这种情况(例如,如上所述),该项目将变得非常容易。无论如何,您不能在这里提出如此笼统的问题并期望得到实际适用的答案。此外,您必须非常清楚确切的问题以及您在寻找什么(在您的第一个问题中,您甚至没有提到各种工作簿问题)。

我希望在这些(更新的)入门指南之后,您将能够开始自己的工作并回到这里(如果需要)以明确界定(并且理想情况下是全面适用的,以帮助尽可能多的人尽可能)的问题。

【讨论】:

  • 谢谢。我不清楚如何实现 Worksheet_SelectionChange 事件有两个原因。首先,我希望代码位于我的个人文件中,以便可以在任何工作表上实现宏,但 Worksheet_SelectionChange 不是个人文件模块中的选项。其次,如果我要编写一个 Worksheet_SelectionChange 函数来响应单元格单击,它不会在工作表中进行单击时触发吗?我只希望它在宏的上下文中触发......我将更新我的帖子以包含代码 - 尽管由于上述原因,代码几乎完全错误。
  • @tjnel 我不太了解我的个人文件部分,但是说每次用户进行选择时都会触发,但情况并非如此。每次都会触发该功能,但只有当所选单元格是您想要的单元格时才能触发您的代码。正如我在回答中所说,这是一个一般性的回复,可以让您朝着正确的方向前进;你必须做一些研究/学习。我会更新这部分,但不会继续更新其他部分。不用担心你的解释,我完全得到了你想要的。
  • 感谢您的回复。我正在尝试编写一个可以在许多不同的 excel 文件上实现的宏。如果我将 VBA 放入 Personal.xlsx 文档中,则宏的范围将是我的所有 excel 文件,而不仅仅是一个。但是,我不知道是否可以在 Personal.xlsx 文件中使用 Worksheet_SelectionChange 事件。
  • @tjnel(我已经更新了我的答案,请看一下)关于你在说什么:每个包含宏的文件(应该是 .xlsm 或类似的)都必须处理它的自己的细胞追踪。我不确定您打算如何协调不同的宏(例如,通过文本文件?),但无论采用哪种方式,您都可以将此信息从一个传递到另一个(文件 1 ->“目标单元格已被单击",传输到文件 2) 的信息。无论如何,请理解我在回答中所写的内容,您应该自己处理所有事情并来这里解决具体问题。
  • 如果您想在任何打开的工作簿中捕获事件,请尝试查看:cpearson.com/excel/appevent.aspx
猜你喜欢
  • 2014-03-31
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2018-10-17
相关资源
最近更新 更多