如何使用VBA代码在工作表上搜索?
我的工作表有两列“键”和“值”。通过VBA代码,我希望在键列上搜索输入键,如果不存在,我将添加新行[Input key]-[Input value]。如何编写代码 你会从评论中意识到,“请帮我解决我的问题”的问题并不流行 我猜你不知道从哪里开始,会给你一些初步的指导 转到Google并键入“excel vba教程”。你将获得许多网站。他们都是不同的,所以尝试一些,并找到一个适合你 试试宏记录器。我设置了一个与您的描述匹配的工作表,打开宏记录器,选择a列,单击如何使用VBA代码在工作表上搜索?,vba,excel,Vba,Excel,我的工作表有两列“键”和“值”。通过VBA代码,我希望在键列上搜索输入键,如果不存在,我将添加新行[Input key]-[Input value]。如何编写代码 你会从评论中意识到,“请帮我解决我的问题”的问题并不流行 我猜你不知道从哪里开始,会给你一些初步的指导 转到Google并键入“excel vba教程”。你将获得许多网站。他们都是不同的,所以尝试一些,并找到一个适合你 试试宏记录器。我设置了一个与您的描述匹配的工作表,打开宏记录器,选择a列,单击Ctrl+F以获得查找屏幕,并单击选项
Ctrl+F
以获得查找屏幕,并单击选项按钮以显示所有选项。结果是:
看看这些选项。例如,案例是否重要?根据需要选择。我勾选“匹配整个单元格内容”,输入“k”,然后单击“查找下一步”。光标跳转到包含“k”的单元格。然后我关掉了宏录制器
为我保存的代码是:
Sub Macro1()
'
' Macro1 Macro
' Macro recorded 27/02/2012 by Tony Dallimore
'
Columns("A:A").Select
Selection.Find(What:="k", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
End Sub
这是有效的VBA,但不是好的VBA。宏录制器在您执行每个操作时都已录制。它不知道你的意图。所以我们需要整理一下代码
主要的变化是:
- 我们不希望选择列A或激活包含找到的值的单元格
- 我们需要考虑未找到的值
Sub PlayMacro()
Dim Prompt As String
Dim RetValue As String
Dim Rng As Range
Dim RowCrnt As Long
Prompt = ""
' The macro recorder has used the active worksheet. This says which
' worksheet is to be used whether it is active or not. Change "Sheet4"
' to the name of your worksheet.
With Sheets("Sheet4")
' This will loop forever unless a statement within
' the loop exits the Do.
Do While True
RetValue = InputBox(Prompt & "Give me a value to look for")
'RetValue will be empty if you click cancel
If RetValue = "" Then
Exit Do
End If
' I do not wish to active the cell containing the required value.
' I want to know where it is.
Set Rng = .Columns("A:A").Find(What:=RetValue, After:=.Range("A1"), _
LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If Rng Is Nothing Then
' The entered value could not be found
Prompt = "I could not find """ & RetValue & """"
Else
' The entered value was found
RowCrnt = Rng.Row
Prompt = "I found """ & RetValue & """ on row " & RowCrnt
End If
Prompt = Prompt & vbLf
Loop
End With
End Sub
现在再次打开宏录制器。将光标定位在A列中具有值的任何行下方。单击Ctrl+UpArrow
。光标将跳转到A列中的最后一个值。关闭宏记录器
保存的代码如下所示:
Sub Macro2()
'
' Macro2 Macro
' Macro recorded 27/02/2012 by Tony Dallimore
'
'
Range("A64").Select
Selection.End(xlUp).Select
Range("A28").Select
End Sub
End(xlUp)
是Ctrl+UpArrow
的VBA。这是查找最后使用的行的最简单方法
要添加新行(如果找不到该值),请执行以下操作:
RowCrnt = .Cells(Rows.Count, "A").End(xlUp).Row + 1
.Cells(RowCrnt,1),Value = "Key"
.Cells(RowCrnt,2),Value = "Value"
如果你看其他问题,你会发现,End
有时不会给你预期的结果。尝试对空列、顶部有一个或两个值的列、底部有一个或两个值的列以及有多个值由空行分隔的列执行Ctrl+DownArrow
和Ctrl+UpArrow
这应该让你开始。欢迎使用Excel编程。祝您好运。您可以使用InStr命令使用以下简单代码
Private Sub CommandButton1_Click()
Dim RowNum As Long
RowNum = 1
Do Until Sheets("Data").Cells(RowNum, 1).Value = ""
If InStr(1, Sheets("Data").Cells(RowNum, 2).Value, TextBox1.Value, vbTextCompare) > 0 Then
On erro GoTo next1
ListBox1.AddItem Sheets("Data").Cells(RowNum, 1).Value
ListBox1.List(ListBox1.ListCount - 1, 1) = Sheets("Data").Cells(RowNum, 2).Value
End If
next1:
RowNum = RowNum + 1
Loop
End Sub
你试过什么?录制宏是一个很好的开始,搜索StackOverflow也是一个很好的开始。你可能是对的,我做得太过分了。但我仍然记得大约十年前我第一次使用ExcelVBA时的情景。我知道所有其他语言的控制结构,但对象模型和宏记录器毫无意义,直到我遇到类似的答案,然后突然一切都到位。