我有以下列(列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”的行号? 有没有更好的方法来做到这一点,也许是一个循环?
谢谢,任何帮助将不胜感激!
答案 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)
一些评论:
ws.[a1]
和xlNext
,因此我的搜索从指定工作表的A2
开始。 Find
个参数中的一些 - 包括lookat
使用先前的搜索设置。因此,您应始终指定xlWhole
或xlPart
以分别匹配全部或部分字符串。Select
或Activate
< / 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还是数字条目......