如何在列中查找文本并将行号保存在首次找到的位置 - Excel VBA

时间:2013-04-09 19:33:38

标签: excel vba

我有以下列(列A)命名为project(rows列只显示行号):

rows    project
1       14
2       15
3       16
4       17
5       18
6       19
7       ProjTemp
8       ProjTemp
9       ProjTemp

我有一个输入消息框,用户在最后一个之后写入我想要插入的新项目名称。例如:项目20将在项目19之后和第一个“ProjTemp”之前插入。

我的理论是找到第一个“ProjTemp”的行号,然后在项目为20的位置插入一个新行。

我试图使用Find函数,但是我遇到了溢出错误(我确定我得到了它,因为它找到3个“ProjTemp”字符串并试图将其设置为一个参数):

Dim FindRow as Range

with WB.Sheets("ECM Overview")
    Set FindRow = .Range("A:A").Find(What:="ProjTemp", _
                        After:=.Cells(.Cells.Count), _
                        LookIn:=xlValues, _
                        LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, _
                        MatchCase:=False)
end with

我如何编码,所以我只找到第一个“ProjTemp”的行号? 有没有更好的方法来做到这一点,也许是一个循环?

谢谢,任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:22)

我并不熟悉Find方法的所有参数;但在缩短它时,以下内容对我有用:

With WB.Sheets("ECM Overview")
    Set FindRow = .Range("A:A").Find(What:="ProjTemp", LookIn:=xlValues)
End With

如果您只需要行号,可以在以下后使用:

Dim FindRowNumber As Long
.....
FindRowNumber = FindRow.Row

答案 1 :(得分:7)

Dim FindRow as Range

Set FindRow = Range("A:A").Find(What:="ProjTemp", _' This is what you are searching for
                   After:=.Cells(.Cells.Count), _ ' This is saying after the last cell in the_
                                                  ' column i.e. the first
                   LookIn:=xlValues, _ ' this says look in the values of the cell not the formula
                   LookAt:=xlWhole, _ ' This look s for EXACT ENTIRE MATCH
                   SearchOrder:=xlByRows, _ 'This look down the column row by row 
                                            'Larger Ranges with multiple columns can be set to 
                                            ' look column by column then down 
                   MatchCase:=False) ' this says that the search is not case sensitive

If Not FindRow  Is Nothing Then ' if findrow is something (Prevents Errors)
    FirstRow = FindRow.Row      ' set FirstRow to the first time a match is found
End If

如果你想获得额外的,你可以使用:

Do Until FindRow Is Nothing
    Set FindRow = Range("A:A").FindNext(after:=FindRow)
    If FindRow.row = FirstRow Then
        Exit Do
    Else ' Do what you'd like with the additional rows here.

    End If
Loop

答案 2 :(得分:2)

或者你可以使用循环,保留行号(计数器应该是行号)并在找到第一个“ProjTemp”时停止循环。
那么看起来应该是这样的:

Sub find()
    Dim i As Integer
    Dim firstTime As Integer
    Dim bNotFound As Boolean

    i = 1
    bNotFound = True

      Do While bNotFound
        If Cells(i, 2).Value = "ProjTemp" Then
            firstTime = i
            bNotFound = false
        End If
        i = i + 1
    Loop
End Sub

答案 3 :(得分:1)

一些评论:

  1. 由于搜索位置很重要,您应指定开始搜索的位置。我使用下面的ws.[a1]xlNext,因此我的搜索从指定工作表的A2开始。
  2. Find个参数中的一些 - 包括lookat使用先前的搜索设置。因此,您应始终指定xlWholexlPart以分别匹配全部或部分字符串。
  3. 您可以执行所有操作 - 包括插入行,并提示用户输入新值(如果先前值为19,我的代码将建议20),而不使用SelectActivate < / LI>

    推荐代码

    Sub FindEm()
    Dim Wb As Workbook
    Dim ws As Worksheet
    Dim rng1 As Range
    Set Wb = ThisWorkbook
    Set ws = Wb.Sheets("ECM Overview")
    Set rng1 = ws.Range("A:A").Find("ProjTemp", ws.[a1], xlValues, xlWhole, , xlNext)
    If Not rng1 Is Nothing Then
    rng1.EntireRow.Insert
    rng1.Offset(-1, 0).Value = Application.InputBox("Please enter data", "User Data Entry", rng1.Offset(-2, 0) + 1, , , , , 1)
    Else
    MsgBox "ProjTemp not found", vbCritical
    End If
    End Sub
    

答案 4 :(得分:0)

检查“projtemp”,然后检查前一个是否是一个数字条目(如19,18..etc ..),如果是这样,那么得到那个proj temp的行号....

如果不是这样的话..然后重新检查前一个条目是projtemp还是数字条目......