2013-04-09 16 views
10

Tôi đã sau cột (cột A) đặt tên dự án (các hàng cột được chỉ hiển thị số hàng):Làm thế nào để tìm văn bản trong một cột và duy trì số lượng hàng nơi nó lần đầu tiên được tìm thấy - Excel VBA

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

Tôi có một hộp thông báo đầu vào trong đó người dùng viết tên dự án mới mà tôi muốn chèn ngay sau tên dự án cuối cùng. Ví dụ: dự án 20 sẽ được chèn ngay sau dự án 19 và trước "ProjTemp" đầu tiên.

lý thuyết của tôi là để xác định vị trí số hàng của "ProjTemp" đầu tiên và sau đó chèn một hàng mới mà dự án là 20.

Tôi đã cố gắng sử dụng các chức năng Find nhưng tôi nhận được một lỗi tràn bộ (tôi chắc rằng tôi nhận được nó bởi vì nó tìm kiếm 3 "ProjTemp" chuỗi và cố gắng để đặt nó vào một tham số):

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 

làm thế nào để viết mã này vì vậy tôi chỉ tìm ra số hàng của nắm đấm "ProjTemp"? Có cách nào tốt hơn để làm điều này, có thể là một vòng lặp?

Cảm ơn, mọi trợ giúp sẽ được đánh giá cao!

Trả lời

16

Tôi không thực sự quen thuộc với tất cả các tham số của phương pháp Find; nhưng khi rút ngắn nó, sau đây đang làm việc cho tôi:

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

Và nếu bạn chỉ cần số lượng hàng, bạn có thể sử dụng sau:

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

cảm ơn! thì càng đơn giản thì càng tốt. – Kristina

+0

câu hỏi nhanh, tôi sẽ chọn toàn bộ hàng đó như thế nào? Tôi tiếp tục nhận được 'Chọn phương pháp của lớp Phạm vi không thành công ' – Kristina

+0

bạn chỉ đơn giản là có thể sử dụng" Sheets (1). Rows (FindRowNumber). Chọn ". Premission là bạn đã lưu các Rownumber cách xoài nói trên – j0chn

0

Kiểm tra cho "projtemp" và sau đó kiểm tra xem trước đó là một mục nhập số (như 19,18..etc ..) nếu đó là như vậy sau đó nhận được hàng không có đó proj temp ....

và nếu đó không phải là như vậy .. sau đó lại kiểm tra xem mục nhập trước đó là projtemp hoặc một mục nhập số ...

2

Hoặc bạn có thể sử dụng vòng lặp, giữ số hàng (bộ đếm phải là số hàng) và dừng vòng lặp khi bạn tìm thấy "ProjTemp" đầu tiên.
Sau đó, nó sẽ giống như thế này:

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 
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 

Nếu bạn muốn nhận được những cái Ngoài ra bạn có thể sử dụng:

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 
1

Một vài ý kiến:

  1. Vì vị trí tìm kiếm quan trọng, bạn nên chỉ định nơi bạn bắt đầu t anh ấy tìm kiếm. Tôi sử dụng ws.[a1]xlNext bên dưới để tìm kiếm của tôi bắt đầu bằng A2 của trang tính được chỉ định.
  2. Một số đối số Find s - bao gồm lookat sử dụng cài đặt tìm kiếm trước đó. Vì vậy, bạn nên luôn luôn chỉ định xlWhole hoặc xlPart để đối sánh tất cả hoặc một phần chuỗi tương ứng.
  3. Bạn có thể làm tất cả các bạn muốn - bao gồm chèn một hàng, và khiến người sử dụng cho một giá trị mới (mã của tôi sẽ đề nghị 20 nếu giá trị trước là 19) mà không sử dụng Select hoặc Activate

đề nghị đang

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 
Các vấn đề liên quan