【发布时间】:2018-07-30 11:53:32
【问题描述】:
有点新手,但在没有帮助的情况下,我已经尽我所能:
我正在尝试创建一个宏来执行以下操作:
1) 在列 (B) 中搜索用户输入的值
2) 找到 (1) 中的值后,复制活动行 U 列中的单元格内容
3) 在 U 列之后的其余行中搜索在 (2) 中复制的值
4) 如果在 (2) 中复制的值在该行中再次找到(仅在 U 列之后的第一次重复),则使用相同的值过滤找到它的单元格列
看起来我有步骤 1 和 2 工作,不确定步骤 3 是否不起作用或失败,因为循环从 A 列开始并在遇到 U 列中的剪贴板值时停止(而不是搜索超出U 列)。第 4 步看起来肯定行不通。
感谢您在解决第 3 步和第 4 步时提供的所有帮助。
使用下面的示例,如果用户在 MyFind/Input 框中输入 9,则将搜索列 B 以在单元格 B2 中找到 9(列 B 中的值将始终是唯一的)。将搜索第 2 行的其余部分(B 列之后)以在单元格 E2 中找到重复的 9。然后以 9 作为标准过滤 E 列。
..A BC DE F G
1|1 2 3 4 5 6 7
2|1 9 3 4 9 9 7
3|1 8 3 4 9 6 7
4|1 3 3 4 5 6 7
我的代码:
Sub LCOUN_Search()
Dim OrgNum As Integer
LastRow = Cells(Rows.Count, "B").End(xlUp).Row
MyFind = InputBox("Please enter 8 digit employee number:")
If MyFind = "" Then End
For i = LastRow To 1 Step -1
If Range("B" & i).Value = MyFind Then
Range("B" & i).Select
End If
Next i
Cells(ActiveCell.Row, "U").Select
Selection.Copy
LastCol = Cells(ActiveCell.Row, "V").End(xlToLeft).Column
*'?Column V so that it searches from after column U?*
For i = LastCol To 1 Step -1
If Cells(ActiveCell.Row, i) = Selection Then
ActiveCell.Select
Selection.Copy
End If
Next i
Columns(ActiveCell.Column).AutoFilter Field:=1, Criteria:=Selection
End Sub
我也试过这个:
Sub LCOUN_Search()
Dim Found As Long
LastRow = Cells(Rows.Count, "B").End(xlUp).Row
MyFind = InputBox("Please enter 8 digit employee number:")
If MyFind = "" Then End
For i = LastRow To 1 Step -1
If Range("B" & i).Value = MyFind Then
Range("B" & i).Select
End If
Next i
Cells(ActiveCell.Row, "U").Select
Found = Selection.Copy
FirstCol = Cells(ActiveCell.Row, "V").Column
LastCol = ActiveSheet.UsedRange.Column + _
ActiveSheet.UsedRange.Columns.Count - 1
For k = FirstCol To LastCol
If Cells(ActiveCell.Row, k) = Selection Then Exit For
Next k
If k <= LastCol Then
With ActiveSheet.UsedRange
.AutoFilter Field:=k, Criteria1:=Cells(ActiveCell.Row, k).contents
End With
End If
End Sub
【问题讨论】:
-
看看使用 .Find on Range(“B1:B” & lastRow)。抱歉,由于移动设备而引起的有趣“”。如果找到,将返回找到的地址,然后取该值并在范围 U 同一行到最后一列 U 行的行上重复 .Find。我不确定您所说的第一次重复是什么意思。您还可以使用 .Find 指定搜索顺序。
-
您还需要对没有用户输入或用户按下取消以及 .Find 未找到匹配项进行错误处理。也可能值得限制 InputBox 类型参数以限制用户输入预期的数据类型并添加一些基本验证检查用户输入是否有效。
-
复制的值可能会在行中重复几次(在列 U 之后,例如在列 BA、BB、BC 中),第一次重复我的意思是在列 U 之后的第一次值重复(例如 BA 列)
-
.Find 可用于返回第一个,如果您指定按列排序。 Tbh,如果您将搜索范围缩小到 1 行,我不确定搜索顺序是否重要,但需要调查。值得看一下关于它的 MSDN 文档。这将比您目前尝试的方法高效得多。
-
仍然无法正常工作,我已经尝试了上面已编辑问题中的第二个代码以及使用 .Find 而不是循环
标签: excel vba search filter rows