VBA - 在宏的上下文中检测单元格更改

时间:2013-07-23 15:38:38

标签: excel vba events listener

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

(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

1 个答案:

答案 0 :(得分:0)

Excel-VBA能够执行您所追求的一切。但是你要求太多并且不提供任何东西(通常,提问者必须包含代码或任何形式的指示他/她尝试了什么以及为什么失败)。

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

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

    每次选择更改时都会调用

    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文件)并要求用户将他们想要的内容粘贴到此文件中。这个小改变会让事情变得很轻松。
    • 如果您不想考虑上述替代方案,则必须将研究重点放在处理外部工作簿上。最棘手的问题是处理细胞选择跟踪和相关事件。蒂姆威廉姆斯提供的链接肯定会帮助你在这方面。我个人对这种方法的实际可靠性有一些疑问,主要是在同时处理多个工作簿时。您不仅需要在实际实施方面进行研究/测试,还需要进行可靠性研究/测试(请记住,这不是一个太常见的实现,因此您不会找到太多的在线支持)。
    • 一旦解决了上述问题(您可以从外部工作簿访问与单元格选择相关的事件),您就可以开始关注上述Ranges以及VBA与单元通信的方式;这次你会在互联网上找到很多信息:代码,意见等。
    • 在这一点上你不应该担心你在更新的答案中提到的具体问题,一旦你对VBA有了正确的认识,这一切都将很容易解决(从外部工作簿中检索事件可能会成为问题;检索存储的信息,例如表格和它们的名称,或多或少是容易的 - >在没有太多信息而非大量信息的意义上。

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

    我希望在这些(更新的)开始指南之后,您将能够自己开始工作并回到这里(如果需要),并且划定得很好(并且,理想情况下,总体适用,以帮助尽可能多的人尽可能)问题。