Thảo luận về phương thức tìm kiếm - METHOD FIND() (1 người xem)

  • Thread starter Thread starter cadafi
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

C. Remarks (Một số lưu ý):

- The settings for LookIn, LookAt, SearchOrder, and MatchByte are saved each time you use this method. If you don’t specify values for these arguments the next time you call the method, the saved values are used. Setting these arguments changes the settings in the Find dialog box, and changing the settings in the Find dialog box changes the saved values that are used if you omit the arguments. To avoid problems, set these arguments explicitly each time you use this method. If you don't, you run the risk of using the Find Method with settings you were not aware of.
Các thiết lập cho các đối số LookIn, LookAt, SearchOrderMatchByte sẽ được lưu mỗi lần ta sử dụng phương thức này (phương thức Find). Nếu ta không khai báo giá trị cho các đối số vào lần sử dụng phương thức Find tiếp theo, Các giá trị thiết lập đã lưu trước đó sẽ được sử dụng. Việc thiết lập các đối số này làm thay đổi các tùy chọn thiết lập trong hộp thoại Find, và việc thay đổi các thiết lập trong hộp thoại Find sẽ làm thay đổi các giá trị đã lưu – là những giá trị được sử dụng nếu ta bỏ qua các đối số này. Để tránh xảy ra việc này, ta nên khai báo các đối số một cách rõ ràng/tường minh mỗi lần sử dụng phương thức Find này. Nếu các thiết lập được chỉ định không cụ thể, chính xác, bạn sẽ có một kết quả không như mong muốn.

- The After setting is also very important. Whichever cell is set here will be the last one searched and not the first as some may expect. For this reason, one should always set this explicitly each and every time you use the Find Method.
Yet another trap can be the incorrect use of the After:= setting. If the Range Object specified is NOT within the range you are using Find on, you will get an error. For example, if you wanted to find a value on another Worksheet (not the Active one), restrict the Find to, say Column A and then select the found cell, you could use;
Việc thiết lập cho tham số After cũng rất quan trọng. Bất kỳ ô nào được dùng làm tham số After cũng sẽ là ô tìm thấy lần cuối cùng của lần sử dụng trước đó, chứ không phải là ô tìm kiếm đầu tiên như nhiều người nghĩ. Vì vậy, bất cứ khi nào sừ dụng phương thức Find, bạn phải khai báo tường minh tham số này.
Một chỗ cần lưu ý khác khi thiết lập tham số After:= có thể khiến cho việc sử dụng Find bị lỗi: Nếu range được xác định trong After không nằm trong phạm vi bạn đang tìm, bạn sẽ nhận được một lỗi.
Ví dụ, nếu bạn muốn tìm một giá trị trên Worksheet khác (không phải là Sheet Active), giới hạn vùng tìm cụ thể là Cột A (Columns(1)), sau đó chọn các ô được tìm thấy, bạn dùng đoạn code sau:
PHP:
Sub FindCatOtherSheet()
Dim rFound As Range
On Error Resume Next
With Sheet1
Set rFound = .Columns(1).Find(What:="Cat", After:=.Cells(1, 1), _ 
LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False , _
SearchFormat:=False)
On Error GoTo 0
If Not rFound Is Nothing Then Application.Goto rFound, True
End With
Note the use of .Cells(1,1) as the After:= setting. If this was ANY cell NOT within Column A the code would normally bug-out. However, the use of On Error Resume Next prevents this. BUT, despite that you will not be taken to the cell.
Lưu ý việc sử dụng .Cells (1,1) trong phần After:=.Cells(1, 1).
Cells(1,1) luôn phải thuộc về phạm vi ta muốn tìm. Vì ta đang tìm trong sheet1, nên Cells(1,1) phải thuộc sheet1 nên có dấu chấm (.Cells (1,1)).
Hoặc thí dụ ta đang sử dụng pham vi tìm kiếm là .Columns(1) mà ta dùng After:=.Cells(1, 3); .Cells(1, 3) không thuộc Columns(1) kết quả lúc này báo lỗi.
Nếu sử dụng On Error Resume Next sẽ bỏ qua lỗi, nhưng sử dụng On Error Resume Next kết quả vẫn không được dẫn tới Cell đó.

- The example code below shows how we can use the Find Method on any Excel Worksheet to locate all occurrences of the Word "Cat" add a cell comment to each cell.
Code dưới đây chỉ cho chúng ta cách sử dụng các phương pháp Find trên bất kỳ Worksheet để xác định vị trí xuất hiện của tất cả các từ "Cat" và gán thêm 1 comment trên Cell tìm thấy.

- Note the use of the COUNTIF Worksheet Function to restrict the Find to the exact number of the times the word "Cat" appears in Column 1.
Note also the setting of a Range variable (rFoundCell) to the found cell each time the word "Cat" found. This same variable is then used in the After setting of the Find Method.
Lưu ý rằng việc sử dụng hàm COUNTIF của Excel có thể giới hạn số lần lặp cho việc tìm số lần chữ "Cát" xuất hiện ở trong cột 1.
Cũng lưu ý cách sử dụng một biến Range (rFoundCell) gán cho những ô mà từ "Cat" được tìm thấy. Biến như vậy cũng sẽ được sử dụng cho tham số After trong Phương pháp Find.
PHP:
Sub Find_Bold_Cat()
Dim lCount As Long
Dim rFoundCell As Range
Set rFoundCell = Range("A1")
For lCount = 1 To WorksheetFunction.CountIf(Columns(1), "Cat")
Set rFoundCell = Columns(1).Find(What:="Cat", After:=rFoundCell, _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False) 
With rFoundCell
.ClearComments
.AddComment Text:="Cat lives here"
End With 
Next lCount
End Sub
Giải thích đoạn code trên:
Sub Find_Bold_Cat()
‘Tìm những chữ Cat và thêm 1 comment là "Cat lives here"
‘’===========================================
‘Đếm những “Cat” trong cột A và xác định những lần tìm là kết quả đếm.
For lCount = 1 To WorksheetFunction.CountIf(Columns(1), "Cat")
‘Tìm trong cột A, xác định ô tìm thấy có chữ “Cat” gán vào biến rFoundCell
Set rFoundCell = Columns(1).Find(What:="Cat", After:=rFoundCell,
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False)
‘Tại Range tìm thấy, xóa các comment và gán Comment "Cat lives here"
With rFoundCell
.ClearComments
.AddComment Text:="Cat lives here"
End With
‘Tìm tiếp tục cho đến khi số lần tìm = lCount
Next
End Sub

- To find cells that match more complicated patterns, use a For Each...Next statement with the Like operator. For example, the following code searches for all cells in the range A1:C5 that use a font whose name starts with the letters Cour. When Microsoft Excel finds a match, it changes the font to Times New Roman.
Để tìm kiếm ô khớp với các dạng thức phức tạp, hãy sử dụng vòng lặp For Each … Next với toán tử Like. Lấy ví dụ, đoạn code kèm theo sẽ tìm tất cả các ô trong vùng tìm kiếm từ A1:C5 có sử dụng font chữ có tên bắt đầu với chuỗi ký tự “Cour”. Khi Excel tìm thấy ô đó, nó sẽ đổi font của ô đó thành “Times New Roman”.

PHP:
For Each Rng In [A1:C5]
    If Rng.Font.Name Like "Cour*" Then
        Rng.Font.Name = "Times New Roman"
    End If
Next
 
Lần chỉnh sửa cuối:
Kết quả sẽ là như sau:
PHP:
                            Cells.Find(What:="SUN", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, _
SearchFormat:=False).Activate


Code trên nghĩa là:
Trích:
Tìm toàn bộ cell (Cells)
What:=”Cat”: tìm từ SUN
After:=ActiveCell: vị trí bắt đầu tìm: từ sau cell active trong trường hợp này là A1, do ở đây đã chọn toàn bộ bảng (Cells.) bao phủ cả ActiveCell nên việc tìm kiếm sẽ bao gồm toàn bộ bảng và bắt đầu từ A1
LookIn:=xlValues: Tìm giá trị (phần này còn có thông số formulas)

Các thông số khác:
LookAt:= xlPart, MatchCase:=False và
LookAt:= xlWhole, MatchCase:=True
Muốn dễ hiểu nhất thì khi bạn ghi macro, Ctr F vào khung option và tùy chọn các
- Match entire cell contents
- Match case
Bạn sẽ hình dung cụ thể.

SearchOrder:=xlByRows, SearchDirection:=xlNext, SearchFormat:=False
Các thông số còn lại đã diễn giải phần trên.


Tôi thêm mấy dòng màu đỏ nhằm làm rõ nghĩa thêm.

Chúc vui!
 
Sub TestFind()
With Worksheets("Sheet1").Range("A1:A500")
Set Rng = .Find(2, LookIn:=xlValues)
If
Not Rng Is Nothing Then ‘Nếu giá trị Rng trả về không phải là Nothing thì : hay nói cách khác : Nếu tìm thấy thì
firstAddress
= Rng.Address ‘Lưu lại địa chỉ ô đầu tiên tìm được.

Do
Rng.Value = 5
Set Rng
= .FindNext(Rng) ‘Tìm tiếp
Loop
While Not Rng Is Nothing And Rng.Address <> firstAddress

‘Dừng vòng lặp
Do..Loop khi giá trị Rng trả về là Nothing hoặc
‘địa chỉ Rng trả về trùng với địa chỉ của ô tìm được đầu tiên
. (địa chỉ ô tìm thấy được lặp lại)

End
If
End With
End Sub
Tôi thêm vào để cho bình dân hóa.
Chúc vui!
 
PHP:
Sub Find_Bold_Cat()
Dim lCount As Long
Dim rFoundCell As Range
Set rFoundCell = Range("A1")
For lCount = 1 To WorksheetFunction.CountIf(Columns(1), "Cat")
Set rFoundCell = Columns(1).Find(What:="Cat", After:=rFoundCell, _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False) 
With rFoundCell
.ClearComments
.AddComment Text:="Cat lives here"
End With 
Next lCount
End Sub
WorksheetFunction.CountIf(Columns(1), "Cat")
Đếm tất cả các Cell trong cột 1 có giá trị là ký tự Cat (toàn bộ Cell)

Columns(1).Find(What:="Cat", After:=rFoundCell, _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False)
Tìm tất cả các Cell trong cột 1 có chứa ký tự Cat (Một phần Cell)

Vì vậy phải thay LookAt:=xlPart ---> LookAt:=xlWhole thì mới đúng


Chúc vui!
 
Sub TestFind()
With Worksheets("Sheet1").Range("A1:A500")
Set Rng = .Find(2, LookIn:=xlValues)
If
Not Rng Is Nothing Then ‘Nếu giá trị Rng trả về không phải là Nothing thì : hay nói cách khác : Nếu tìm thấy thì
firstAddress
= Rng.Address ‘Lưu lại địa chỉ ô đầu tiên tìm được.
Do
Rng.Value = 5
Set Rng
= .FindNext(Rng) ‘Tìm tiếp
Loop
While Not Rng Is Nothing And Rng.Address <> firstAddress

‘Dừng vòng lặp
Do..Loop khi giá trị Rng trả về là Nothing hoặc
‘địa chỉ Rng trả về trùng với địa chỉ của ô tìm được đầu tiên
. (địa chỉ ô tìm thấy được lặp lại)
End
If
End With
End Sub
Tôi thêm vào để cho bình dân hóa. Chúc vui!
Chúng ta đang xét đến việc tìm trên 1 cột; Nếu ta thực hiện việc này trong lệnh của menu ta sẽ thấy excel tìm từ đầu cho đến cuối vùng (VD ta đã kích hoạt vùng từ 'A1:A500')
Đến cuối xong nó quay lại anh đầu tiên; Đến lúc này nó cho hiện hộp thoại báo 'Sẽ ngưng'
Nên bạn dùng chữ "hoặc" mình thấy chưa rõ hết nghĩa.
Quy trình tìm trong VBA theo mình nghĩ cũng như trên:
Tìm thấy anh đầu tiên, ta cùng excel ghi nhận ô đó vô biến Rng & địa chỉ vô biến kiểu chuỗi;

Sau đó dùng vòng lặp tìm tiếp . . .

Dòng lệnh thoát vòng lặp khi cùng tìm thấy theo điều kiện (Có nghĩa thấy Rng thỏa) & địa chỉ nó trùng với địa chỉ lưu trong biến chuỗi (Khi đi tìm & thấy đã giáp 1 vòng) lúc đó mới thoát.

Rất cảm ơn bạn!
 
PHP:
Loop While Not Rng Is Nothing And Rng.Address <> firstAddress
Nên bạn dùng chữ "hoặc" mình thấy chưa rõ hết nghĩa.
Quy trình tìm trong VBA theo mình nghĩ cũng như trên:
Tìm thấy anh đầu tiên, ta cùng excel ghi nhận ô đó vô biến Rng & địa chỉ vô biến kiểu chuỗi;

Sau đó dùng vòng lặp tìm tiếp . . .

Dòng lệnh thoát vòng lặp khi cùng tìm thấy theo điều kiện (Có nghĩa thấy Rng thỏa) & địa chỉ nó trùng với địa chỉ lưu trong biến chuỗi (Khi đi tìm & thấy đã giáp 1 vòng) lúc đó mới thoát.

Rất cảm ơn bạn!

Mình thì lại nghĩ khác : Có 2 cách để diễn giải


  • Nếu dùng hoặc (phủ định) : Vòng lặp trên sẽ thoát chỉ cần một trong hai điều kiện không được thỏa : hoặc không tìm thấy, hoặc địa chỉ Cell tìm thấy trùng với Địa chỉ Cell tìm thấy đầu tiên

  • Nếu dùng (khẳng định): Vòng lặp trên vẫn tiếp tục nếu đồng thời cả 2 điều kiện được thỏa : Tìm thấyđịa chỉ Cell tìm thấy trùng với địa chỉ Cell tìm thấy đầu tiên
Ca-dafi đang nói về thoát vòng lặp (trường hợp 1), vì vậy dùng hoặc là đúng.

Còn như bạn nói :

Dòng lệnh thoát vòng lặp khi cùng tìm thấy theo điều kiện (Có nghĩa thấy Rng thỏa) & địa chỉ nó trùng với địa chỉ lưu trong biến chuỗi (Khi đi tìm & thấy đã giáp 1 vòng) lúc đó mới thoát
Theo tôi nghĩ là chưa chính xác.

Chúc vui!
 
Lần chỉnh sửa cuối:
Các anh, chị giúp em Macro này với! Find_Cute_Paste

Các anh, chị GPE giúp em Macro này với! Em làm mãi mà không xong! chăm học mà không hiểu!
TRÂN TRỌNG CÁM ƠN!

Khi nhập 1 giá trị để tìm kiếm là 1 số có từ 1 đến 6 chữ số (chẳng hạn 1 hoặc 123456) vào ô UserForm hoặc là vào 1 ô (VD: B3), rồi chạy macro (bằng việc nhấn Enter thì tốt - cho giảm thao tác – hehee…), thì macro sẽ tìm chính xác giá trị nêu trên tại các ô tiếp theo thuộc cột B, nếu không có giá trị nào được tìm thấy hoặc tìm được nhiều giá trị thì liệt kê các giá trị tìm đc ra 1 thông báo (để người dùng biết được kết quả là 0 hoặc có 2 giá trị trở lên), sau khi nhấn Enter (để thoát thông báo – nếu có duy nhất 1 giá trị tìm được (công việc chủ yếu là trường hợp này - code không thông báo và không phải nhấn nút Enter lần nữa; hixhee…e hà tiện thao tác chút!) thì Cut duy nhất dòng có chứa giá trị tìm được kế tiếp (dưới ô B3) rồi dán vào dòng *3 (dòng chứa ô B3), và thoát UserForm (nếu có)…Hết
Thankscác anh, chị GPE!
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn thử với macro sự kiện tại [B3] như sau

& cho biết cần fải sửa cái chi.
 

File đính kèm

Bác HYen17 thân mến!
Cám ơn B rất nhiều! Kết quả đạt đc 96% rùi! còn thêm mấy vấn đề này B giúp chót nha ( ! Hee hee - Thanks - Good luck to you!

1. Giá trị <0 và đặc biệt là để trống (rỗng) ô B3 thì Code vẫn thực hiện tìm kiếm (B3 rỗng thì kết quả rất lớn!) ! - sửa thành: Ra thông báo "Chưa nhập dữ liệu!" và không thực hiện tìm kiếm (số không hoặc âm hoặc thập phân hoặc là có chứa bất kỳ ký tự ko phải là số tự nhiên thì Code thông báo dữ liệu khônng hợp lệ - Gút lại là: giá trị hợp lệ là số tự nhiên >0 . Hee hee! han che users nhap data sai)
2. Giá trị có sẵn (VD: Nhập rồi lưu lại…) thì Code không thực hiện - Sửa thêm: Code vẫn thực hiện như bình thường!

Đặc biệt cần sửa phần chữ đậm, còn lại nếu rắc rối e đành lưu ý mọi người dùng! he he
Thân!
See you soon! LTMCustoms
 
Lần chỉnh sửa cuối:
Vậy bạn thêm đoạn mã sau vô macro

Macro sẽ là vầy:
PHP:
 If Not Intersect(Target, [b3]) Is Nothing Then
'Đoạn mã Mới:'   
   Dim MyDir As String, KhTiep As Boolean
   If Not IsNumeric(Target.Value) Then
      MsgBox  "Khong Fai Só Tu Nhien":           Exit Sub
   End If
   If Target.Value <= 0 Then
      MyDir = "Só Quá Bé!":                      KhTiep = True
   End If
   If Int(Target.Value) < Target.Value Then
      MyDir = "Khong Chap Nhan Só Thap Fan!":    KhTiep = True
   End If
   If KhTiep Then
      MsgBox MyDir:                              Exit Sub
   End If
   '*              *                   *                   *           *           *'
   Dim Rng As Range, sRng As Range, Rg0 As Range
   Dim MyAdd As String   '<=| Dòng Lenh Này Da Duoc Sua Lại'
   Dim Jj As Byte
 
Lần chỉnh sửa cuối:
Bác HYen17Bác ChanhTQ@ thân mến!Cám ơn các B rất nhiều - vì sự giúp đỡ kịp thời %#^#$


Kết quả OKie rùi! Như đã cảnh báo được các trường hợp nhập giá trị sai:
- Giá trị <0 : "Số Quá Bé!"
- Giá trị thập phân : "Khong Chap Nhan Só Thap Fan!"
- Giá trị khác: "Khong Fai Só Tu Nhien"

Chân thành cám ơn!


Thanks a lot!
Thân --------------- LTMCustoms
 

File đính kèm

Lần chỉnh sửa cuối:
Xin cho mình hỏi nếu dùng phương thức tìm kiếm này có cách nào phân biệt khi tìm kiếm các giá trị giống nhau xuất hiện nhiều lần không nhỉ? Ví dụ như giá trị 111 xuất hiện nhiều lần mình có cách nào phân biệt các lần xuất hiện đó lần thứ mất hay không?
 
Hi bạn,
Cho mình hỏi ngu tí, sao cáo code của sub TimvaThaythe không chạy được nhỉ, nó báo lỗi Loop without Do
 
Hi bạn,
Cho mình hỏi ngu tí, sao cáo code của sub TimvaThaythe không chạy được nhỉ, nó báo lỗi Loop without Do

Bạn đang nói đến Sub T... đang ở bài nào trong topic (nào?) vậy.
 
Bạn đang nói đến Sub T... đang ở bài nào trong topic (nào?) vậy.
À mình đang nói tới code #3 của ThuNghi.
Nhân tiện mình đang có một vấn đề:
Mình có một danh sách các khế ước vay. Mình đang muốn viết một code để tìm xem có khế ước vay mới nào phát sinh thêm không (chưa có trong danh sách khế ước đã có) -> Nếu có thì copy khế ước đó vào dòng tiếp theo của danh sách khế ước cũ (chỉ copy một lần đối với mỗi khế ước mới). Mong các bạn chỉ giúp, mình rất gà về VBA.
 
[ThongBao](2) À mình đang nói tới code #3 của ThuNghi.

(1) Nhân tiện mình đang có một vấn đề:
Mình có một danh sách các khế ước vay. Mình đang muốn viết một code để tìm xem có khế ước vay mới nào phát sinh thêm không (chưa có trong danh sách khế ước đã có) -> Nếu có thì copy khế ước đó vào dòng tiếp theo của danh sách khế ước cũ (chỉ copy một lần đối với mỗi khế ước mới). Mong các bạn chỉ giúp, mình rất gà về VBA.[/ThongBao]

(1) Bạn nên đưa file giả lập lên; Cũng nhiều người lười biếng làm file giả lập cho bạn lắm đấy!

(2) Bạn lấy cái ni thay thế:
PHP:
Option Explicit
Sub TimVaThayThe()
 Dim OldText As String, NewText As String, DiaChi As String     'Sa'
 Dim MyRng As Range, Rng As Range
 
1 Set MyRng = Range(Cells(1, 1), Cells(18, 4))
 OldText = "3":                                         NewText = "test"
 With MyRng
2    Set Rng = .Find(What:=OldText, LookIn:=xlValues, LookAt:=xlWhole)
3    If Not Rng Is Nothing Then
        DiaChi = Rng.Address
        Do
            With Rng.Offset(, 5)
5 '           With Rng            <=| Khong Càn Dòng Này'
                .Value = NewText
                .Interior.ColorIndex = 36
                .Font.Bold = True
             End With
            Set Rng = .FindNext(Rng)
7 '            If Rng Is Nothing Then Exit Sub  <=| Khong Càn Dòng Này'
         Loop While Not Rng Is Nothing And Rng.Address <> DiaChi
9      End If
   End With
End Sub

Với những ghi chú thêm như sau:

a./ Câu lệnh mang số 1 có thể thay bằng câu lệnh:
Mã:
1 Set MyRng = Cells(1, 1).CurrentRegion

Tương tự như vậy câu lệnh mang số 2 sẽ có thể là:
Mã:
2    Set Rng = .Find(OldText, , xlValues, xlWhole)

b./ Câu lệnh mang số 5 là dư hẵn; Để tránh sai sót này, những nhà lập trình amatơ nên thụt đầu dòng các khối lệnh thẳng cột

C./ Câu lệnh mang số 7 cũng dư thừa không cần thiết;
Điều này rõ hơn khi ta xem khối lệnh điều kiện từ dòng lệnh mang số 3 đến dòng lệnh mang số 9; Trong điều kiện này thì không thể nào sẩy ra trường hợp để thực thi dòng lệnh dư này; Nó chỉ để đó như ngồi chơi xơi nước mà thôi.

Muốn viết làm nó có tác dụng thực tế ta fải viết vầy:

Mã:
3    If Not Rng Is Nothing Then
     '. . . . . '
      Else
              Exit Sub 
9     End If

(Rồi sau này bạn sẽ biết, rằng cũng chả nhứt thiết fải xài bổ sung nó làm chi!)

--=0 }}}}} --=0 }}}}} --=0
Thân.
 
[ThongBao](2) À mình đang nói tới code #3 của ThuNghi.

(1) Nhân tiện mình đang có một vấn đề:
Mình có một danh sách các khế ước vay. Mình đang muốn viết một code để tìm xem có khế ước vay mới nào phát sinh thêm không (chưa có trong danh sách khế ước đã có) -> Nếu có thì copy khế ước đó vào dòng tiếp theo của danh sách khế ước cũ (chỉ copy một lần đối với mỗi khế ước mới). Mong các bạn chỉ giúp, mình rất gà về VBA.[/ThongBao]

(1) Bạn nên đưa file giả lập lên; Cũng nhiều người lười biếng làm file giả lập cho bạn lắm đấy!

(2) Bạn lấy cái ni thay thế:
PHP:
Option Explicit
Sub TimVaThayThe()
 Dim OldText As String, NewText As String, DiaChi As String     'Sa'
 Dim MyRng As Range, Rng As Range
 
1 Set MyRng = Range(Cells(1, 1), Cells(18, 4))
 OldText = "3":                                         NewText = "test"
 With MyRng
2    Set Rng = .Find(What:=OldText, LookIn:=xlValues, LookAt:=xlWhole)
3    If Not Rng Is Nothing Then
        DiaChi = Rng.Address
        Do
            With Rng.Offset(, 5)
5 '           With Rng            <=| Khong Càn Dòng Này'
                .Value = NewText
                .Interior.ColorIndex = 36
                .Font.Bold = True
             End With
            Set Rng = .FindNext(Rng)
7 '            If Rng Is Nothing Then Exit Sub  <=| Khong Càn Dòng Này'
         Loop While Not Rng Is Nothing And Rng.Address <> DiaChi
9      End If
   End With
End Sub

Với những ghi chú thêm như sau:

a./ Câu lệnh mang số 1 có thể thay bằng câu lệnh:
Mã:
1 Set MyRng = Cells(1, 1).CurrentRegion

Tương tự như vậy câu lệnh mang số 2 sẽ có thể là:
Mã:
2    Set Rng = .Find(OldText, , xlValues, xlWhole)

b./ Câu lệnh mang số 5 là dư hẵn; Để tránh sai sót này, những nhà lập trình amatơ nên thụt đầu dòng các khối lệnh thẳng cột

C./ Câu lệnh mang số 7 cũng dư thừa không cần thiết;
Điều này rõ hơn khi ta xem khối lệnh điều kiện từ dòng lệnh mang số 3 đến dòng lệnh mang số 9; Trong điều kiện này thì không thể nào sẩy ra trường hợp để thực thi dòng lệnh dư này; Nó chỉ để đó như ngồi chơi xơi nước mà thôi.

Muốn viết làm nó có tác dụng thực tế ta fải viết vầy:

Mã:
3    If Not Rng Is Nothing Then
     '. . . . . '
      Else
              Exit Sub 
9     End If

(Rồi sau này bạn sẽ biết, rằng cũng chả nhứt thiết fải xài bổ sung nó làm chi!)

--=0 }}}}} --=0 }}}}} --=0
Thân.
Thanks bạn nhen.
Mình sẽ cố gắng upfile để moi người dễ dàng tìm hiểu hơn.
Thân
 
Nhân tiện đây các bạn cho mình hỏi cái code sau của mình sao nó không chạy đuoc voi. Mình muốn kiểm tra các giá trị tại cột C,nếu >0 thì copy giá trị đó sang một vị trí khác, ở đây là cột D tương ứng. (mình ko copy code vào đây được :( )

Sub Teting()
Dim x As Integer
Worksheets ("Sheet1").Select
For x = 1 To 100
If Range ("C"&x).Value>0 Then
Range ("C"&x).Copy Range("D"&x)
Else
Exit For
End If
Next x
End Sub
 
Nhân tiện đây các bạn cho mình hỏi cái code sau của mình sao nó không chạy đuoc voi. Mình muốn kiểm tra các giá trị tại cột C,nếu >0 thì copy giá trị đó sang một vị trí khác, ở đây là cột D tương ứng. (mình ko copy code vào đây được :( )Sub Teting()Dim x As IntegerWorksheets ("Sheet1").SelectFor x = 1 To 100If Range ("C"&x).Value>0 Then Range ("C"&x).Copy Range("D"&x)Else Exit ForEnd IfNext xEnd Sub
 
Nhân tiện đây các bạn cho mình hỏi cái code sau của mình sao nó không chạy đuoc voi. Mình muốn kiểm tra các giá trị tại cột C,nếu >0 thì copy giá trị đó sang một vị trí khác, ở đây là cột D tương ứng. (mình ko copy code vào đây được :( )

Sub Teting()
Dim x As Integer
Worksheets ("Sheet1").Select
For x = 1 To 100
If Range ("C"&x).Value>0 Then
Range ("C"&x).Copy Range("D"&x)
Else
Exit For
End If
Next x
End Sub


Bạn bị dính chưởng ở dòng màu đỏ, xoá nó đi là OK:
Mã:
Sub Teting()
Dim x As Integer
Worksheets ("Sheet1").Select
For x = 1 To 100
If Range ("C"&x).Value>0 Then
     Range ("C"&x).Copy Range("D"&x)
[B][COLOR=#ff0000]Else
     Exit For[/COLOR][/B]
End If
Next x
End Sub
 
Web KT

Bài viết mới nhất

Back
Top Bottom