Chuyên đề giải đáp những thắc mắc về code VBA (12 người xem)

Liên hệ QC

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

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:

File đính kèm

Upvote 0
Nhờ các bạn xử lý dùm trong trường hợp này Mình sử dụng Hàm Find nó sai cái gì mà lỗi code ....yêu cầu mong muốn Mình ghi kèm trong File
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If Not Intersect(Target, [D6:D82]) Is Nothing Then
        'If Target.Offset(, -2) > Sheet2.[B6:B20].Find(Target).Offset(, 2) Then
        If Target.Value > Sheet2.[B:B].Find(Target).Offset(, 2) Then
            MsgBox "ok"
        End If
    End If
Application.EnableEvents = True
End Sub

Xin cảm ơn
Thử vầy xem kieu manh
Mã:
If Target > Sheet2.Range("B:B").Find(Target.Offset(0, -2)).Offset(0, 2) Then
 
Upvote 0
Có ma hay sao ý nó chỉ sai cels D10,20,21 còn các Cels khác đúng....Coi Lai Format như nhau mà ...

Có ma là do bạn sai 2 chỗ:
1> Thứ nhất: bạn dùng cặp lệnh Application.EnableEvents = False/True ở đầu và cuối code nên trường hợp có lỗi nào đó xuất hiện thì EnableEvents sẽ không trả về True, dẫn đến lệnh Change mất tác dụng, gõ gì cũng.. sai
Giải pháp: Bạn không có code nào tác động trực tiếp lên Target cell nên không cần cặp lệnh trên
2> Find method viết thế là thiếu và sai nghiêm trọng, sẽ có lúc đúng lúc sai
-------------------------
Tóm lại sửa code thế này sẽ ổn:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rFind As Range
  If Not Intersect(Target, [D6:D82]) Is Nothing Then
    Set rFind = Sheet2.Range("B:B").Find(Target.Offset(, -2).Value, , xlValues, xlWhole)  ''<-- Find method viết cho đầy đù, không được viết tắt
    If Not rFind Is Nothing Then
      If Target.Value > rFind.Offset(, 2) Then
        MsgBox "ok"
        Target.Select
      End If
    End If
  End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Có ma là do bạn sai 2 chỗ:
1> Thứ nhất: bạn dùng cặp lệnh Application.EnableEvents = False/True ở đầu và cuối code nên trường hợp có lỗi nào đó xuất hiện thì EnableEvents sẽ không trả về True, dẫn đến lệnh Change mất tác dụng, gõ gì cũng.. sai
Giải pháp: Bạn không có code nào tác động trực tiếp lên Target cell nên không cần cặp lệnh trên
2> Find method viết thế là thiếu và sai nghiêm trọng, sẽ có lúc đúng lúc sai
-------------------------
Tóm lại sửa code thế này sẽ ổn:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rFind As Range
  If Not Intersect(Target, [D6:D82]) Is Nothing Then
    Set rFind = Sheet2.Range("B:B").Find(Target.Offset(, -2).Value[COLOR=#ff0000], , xlValues, xlWhole[/COLOR])  ''<-- Find method viết cho đầy đù, không được viết tắt
    If Not rFind Is Nothing Then
      If Target.Value > rFind.Offset(, 2) Then
        MsgBox "ok"
        Target.Select
      End If
    End If
  End If
End Sub

Em cứ nghĩ chỗ màu đỏ bỏ bớt đi cũng ok ...cho nó gọn
Cảm ơn Anh
 
Upvote 0
Em cứ nghĩ chỗ màu đỏ bỏ bớt đi cũng ok ...cho nó gọn
Cảm ơn Anh

Bỏ bớt là SAI NGHIÊM TRỌNG luôn
- xlValues tương đương với bấm Ctrl + F chọn Values trong hộp Look in
- xlWhole tương đương với bấm Ctrl + F và check mục "Match entire cells contents"
Nếu bạn rút gọn thì code sẽ lấy theo lần bạn Find cuối cùng trên bảng tính
---------------------
Tóm lại; cái gì rút gọn được, riêng find method thì không
Ngoài ra nếu không có đoạn If not rFind is nothing thì e rằng không ổn. Ai dám chắc ăn 100% việc tìm kiếm luôn ra kết quả. Nếu tìm không thấy thì sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Bỏ bớt là SAI NGHIÊM TRỌNG luôn
- xlValues tương đương với bấm Ctrl + F chọn Values trong hộp Look in
- xlWhole tương đương với bấm Ctrl + F và check mục "Match entire cells contents"
Nếu bạn rút gọn thì code sẽ lấy theo lần bạn Find cuối cùng trên bảng tính
---------------------
Tóm lại; cái gì rút gọn được, riêng find method thì không
Ngoài ra nếu không có đoạn If not rFind is nothing thì e rằng không ổn. Ai dám chắc ăn 100% việc tìm kiếm luôn ra kết quả. Nếu tìm không thấy thì sao?

Anh ... có người Bạn mới viết cho Em vầy Anh thấy cách này có hay .... hay cách xài Find hay hơn
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target > Application.WorksheetFunction.VLookup(Target.Offset(, -2), Sheet2.[B6:D20], 3, 0) Then
        MsgBox "ok"
        Target.Select
    End If
End Sub
 
Upvote 0
Vlookup rất nhanh nếu dữ liệu đã sắp xếp.
Khi tham số cuối là 1 thì các hàm như Vlookup , Match,... dùng phép tìm nhị phân, hội tụ rất nhanh khi dữ liệu lớn.
 
Upvote 0
hú bà...........hú bà.................ai giúp em với....................:.,:.,

cODE của bạn tè le khủng khủng thế ai giúp được, nhất là không mô tả chi tiết là lỗi ở đâu, cấu trúc code thế nào, không có ghi chú trong code, thì không ai hiểu mà sửa đâu trừ tác giả viết ra nó
(xin lỗi bạn, lời nói thật như thuốc đắng, nếu sai bỏ qua)
 
Lần chỉnh sửa cuối:
Upvote 0
nhất là không mô tả chi tiết là lỗi ở đâu
- trong file có mô tả bước làm xảy ra lỗi nhé bạn.
- file ban đầu mình up thì sẽ xuất hiện lỗi vì chưa có textbox
- file hiện tại thì ở B1 và B2 thì ko thấy lỗi được.
- phải xóa đi cái textbox đi rồi thực hiện lại mới có
- mình có nêu chỗ sẽ xảy ra lỗi tại dòng 15 trong file đính kèm nhé
không có ghi chú trong code
- trong file code có ghi chú mà ít thôi chứ không phải không có nhé
ps: mình cũng chả muốn up file 1 đóng code như thế lên đâu. người giúp sẽ ngán khi xem, nhưng nếu up file không đầy đủ code để phục vụ nó thì không thấy được chỗ lỗi thì hỏi làm chi nữa bạn.
 
Upvote 0
- trong file có mô tả bước làm xảy ra lỗi nhé bạn.
- file ban đầu mình up thì sẽ xuất hiện lỗi vì chưa có textbox
- file hiện tại thì ở B1 và B2 thì ko thấy lỗi được.
- phải xóa đi cái textbox đi rồi thực hiện lại mới có
- mình có nêu chỗ sẽ xảy ra lỗi tại dòng 15 trong file đính kèm nhé

- trong file code có ghi chú mà ít thôi chứ không phải không có nhé
ps: mình cũng chả muốn up file 1 đóng code như thế lên đâu. người giúp sẽ ngán khi xem, nhưng nếu up file không đầy đủ code để phục vụ nó thì không thấy được chỗ lỗi thì hỏi làm chi nữa bạn.

Thế thì chờ cao nhân giúp vậy, tôi thì không ghi chú đầy đủ thì khó đọc hiểu (nếu không muốn nói là không thể) khi code trên 50 dòng trở lên là bắt đầu rối
 
Upvote 0
Anh ... có người Bạn mới viết cho Em vầy Anh thấy cách này có hay .... hay cách xài Find hay hơn
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target > Application.WorksheetFunction.VLookup(Target.Offset(, -2), Sheet2.[B6:D20], 3, 0) Then
        MsgBox "ok"
        Target.Select
    End If
End Sub

Hay dở tôi không dám nói, mà nhanh hay chậm cũng không test được luôn... vì đằng nào cũng tìm có 1 giá trị, vèo cái là xong
Tuy nhiên khi tôi viết code thì rất hạn chế dùng WorksheetFunction, trừ trường hợp bất khả kháng...
(mà dù cho dùng VLOOKUP thì sao bạn vẫn bỏ qua vụ bẫy lỗi nhỉ?)
 
Upvote 0
Web KT

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

Back
Top Bottom