Excel宏以编程方式查找匹配的单元格

时间:2012-05-05 00:32:48

标签: excel excel-vba match cell vba

在单元格R12中,我有一个整数,每次运行此宏时都会更改。我需要宏来分析该单元格中的数字,并找到电子表格中的另一个单元格(保证在M31:M40范围内,因为匹配将在哪里)与单元格R12的内容相匹配,然后使匹配的单元格成为活动单元格 显然,我可以告诉excel R12中的内容是什么,并进行搜索,但是我需要它来确定R12本身的什么...然后找到匹配的单元格,然后去那里。

没有人输入R12的值。这是计算的。 R12是通过总计该列中其他十个单元格的内容而创建的数字。我试图为我的宏留下“breadcrumbs”,找回电子表格上的某个位置,宏可以继续并在那里粘贴数据......我希望Excel可以确定R12中的数字,并找到表格中其他地方的确切数字......本身。另一个数组中将存在相同的数字...(M31:M40)如果它以某种方式可以将活动单元格移动到匹配的数字,我可以将我的活动单元格返回到我启动宏的位置。宏的全部内容未发布。希望澄清。

2 个答案:

答案 0 :(得分:1)

我猜测“通过狩猎和啄食信息来构建宏来提高视频后期制作所完成的所有工作的效率”,您对VBA的了解有限,而且您不知道可能的功能是什么相关。这个答案是对我认为你需要的事件例程的介绍。

发生事件:打开或关闭工作簿,添加工作表,更改单元格值等。对于其中许多事件,您可以创建在事件发生时调用的例程。

为了演示这些例程,我创建了一个工作簿和一个工作表“Work”。我已将12个单元格设置为数值,并将R12设置为它们的总和。我将范围J2:O25设置为数字1到144.这是一个比你想要的更大的范围,但这对原理没有影响。

在下面的代码中,我使用了两个事件例程:Workbook_OpenWorkbook_SheetChange

Workbook_Open中,我保存了R12的原始值。在Workbook_SheetChange中,如果R12的值已经改变,如果J2:O25包含新值,我将光标移动到它。

如果我理解您的问题,这就是您寻求的功能。如果没有,我希望这个答案可以帮助你提出一个更好,更详细的问题。

您必须将此声明放在模块中:

  Public R12Last As Variant

您必须将以下代码放在ThisWorkbook中,您可以在工作表的Microsoft Excel Objects下找到这些代码。

Option Explicit
Sub Workbook_Open()

  ' This routine is called when the workbook is opened.

  With Worksheets("Work")
    ' Save the value of cell R12 when the workbook opens.
    R12Last = .Range("R12").Value
  End With

End Sub

Private Sub Workbook_SheetChange(ByVal WSht As Object, ByVal ChgRng As Range)

  ' This routine is called when cells in any worksheet are changed by the
  ' user or by an external link.

  ' WSht is the worksheet within which cells have changed.
  ' ChgRng can be a single cell or a range.

  ' For this application, we are not interested in the cell that has changed.
  ' We want to know if the change affected R12.

  Dim SearchRng As Range
  Dim FoundRng As Range

  With Worksheets("Work")
    If R12Last <> .Range("R12").Value Then
      ' Cell R12 has changed
      R12Last = .Range("R12").Value     ' Record the new value for next time

      ' I have a larger range containing the values that might be in R12
      ' but the principle is the same.  You will need to change this to M31:M40.
      Set SearchRng = .Range("J2:O25")

      ' Look for the new value of R12 in SearchRng.
      ' "What" is the value to be found.  "After" must be within the search
      ' range. "After" is the last cell to be searched.  I have set
      ' SearchDirection to xlNext and SearchOrder to xlByRows so the Find will
      ' check cells starting with J2.
      ' Look Find up in VBA Help for a fuller description.
      Set FoundRng = SearchRng.Find(What:=R12Last, After:=Range("O25"), _
                                    LookIn:=xlValues, LookAt:=xlWhole, _
                                    SearchOrder:=xlByRows, _
                                    SearchDirection:=xlNext)
      If FoundRng Is Nothing Then
        ' The value of R12 has not been found in the search range.
        ' Add code to handle this situation
        Call MsgBox("Target value not found", vbOKOnly)
      Else
        ' Make the cell with the matching value the active cell.
        FoundRng.Select
      End If
    End If
  End With

End Sub

答案 1 :(得分:0)

实际上,似乎没有人理解我的问题,我会承担一半的责任......在另一个网站上搜索产生了我的解决方案:

Range(ActiveCell.Address).Name = "StartCell"

LOOPING CODE HERE

Application.Goto "StartCell"