在不使用 excel 内置过滤器或数据透视表功能的情况下,我想使用 vba 提取一些结果。考虑以下示例:给定 A 和 B 列中的数据,我希望能够在 C1 中输入“a”并使用 vba 在 D 列中获取 B 列 (1,3,5) 中的所有相应值。如果我输入“b”,我会得到 2、6,依此类推。谢谢。
3 回答
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
显然,您可以使这更加动态和更快,但这应该可以完成工作。
在工作表代码区域中输入以下事件宏:
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
因为它是工作表代码,所以非常容易安装和自动使用:
- 右键单击 Excel 窗口底部附近的选项卡名称
- 选择查看代码 - 这将打开一个 VBE 窗口
- 粘贴这些东西并关闭 VBE 窗口
如果您有任何疑虑,请先在试用工作表上进行尝试。
如果您保存工作簿,宏将与它一起保存。如果您使用的是 2003 年以后的 Excel 版本,则必须将文件另存为 .xlsm 而不是 .xlsx
要删除宏:
- 如上所述调出 VBE 窗口
- 清除代码
- 关闭 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!
我理解你说你不想使用过滤器或数据透视。但是公式?
如果公式可以实现,那么为什么要使用 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))
截屏