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" 文字列を見つけて 1 つのパラメーターに設定しようとしているため、エラーが発生していると確信しています)。

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]して、指定したシート xlNextから検索を開始します。A2
  2. 一部のFinds 引数 -lookat以前の検索設定を使用します。xlWholeそのため、常にorを指定xlPartして、それぞれ文字列のすべてまたは一部に一致させる必要があります。
  3. Selectまたはを使用せずに、行を挿入したり、ユーザーに新しい値を入力するように要求したり(以前の値が19だった場合、私のコードは20を提案します)など、必要なことはすべて行うことができますActivate

提案されたコード

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 など) であるかどうかを確認します。そうであれば、その proj temp の行番号を取得します ....

そうでない場合は、前のエントリがprojtempまたは数値エントリであることを再確認してください...

于 2013-04-09T19:50:18.703 に答える