13

我有以下列(A 列)命名的项目(行列仅显示行号):

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”的行号?有没有更好的方法来做到这一点,也许是一个循环?

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

4

5 回答 5

24

我不太熟悉该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
于 2013-04-09T19:45:37.593 回答
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
于 2013-04-09T20:17:58.983 回答
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
于 2013-04-09T19:56:18.620 回答
1

几点评论:

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

建议的代码

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
于 2013-04-10T07:12:21.190 回答
0

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

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

于 2013-04-09T19:50:18.703 回答