excel - 使用 VBA 的搜索按钮
问题描述
此代码假设正在从另一个工作表中查找关键字。它工作正常,但我必须从其他工作表中输入确切的工作。我该如何改进它以使其仅搜索关键字。例如,如果我想搜索 Red Car,我只想输入 Red。
Private Sub CommandButton1_Click()
totalsheets = Worksheets.Count
mykeyword = Worksheets("MasterSheet").Cells(2, 8).Value
For i = 1 To totalsheets
If Worksheets(i).Name <> "MasterSheet" Then
lastrow = Worksheets(i).Cells(Rows.Count, 1).End(xlUp).Row
For j = 2 To lastrow
If Worksheets(i).Cells(j, 1).Value = mykeyword Then
Worksheets("MasterSheet").Activate
lastrow = Worksheets("MasterSheet").Cells(Rows.Count, 1).End(xlUp).Row
Worksheets("MasterSheet").Cells(lastrow + 1, 1).Value = Worksheets(i).Name
Worksheets("MasterSheet").Cells(lastrow + 1, 2).Value = Worksheets(i).Cells(j, 2).Value
Worksheets("MasterSheet").Cells(lastrow + 1, 4).Value = Worksheets(i).Cells(j, 3).Value
Worksheets("MasterSheet").Cells(lastrow + 1, 3).Value = Worksheets(i).Cells(j, 4).Value
解决方案
考虑使用Range.Find
这个,而不是嵌套循环。
If Worksheets(i).Cells(j, 1).Value = mykeyword Then
你在这里做一个严格的字符串相等。使用默认比较模式 ( Option Compare Binary
),这是一个区分大小写的相等测试。
您想要一个不区分大小写的部分匹配:=
操作员不会删除它。Like
运算符支持更合适的通配符。
If LCase(Worksheets(i).Cells(j, 1).Value) Like "*" & LCase(mykeyword) & "*" Then
使用LCase
,您将每个单元格的小写表示与搜索词的小写表示进行比较。这有效,但并不理想。
将比较代码提取到单独模块中的自己的公共函数中,并Option Compare Text
在该模块的顶部指定:
Option Explicit ' always.
Option Compare Text ' makes string comparisons case-insensitive
Option Private Module ' prevent exposing public functions as UDFs
Public Function IsPartialMatch(ByVal value As String, ByVal term As String) As Boolean
IsPartialMatch = value Like "*" & term & "*"
End Function
现在你可以这样做:
If IsPartialMatch(Worksheets(i).Cells(j, 1).Value, mykeyword) Then
替代(更好)方法
相反,Range.Find
您可以消除嵌套循环,只保留迭代工作表的外部循环;如果它没有找到您要查找的内容,则Range.Find
返回,您所需要的就是:Nothing
If Not (result) Is Nothing Then
Private Sub CommandButton1_Click() 'todo: give that button a meaningful name
Dim masterSheet As Workshet
Set masterSheet = Worksheets("MasterSheet")
Dim mykeyword As String
mykeyword = masterSheet.Cells(2, 8).Value
Dim sheet As Worksheet
For Each sheet In Worksheets
If Not sheet Is masterSheet Then
Dim result As Range
Set result = sheet.Range("A:A").Find(mykeyword, LookIn:=XlFindLookIn.xlValues, LookAt:=XlLookAt.xlPart, MatchCase:=False)
If Not result Is Nothing Then
Dim lastRow As Long
With masterSheet
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
.Cells(lastRow + 1, 1).Value = sheet.Name
.Cells(lastRow + 1, 2).Value = sheet.Cells(result.Row, 2).Value
.Cells(lastRow + 1, 4).Value = sheet.Cells(result.Row, 3).Value
.Cells(lastRow + 1, 3).Value = sheet.Cells(result.Row, 4).Value
End With
End If
End If
Next
End Sub
请注意,主工作表和包含搜索结果的任何工作表之间的第 3 列和第 4 列似乎是颠倒的 - 验证这是正确的,并考虑添加一个正当的评论。
推荐阅读
- c++ - 未解析的外部符号 - GRPC
- cmake - 即使是最新的目标,CMake 是否总是评估安装规则?
- javascript - Javascript - 序列化异步操作
- excel - Vlookup 公式显示 1004 错误。解决方法也失败了
- java - java.lang.ClassNotFoundException: com.mysql.idbc.Driver 问题
- proxy - 如何在不更改名称服务器的情况下使用 cloudflare
- html - 选择子元素 css
- sql - Update Table from another Table in SQL Server 2016, plus "could not be bound" issue
- mongoose - Mongoose query on last item in array
- pandas - 熊猫系列元素的成对最小值