0

在不使用 excel 内置过滤器或数据透视表功能的情况下,我想使用 vba 提取一些结果。考虑以下示例:给定 A 和 B 列中的数据,我希望能够在 C1 中输入“a”并使用 vba 在 D 列中获取 B 列 (1,3,5) 中的所有相应值。如果我输入“b”,我会得到 2、6,依此类推。谢谢。 在此处输入图像描述 在此处输入图像描述

4

3 回答 3

2
Sub GenerateMatches()

With ActiveSheet
FinalRowA = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

InputLetter = ActiveSheet.Cells(1, 3)
NextRow = 1

For i = 1 To FinalRowA
If .Cells(i, 1) = InputLetter Then
.Cells(NextRow, 4) = .Cells(i, 2)
NextRow = NextRow + 1
End If

Next i

End With

End Sub

显然,您可以使这更加动态和更快,但这应该可以完成工作。

于 2013-09-13T23:36:48.657 回答
0

在工作表代码区域中输入以下事件宏:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim D1 As Range, K As Long
    Dim N As Long, NN As Long
    Set D1 = Range(Range("D1"), Range("D1").End(xlDown))
    If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    v = Target.Value
    K = 1
    D1.Clear
    NN = Cells(Rows.Count, "A").End(xlUp).Row
    For N = 1 To NN
        If v = Cells(N, "A").Value Then
            Cells(K, "D").Value = Cells(N, "B").Value
            K = K + 1
        End If
    Next
    Application.EnableEvents = True
End Sub

因为它是工作表代码,所以非常容易安装和自动使用:

  1. 右键单击 Excel 窗口底部附近的选项卡名称
  2. 选择查看代码 - 这将打开一个 VBE 窗口
  3. 粘贴这些东西并关闭 VBE 窗口

如果您有任何疑虑,请先在试用工作表上进行尝试。

如果您保存工作簿,宏将与它一起保存。如果您使用的是 2003 年以后的 Excel 版本,则必须将文件另存为 .xlsm 而不是 .xlsx

要删除宏:

  1. 如上所述调出 VBE 窗口
  2. 清除代码
  3. 关闭 VBE 窗口

要了解有关宏的更多信息,请参阅:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

要了解有关事件宏(工作表代码)的更多信息,请参阅:

http://www.mvps.org/dmcritchie/excel/event.htm

必须启用宏才能使其正常工作!

顺便提一句

你可以用公式而不用 VBA 做同样的事情——比如 steriod 上的 VLOOKUP!

于 2013-09-13T23:29:08.917 回答
0

我理解你说你不想使用过滤器或数据透视。但是公式?

如果公式可以实现,那么为什么要使用 VBA?

粘贴此数组公式Cell D1并按CTRL+ SHIFT+ENTER并将其拉下。

=IF(ISERROR(INDEX($A$1:$B$7,SMALL(IF($A$1:$A$7=$C$1,ROW($A$1:$A$7)),ROW(1:1)),2)),"",INDEX($A$1:$B$7,SMALL(IF($A$1:$A$7=$C$1,ROW($A$1:$A$7)),ROW(1:1)),2))

截屏 在此处输入图像描述

于 2013-09-14T05:18:46.000 回答