Find trong VBA không tìm thấy số liệu, trong khi find Excel lai tìm thấy binh thường? (1 người xem)

  • Thread starter Thread starter pmhoang
  • Ngày gửi Ngày gửi

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

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Find trong VBA không tìm thấy số liệu, trong khi find Excel lai tìm thấy binh thường?
Mình dùng find trong excel thì tìm thấy bình thường (bỏ chọn Match entire cell contents)
Nhưng khi lập trình Find trong VBA thì nó không tìm thấy được, mong các bạn giúp đở

Có file gửi kèm (ở sheet Find Single)
PHP:
Sub Find_Single()  Dim rng, RngKQ As Range
  Dim FirstAddress, NextAddress As String
  Dim ValueSearch As Single
  
  Set rng = Range("E2:E12")
  rng.Interior.ColorIndex = 40
  ValueSearch = Application.Max(rng)
  
  Set RngKQ = rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlPart)
  If RngKQ Is Nothing Then
    MsgBox "Khong tim thay cell co ket qua lon nhat"
  Else
    FirstAddress = RngKQ.Address
    RngKQ.Offset(0, 1).Value = FirstAddress
    Do Until NextAddress = FirstAddress
      Set RngKQ = rng.FindNext(RngKQ)
      NextAddress = RngKQ.Address
      RngKQ.Offset(0, 1).Value = NextAddress
    Loop
  End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Find trong VBA không tìm thấy số liệu, trong khi find Excel lai tìm thấy binh thường?
Mình dùng find trong excel thì tìm thấy bình thường (bỏ chọn Match entire cell contents)
Nhưng khi lập trình Find trong VBA thì nó không tìm thấy được, mong các bạn giúp đở

Có file gửi kèm (ở sheet Find Single)
PHP:
Sub Find_Single()  Dim rng, RngKQ As Range
  Dim FirstAddress, NextAddress As String
  Dim ValueSearch As Single
  
  Set rng = Range("E2:E12")
  rng.Interior.ColorIndex = 40
  ValueSearch = Application.Max(rng)
  
  Set RngKQ = rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlPart)
  If RngKQ Is Nothing Then
    MsgBox "Khong tim thay cell co ket qua lon nhat"
  Else
    FirstAddress = RngKQ.Address
    RngKQ.Offset(0, 1).Value = FirstAddress
    Do Until NextAddress = FirstAddress
      Set RngKQ = rng.FindNext(RngKQ)
      NextAddress = RngKQ.Address
      RngKQ.Offset(0, 1).Value = NextAddress
    Loop
  End If
End Sub

không biết nữa, thôi xài đỡ cái này coi
Mã:
Sub Find_Single()
 Dim rng, maxad As Range, maxvalue As Long
 Set rng = [a2:a12]
 maxvalue = Application.WorksheetFunction.Max(rng)
 Set maxad = rng.Find(maxvalue, , , 1)
 If Not maxad Is Nothing Then MsgBox maxad.Address
 
End Sub
 
Upvote 0
Mình thử làm vầy & có lúc đạt được kết quả:

(*) Khai báo lại kiểu của biến
Mã:
 Dim ValueSearch As Double

(*) Sửa con số 90 gì đó tại [a7] thành con số 81

(*) Sửa lại dòng lệnh này thành vầy:
PHP:
Set RngKQ = Rng.Find(ValueSearch, , xlValues, xlWhole)
 
Upvote 0
không biết nữa, thôi xài đỡ cái này coi
Mã:
Sub Find_Single()
 Dim rng, maxad As Range, maxvalue As Long
 Set rng = [a2:a12]
 maxvalue = Application.WorksheetFunction.Max(rng)
 Set maxad = rng.Find(maxvalue, , , 1)
 If Not maxad Is Nothing Then MsgBox maxad.Address
 
End Sub
maxvalue as long, là số nguyên, mà số liệu của mình là một số có tự nhiên nhiều dấu phẩy ở sau cùng, range mình cần lấy max là cột E bạn à. code của bạn nó chạy được ở cột A, mà không chạy được ở cột E?

Xin mọi người giúp đở mình tìm ra địa chỉ ô có có trị lớn nhất ở cột E?
file gửi kèm ở bài #1, cảm ơn các bạn nhiều.
 
Upvote 0
Mình thử làm vầy & có lúc đạt được kết quả:

(*) Khai báo lại kiểu của biến
Mã:
 Dim ValueSearch As Double

(*) Sửa con số 90 gì đó tại [a7] thành con số 81

(*) Sửa lại dòng lệnh này thành vầy:
PHP:
Set RngKQ = Rng.Find(ValueSearch, , xlValues, xlWhole)

Cũng không được luôn bạn à
(mà mình cần lấy giá trị max của cột E, mà làm vẫn chưa được)
 
Upvote 0
Cũng không được luôn bạn à
(mà mình cần lấy giá trị max của cột E, mà làm vẫn chưa được)

/(/hững kết quả nghiên cứu của mình như sau:

Bước chuẩn bị cần thiết: Sửa lại dòng lệnh này:
PHP:
Dim ValueSearch As Double

(1) Số vô tỉ & hữu tỉ
1.1 Sửa con số ở [A7] thành 81 & bấm chạy macro, ta sẽ thu được kết quả.
1.2 Nhưng nếu ta cũng sửa [A8] thành con số 81 & sửa [b8] => 101 (là con số không chia hết cho 7) thì fương thức FIND() không tìm ra
/(ết luận sơ bộ: Không thể áp dụng fương thức này cho số vô tỉ được

(2) (òn chuyện khẳng định mệnh đề này, xin giao lại bạn tiếp tục!
 
Upvote 0
Do số bị lệch khi value và search array được chuyển dạng để so sánh. Cách giải quyết:
What:=CStr(ValueSearch)

Lưu ý: bài của bạn làm như vậy là không đúng đắn. Trước khi tìm, nó cần phải xoá cột kết quả (cột F)
 
Lần chỉnh sửa cuối:
Upvote 0
/(/hững kết quả nghiên cứu của mình như sau:

Bước chuẩn bị cần thiết: Sửa lại dòng lệnh này:
PHP:
Dim ValueSearch As Double

(1) Số vô tỉ & hữu tỉ
1.1 Sửa con số ở [A7] thành 81 & bấm chạy macro, ta sẽ thu được kết quả.
1.2 Nhưng nếu ta cũng sửa [A8] thành con số 81 & sửa [b8] => 101 (là con số không chia hết cho 7) thì fương thức FIND() không tìm ra
/(ết luận sơ bộ: Không thể áp dụng fương thức này cho số vô tỉ được

(2) (òn chuyện khẳng định mệnh đề này, xin giao lại bạn tiếp tục!
Không phải phương thức find không tìm thấy số có nhiều dấu phẩy, mình có thể kiểm tra như sau
1. vẫn để nguyên: Dim ValueSearch As Single
2. A7 vẫn để số 90, lúc này số max mắt thường có thể nhìn thấy được là 23.086
3. ta nhập sô này vào trực tiếp phương thực find thì nó tìm thấy rất ok
cụ thể code như sau:

Sub Find_Single() Dim rng, RngKQ As Range
Dim FirstAddress, NextAddress As String
Dim ValueSearch As Single

Set rng = Range("E2:E12")
rng.Interior.ColorIndex = 40
ValueSearch = Application.Max(rng)

Set RngKQ = rng.Find(What:=23.086, LookIn:=xlValues, LookAt:=xlPart)
If RngKQ Is Nothing Then
MsgBox "Khong tim thay cell co ket qua lon nhat"
Else
FirstAddress = RngKQ.Address
RngKQ.Offset(0, 1).Value = FirstAddress
MsgBox "Da tim thay cell lon nhat la: " & FirstAddress
End If
End Sub
Vấn để ở đây là số liệu thì thay đổi, nên số max cũng thay đổi theo, làm sao để VBA tự động nhận dạng số max để nó dùng find mà tìm, chứ không phải nhập thủ công số vào rồi nó mới tìm thì còn gì gọi là vba tự động tìm. Chưa giải quyết được bài toán. Mong anh em góp ý
 
Lần chỉnh sửa cuối:
Upvote 0
Do số bị lệch khi value và search array được chuyển dạng để so sánh. Cách giải quyết:
What:=CStr(ValueSearch)

Lưu ý: bài của bạn làm như vậy là không đúng đắn. Trước khi tìm, nó cần phải xoá cột kết quả (cột F)
Đúng là sửa như bạn nó find nó tìm thấy
code 1
Mã:
  Set RngKQ = rng.Find(What:=CStr(ValueSearch), LookIn:=xlValues, LookAt:=xlPart)
Nhưng cũng là một cách giống như bạn mà tại sao find nó không tìm thấy
code 2
Mã:
ValueSearch = CStr(ValueSearch)
  Set RngKQ = rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlPart)
Theo nghĩa thì 2 code đó giống nhau, nhưng sao code 1 lai chạy find tìm thấy, code 2 find nó không tìm thấy? Bạn nào hiểu được find chỉ giúm mình hiểu với.
 
Upvote 0
Đúng là sửa như bạn nó find nó tìm thấy
code 1
Mã:
  Set RngKQ = rng.Find(What:=CStr(ValueSearch), LookIn:=xlValues, LookAt:=xlPart)
Nhưng cũng là một cách giống như bạn mà tại sao find nó không tìm thấy
code 2
Mã:
ValueSearch = CStr(ValueSearch)
  Set RngKQ = rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlPart)
Theo nghĩa thì 2 code đó giống nhau, nhưng sao code 1 lai chạy find tìm thấy, code 2 find nó không tìm thấy? Bạn nào hiểu được find chỉ giúm mình hiểu với.
Tại vì biến ValueSearch bạn khai báo As Single ở trên rồi. Phải khai báo dạng String mới đúng
(nếu làm theo cách 1 thì không cần khai báo lại. Lý do tại sao bạn.. tự suy nghĩ nhé)
 
Upvote 0
Do số bị lệch khi value và search array được chuyển dạng để so sánh. Cách giải quyết:
What:=CStr(ValueSearch)
Mình đã làm như ý của bạn, và khi áp dụng vào chương trình thì mới biết là vẫn còn lỗi gì đó, nên khoảng 15 hay 20 lần tìm thấy thì có 1 vài lần nó không tìm thấy?

Mong các anh chị GPE nguyên cứu và giúp mình cái find này nha. xin chân thành cảm ơn anh em

PS. file gửi kèm, nhấp vào nút vài lần là sẽ có lần nó không tìm thấy số max?
 

File đính kèm

Upvote 0
Tại vì biến ValueSearch bạn khai báo As Single ở trên rồi. Phải khai báo dạng String mới đúng
(nếu làm theo cách 1 thì không cần khai báo lại. Lý do tại sao bạn.. tự suy nghĩ nhé)
Giờ thì em đã hiểu tại sao code 1 khác code 2, Em cảm ơn anh rất nhiều
Đã thay đổi lại code, nhưng không chạy được luôn
Mã:
Sub Find_Single()
  Dim rng, RngKQ As Range
  Dim FirstAddress, NextAddress As String
  Dim ValueSearch As String
  
  Set rng = Range("E2:E12")
  rng.Interior.ColorIndex = 40
  rng.Offset(0, 1).ClearContents
  rng.Offset(0, 1).Interior.ColorIndex = 0
  
  ValueSearch = Application.Max(rng)
  ValueSearch = CStr(ValueSearch)
  Set RngKQ = rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlPart)


  If RngKQ Is Nothing Then
    rng.Offset(0, 1).Interior.ColorIndex = 4
    MsgBox "Khong tim thay cell co ket qua lon nhat"
  Else
    FirstAddress = RngKQ.Address
    RngKQ.Offset(0, 1).Value = FirstAddress
  End If
End Sub
 
Upvote 0
Mình đã làm như ý của bạn, và khi áp dụng vào chương trình thì mới biết là vẫn còn lỗi gì đó, nên khoảng 15 hay 20 lần tìm thấy thì có 1 vài lần nó không tìm thấy?

Mong các anh chị GPE nguyên cứu và giúp mình cái find này nha. xin chân thành cảm ơn anh em

PS. file gửi kèm, nhấp vào nút vài lần là sẽ có lần nó không tìm thấy số max?

Đầu tiên bạn hãy thí nghiệm thế này:
- Tại cell F1, gõ công thức =MAX(E2:E12)
- Xong, bôi đên công thức tại F1 trên thanh Formula rồi bấm F9. Nhìn thấy con số kết quả gì đó, hãy bấm Ctrl + C rồi bấm ESC
- Tiếp theo, chọn nguyên cột E, bấm Ctrl + F. Đặt con trỏ chuột tại khung Find what, bấm Ctrl + V
- Giờ bấm Find Next xem nó có tìm được không?
-----------------------------------------
Các bạn hãy lưu ý điều này: Công cụ Find and Replace nó không tìm giá trị thật mà tìm cái gì nó "nhìn thấy thực tế" trên màn hình
 
Upvote 0
Đầu tiên bạn hãy thí nghiệm thế này:
- Tại cell F1, gõ công thức =MAX(E2:E12)
- Xong, bôi đên công thức tại F1 trên thanh Formula rồi bấm F9. Nhìn thấy con số kết quả gì đó, hãy bấm Ctrl + C rồi bấm ESC
- Tiếp theo, chọn nguyên cột E, bấm Ctrl + F. Đặt con trỏ chuột tại khung Find what, bấm Ctrl + V
- Giờ bấm Find Next xem nó có tìm được không?
-----------------------------------------
Các bạn hãy lưu ý điều này: Công cụ Find and Replace nó không tìm giá trị thật mà tìm cái gì nó "nhìn thấy thực tế" trên màn hình

Theo cach của find nó làm việc, nên mình đã nghĩ ra cách khắc phục lỗi không tìm thấy của nó như code sau
mình không cho nó tìm trực tiếp giá trị max nữa, mà mình sẽ lấy giá trị max đó với 1 chữ số sau dấu phẩy để dùng find
bây giờ thì nó tìm thấy mọi số luôn (chỉ có 1 lỗi nhỏ là... khi bạn chạy code kiemtra sẽ gặp lỗi )
Sub kiemtra()
[I2].Value = 0
For i = 1 To 100000
[H2].Value = i
Call Find_Single
i = i + 1
Next
End Sub


Sub Find_Single()


Dim rng, RngKQ As Range
Dim FirstAddress, NextAddress As String
Dim Value_max As Single
Dim Value_max_so_nguyen As Integer
Dim Value_max_len As Integer
Dim tim2 As Integer
Dim Valuefind As String

Set rng = Range("E2:E12")
rng.Interior.ColorIndex = 40
rng.Offset(0, 1).ClearContents
rng.Offset(0, 1).Interior.ColorIndex = 0

Value_max = Application.Max(rng)

'--lay so chi co 1 so sau dau phay de tim kiem find
Value_max_so_nguyen = Int(Value_max) '--lay so nguyen
Value_max_len = Len(Value_max_so_nguyen) + 2 '--so tim voi 1 so sau dau phay
Valuefind = Left(Value_max, Value_max_len) '--gia tri can tim find, co 1 so sau dau phay

Set RngKQ = rng.Find(What:=Valuefind, LookIn:=xlValues, LookAt:=xlPart)

If RngKQ Is Nothing Then '--neu tim khong thay thi tang giam di 0.1 roi tim tiep
Set RngKQ = rng.Find(What:=Valuefind - 0.1, LookIn:=xlValues, LookAt:=xlPart)
[I2].Value = [I2].Value + 1
End If

If RngKQ Is Nothing Then
rng.Offset(0, 1).Interior.ColorIndex = 4
MsgBox "Khong tim thay: " & vbCr & Valuefind - 0.1
Else
FirstAddress = RngKQ.Address
RngKQ.Offset(0, 1).Value = FirstAddress
RngKQ.Offset(0, 2).Value = "co " & i
End If

End Sub
Bị lỗi tràn bộ nhớ ở biến Value_max_so_nguyen As Integer, nhưng nếu thay Value_max_so_nguyen as long, thì code lại bị chạy không được?
1. lỗi ở hàm len() ??
2. lỗi ở biến long ??
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Theo cach của find nó làm việc, nên mình đã nghĩ ra cách khắc phục lỗi không tìm thấy của nó như code sau
mình không cho nó tìm trực tiếp giá trị max nữa, mà mình sẽ lấy giá trị max đó với 1 chữ số sau dấu phẩy để dùng find
bây giờ thì nó tìm thấy mọi số luôn (chỉ có 1 lỗi nhỏ là... khi bạn chạy code kiemtra sẽ gặp lỗi )

Bị lỗi tràn bộ nhớ ở biến Value_max_so_nguyen As Integer, nhưng nếu thay Value_max_so_nguyen as long, thì code lại bị chạy không được?
1. lỗi ở hàm len() ??
2. lỗi ở biến long ??

Thế thì bạn cứ For... Next và so sánh bình thường đi. Suy nghĩ chi cho mọi chuyện rắc rối thêm
 
Upvote 0
Làm việc với số thực (có số thập phân) thì luôn luôn phải đề phòng chuyện chúng không hoàn toàn chính xác.
Cái này tôi đã đề cập nhiều lần rồi. Trong khi làm toán với số thực, ỷ lại vào sự so sánh r1 = r2 thì sẽ có ngày bỏng tay. Luôn luôn người ta so sánh abs(r1-r2)<epsilon

Lỗi hàm Len, lỗi tràn số: bạn đã hỏi ở thớt khác, và tôi đã trả lời ở bên đó. Hàm Len không có lỗi, chỉ có bạn không hiểu cách làm việc của nó thôi.
 
Upvote 0
Đang viết thì đã có các bác cao nhân giả nhời mất rồi. Thôi cũng xin thưa thớt vài câu cho thêm phần rôm rả...
====================================================================
Bạn Hoàng có một cái sai căn bản, bác VietMini cũng đã chỉ ra rồi đấy!
Hãy nhìn nhé:
[GPECODE=vb]Dim ValueSearch As Single[/GPECODE]
Điều ấy có nghĩa là kiểu của biến này là Single. Câu
[GPECODE=vb]ValueSearch = CStr(ValueSearch)[/GPECODE]
của bạn vô nghĩa vì bạn chuyển sang ký tự xong, trình dịch lại chuyển về kiểu Single theo kiểu biến đã khai báo.
Điểm nữa, với phương thức Find, hãy chú ý này:
[What] bắt buộc phải có, kiểu số liệu là Variant, là số liệu cần tìm, có thể là ký tự hoặc bất kỳ kiểu số liệu nào của Excel.
Xem trang::: http://msdn.microsoft.com/en-us/library/office/ff839746(v=office.15).aspx


Ở đây, Excel đặc tả số liệu dạng General thì What sẽ ứng với kiểu String,
[Đoạn này không hoàn toàn chính xác - tuy nhiên khi tôi dùng biện pháp ghi Macro thì dường như Excel coi tham số truyền vào qua hộp thoại Find là String]. Tôi sẽ thử tìm hiểu kỹ về vụ này sau!
[GPECODE=vb]Sub Macro4()'
' Macro4 Macro
'


'
Selection.Copy
Range("E7").Select
Application.CutCopyMode = False
Selection.Copy
Cells.Find(What:="23.08683298", After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Range("E7").Select
Application.CutCopyMode = False
Selection.ClearContents
Range("E4").Select
End Sub
[/GPECODE]
Nếu bạn dùng định dạng số thì bạn phải đưa tham số thì kiểu biến phải là Double và bạn phải có đúng kiểu định dạng như nó hiện lên trên Excel.
Ví dụ tôi định dạng 2 chữ số thập phân thì khi tìm kiếm tôi cũng phải truyền tham số tìm là như vậy bằng cách dùng
[GPECODE=vb]ValueSearch = Format(Application.Max(Rng), "#.##")[/GPECODE]

Khi bạn dùng định dạng 2 chữ số thập phân, nếu bạn dùng Hộp thoại Find với số liệu như cũ (có nhiều số sau dấu thập phân) cũng không ra kết quả đâu nhé. Từ đó, bạn hãy xem đoạn code sau có chạy không nhé (lưu ý là phải định dạng vùng tìm kiếm bằng dạng 2 số sau dấu phẩy qua hộp thoại Format Cells nhé).

[GPECODE=vb]Sub Find_Single() Dim Rng As Range, RngKQ As Range
Dim FirstAddress, NextAddress As String
Dim ValueSearch As Double
Range("G2:J12").Clear

'Set Rng la 1 vung "B2:B12"
Set Rng = Range("E2:E12")
'To mau cho de nhin
Rng.Interior.ColorIndex = 40
'Gia tri can tim la gia tri lon nhat
ValueSearch = Format(Application.Max(Rng), "#.##")

'Su dung lenh nay la chinh xac
Set RngKQ = Rng.Find(ValueSearch, LookIn:=xlValues)


If RngKQ Is Nothing Then
MsgBox "Khong tim thay cell co ket qua lon nhat"
Else
'Lay dia chi Cell cua RngKQ vua tim thay
FirstAddress = RngKQ.Address
RngKQ.Offset(0, 1).Value = FirstAddress
'Tim Cell tiep theo
'Vi FindNext tim den het Range roi lai quay tro len tren tim tiep cho nen se gap truong hop NextAddress = FirstAddress
Do Until NextAddress = FirstAddress
Set RngKQ = Rng.FindNext(RngKQ)
NextAddress = RngKQ.Address
RngKQ.Offset(0, 1).Value = NextAddress
Loop
End If
End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Làm việc với số thực (có số thập phân) thì luôn luôn phải đề phòng chuyện chúng không hoàn toàn chính xác.
Cái này tôi đã đề cập nhiều lần rồi. Trong khi làm toán với số thực, ỷ lại vào sự so sánh r1 = r2 thì sẽ có ngày bỏng tay. Luôn luôn người ta so sánh abs(r1-r2)<epsilon

Lỗi hàm Len, lỗi tràn số: bạn đã hỏi ở thớt khác, và tôi đã trả lời ở bên đó. Hàm Len không có lỗi, chỉ có bạn không hiểu cách làm việc của nó thôi.
Bạn VetMini nói ra thì ít mà làm mình ngộ ra rất nhiều. bạn là người hiểu vấn đề rất sâu. cảm ơn sự giúp đở của bạn rất nhiều.
 
Upvote 0
Đang viết thì đã có các bác cao nhân giả nhời mất rồi. Thôi cũng xin thưa thớt vài câu cho thêm phần rôm rả...
====================================================================
Bạn Hoàng có một cái sai căn bản, bác VietMini cũng đã chỉ ra rồi đấy!
Hãy nhìn nhé:
[GPECODE=vb]Dim ValueSearch As Single[/GPECODE]
Điều ấy có nghĩa là kiểu của biến này là Single. Câu
[GPECODE=vb]ValueSearch = CStr(ValueSearch)[/GPECODE]
của bạn vô nghĩa vì bạn chuyển sang ký tự xong, trình dịch lại chuyển về kiểu Single theo kiểu biến đã khai báo.
Điểm nữa, với phương thức Find, hãy chú ý này:
[What] bắt buộc phải có, kiểu số liệu là Variant, là số liệu cần tìm, có thể là ký tự hoặc bất kỳ kiểu số liệu nào của Excel.
Xem trang::: http://msdn.microsoft.com/en-us/library/office/ff839746(v=office.15).aspx


Ở đây, Excel đặc tả số liệu dạng General thì What sẽ ứng với kiểu String,
[Đoạn này không hoàn toàn chính xác - tuy nhiên khi tôi dùng biện pháp ghi Macro thì dường như Excel coi tham số truyền vào qua hộp thoại Find là String]. Tôi sẽ thử tìm hiểu kỹ về vụ này sau!
[GPECODE=vb]Sub Macro4()'
' Macro4 Macro
'


'
Selection.Copy
Range("E7").Select
Application.CutCopyMode = False
Selection.Copy
Cells.Find(What:="23.08683298", After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Range("E7").Select
Application.CutCopyMode = False
Selection.ClearContents
Range("E4").Select
End Sub
[/GPECODE]
Nếu bạn dùng định dạng số thì bạn phải đưa tham số thì kiểu biến phải là Double và bạn phải có đúng kiểu định dạng như nó hiện lên trên Excel.
Ví dụ tôi định dạng 2 chữ số thập phân thì khi tìm kiếm tôi cũng phải truyền tham số tìm là như vậy bằng cách dùng
[GPECODE=vb]ValueSearch = Format(Application.Max(Rng), "#.##")[/GPECODE]

Khi bạn dùng định dạng 2 chữ số thập phân, nếu bạn dùng Hộp thoại Find với số liệu như cũ (có nhiều số sau dấu thập phân) cũng không ra kết quả đâu nhé. Từ đó, bạn hãy xem đoạn code sau có chạy không nhé (lưu ý là phải định dạng vùng tìm kiếm bằng dạng 2 số sau dấu phẩy qua hộp thoại Format Cells nhé).

[GPECODE=vb]Sub Find_Single() Dim Rng As Range, RngKQ As Range
Dim FirstAddress, NextAddress As String
Dim ValueSearch As Double
Range("G2:J12").Clear

'Set Rng la 1 vung "B2:B12"
Set Rng = Range("E2:E12")
'To mau cho de nhin
Rng.Interior.ColorIndex = 40
'Gia tri can tim la gia tri lon nhat
ValueSearch = Format(Application.Max(Rng), "#.##")

'Su dung lenh nay la chinh xac
Set RngKQ = Rng.Find(ValueSearch, LookIn:=xlValues)


If RngKQ Is Nothing Then
MsgBox "Khong tim thay cell co ket qua lon nhat"
Else
'Lay dia chi Cell cua RngKQ vua tim thay
FirstAddress = RngKQ.Address
RngKQ.Offset(0, 1).Value = FirstAddress
'Tim Cell tiep theo
'Vi FindNext tim den het Range roi lai quay tro len tren tim tiep cho nen se gap truong hop NextAddress = FirstAddress
Do Until NextAddress = FirstAddress
Set RngKQ = Rng.FindNext(RngKQ)
NextAddress = RngKQ.Address
RngKQ.Offset(0, 1).Value = NextAddress
Loop
End If
End Sub
[/GPECODE]
Cảm ơn bạn đã giải thích rất chi tiết cái sai của mình.
 
Upvote 0

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

Back
Top Bottom