如何使用VBA代码在工作表上搜索?

如何使用VBA代码在工作表上搜索?,vba,excel,Vba,Excel,我的工作表有两列“键”和“值”。通过VBA代码,我希望在键列上搜索输入键,如果不存在,我将添加新行[Input key]-[Input value]。如何编写代码 你会从评论中意识到,“请帮我解决我的问题”的问题并不流行 我猜你不知道从哪里开始,会给你一些初步的指导 转到Google并键入“excel vba教程”。你将获得许多网站。他们都是不同的,所以尝试一些,并找到一个适合你 试试宏记录器。我设置了一个与您的描述匹配的工作表,打开宏记录器,选择a列,单击Ctrl+F以获得查找屏幕,并单击选项

我的工作表有两列“键”和“值”。通过VBA代码,我希望在键列上搜索输入键,如果不存在,我将添加新行[Input key]-[Input value]。如何编写代码

你会从评论中意识到,“请帮我解决我的问题”的问题并不流行

我猜你不知道从哪里开始,会给你一些初步的指导

转到Google并键入“excel vba教程”。你将获得许多网站。他们都是不同的,所以尝试一些,并找到一个适合你

试试宏记录器。我设置了一个与您的描述匹配的工作表,打开宏记录器,选择a列,单击
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或激活包含找到的值的单元格
  • 我们需要考虑未找到的值
将下面的宏复制到宏记录器保存代码的模块中。我通过修改保存的代码创建了这个宏,创建了一个供您使用的测试车辆。它询问一个值,在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时的情景。我知道所有其他语言的控制结构,但对象模型和宏记录器毫无意义,直到我遇到类似的答案,然后突然一切都到位。