Nhờ giải thích đoạn code áp dụng phương thức tìm kiếm dữ liệu

Liên hệ QC

quochuy86

Thành viên chính thức
Tham gia
3/5/07
Bài viết
56
Được thích
9
PHP:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  On Error Resume Next
  If Target.Count > 1 Then Exit Sub
  Sheet2.Cells(1, 1).Value = Target.Count
  Application.EnableEvents = False
  If Not Intersect(Range("B20:C30"), Target) Is Nothing Then
    With Target
      Select Case .Column
        Case 2
          If .Value = "" Then
            .Offset(0, 1).Value = ""
          Else
            .Offset(, 1).Value = Sheet1.Range("ENG").Find(Target).Offset(, 1).Value
          End If
        Case 3
          If .Value = "" Then
            .Offset(, -1).Value = ""
          Else
            .Offset(, -1).Value = Sheet1.Range("VIE").Find(Target).Offset(, -1).Value
          End If
      End Select
    End With
  End If
exitHandler:
  Application.EnableEvents = True
  Exit Sub
errHandler:
  MsgBox Err.ENGber & ": " & Err.Description
  GoTo exitHandler
End Sub

Nhờ mọi người giải thích dùm em code trên.

Em có 1 số thắc mắc như sau:
- "Intersect(Range("B20:C30"), Target) Is Nothing" có ý nghĩa jì ạh ( From Sa_DQ: Bạn không nên viết như vầy!)
- "target" ở đây là gì -0-/. em thử thì thấy "target.count = 1"
- "case column" có ý nghĩa jì ạ -0-/.
- ở đây sao lại dùng " .Offset(0, 1).Value" ạ**~**
- còn ".Offset(, 1).Value = Sheet1.Range("ENG").Find(Target).Offset(, 1).Value" nữa -+*/
Do mới tìm hiểu về VBA nên em thắc mắc nhiều quá+-+-+-+, mong mọi người thông cảm.
Thân. --=0
em gửi kèm theo file

From Sa_DQ: Để hiểu được 1 ngôn ngữ nào đó thì tiếng mẹ đẽ phải trơn tru là một điều kiện tiên quyết đó bạn!
 

File đính kèm

  • vi du ve find.xls
    67 KB · Đọc: 82
Chỉnh sửa lần cuối bởi điều hành viên:
Em có 1 số thắc mắc như sau:
- "Intersect(Range("B20:C30"), Target) Is Nothing" có ý nghĩa jì ạh
- "target" ở đây là gì -0-/. em thử thì thấy "target.count = 1"
- "case column" có ý nghĩa jì ạ -0-/.
- ở đây sao lại dùng " .Offset(0, 1).Value" ạ**~**
- còn ".Offset(, 1).Value = Sheet1.Range("ENG").Find(Target).Offset(, 1).Value" nữa -+*/

Trong các sự kiện hay gặp như Worksheet_change hay Worksheet_selectionchange... thì target có ý chỉ ô, vùng đang được chọn. VD nếu trong sheet, ô A1 đang được chọn thì target lúc này chỉ ô A1. Target ~ [A1] ~ Range("A1")

Target.Rows.count => đếm xem có bao nhiêu dòng trong vùng đang được chọn....

Intersect là một phương thức, dùng để xác định giao giữa 2 hay nhiều vùng cho trước, kết quả trả về là true or false.

Giả sử ô B25 đang được chọn. target ~ [B25]

"Intersect(Range("B20:C30"), Target)" => True
Intersect(Range("B20:C30"), [B19]) => False

".Offset(, 1).Value = Sheet1.Range("ENG").Find(Target).Offset(, 1).Value" => câu lệnh này bạn khoan hãy tìm hiểu. Hãy bắt đầu tìm hiểu với With ... End with, Offset và sau cùng là Find Method. Sau khi đã hiểu rồi bạn hãy tìm hiểu tiếp câu lệnh trên nha.
 
Upvote 0
to: hoangdanh
Mình đã hiểu những cái mà bạn giải thích rồi.
- "with...end with" mình hiểu là: với (with) "cái gì đó" (đã được định nghĩa trước đó hoặc đã được chọn trước đó) >>> các công việc được thực hiện >>> kết thúc việc chọn (end with)
- "offset( i,j)" là trả về ô cách ô được chọn i dong và j cột
- "find method" thì mình chưa hiểu lắm
- "case" mình cũng chưa hiểu lắm, chưa biết cách thức thực hiện của nó là ntn ( mình chỉ hiểu nôm na là: "trong trường hợp 1 thì.... trường hợp 2 thì.... end select")
không biết hiểu có đúng không nữa
 
Upvote 0
- "find method" thì mình chưa hiểu lắm
Bạn đến đây & nghiền ngẫm nói đi; Cũng nhiều điều thú vị & bổ ích

- "case" mình cũng chưa hiểu lắm, chưa biết cách thức thực hiện của nó là ntn ( mình chỉ hiểu nôm na là: "trong trường hợp 1 thì.... trường hợp 2 thì.... end select")
không biết hiểu có đúng không nữa
PHP:
With Target
      Select Case .Column
        Case 2
          If .Value = "" Then
            .Offset(0, 1).Value = ""
          Else
            .Offset(, 1).Value = Sheet1.Range("ENG").Find(Target).Offset(, 1).Value
          End If
        Case 3
          If .Value = "" Then
            .Offset(, -1).Value = ""
          Else
            .Offset(, -1).Value = Sheet1.Range("VIE").Find(Target).Offset(, -1).Value
          End If
      End Select
    End With
Bạn hiểu như vậy là được rồi;
Xin chuyển các dòng lệnh đó sang cấu trúc dùng If. . . End If, như sau

PHP:
With Target
      If .Columns.Count = 2
'      Select Case .Column '
'        Case 2  '
          If .Value = "" Then
            .Offset(0, 1).Value = ""
          Else
            .Offset(, 1).Value = Sheet1.Range("ENG").Find(Target).Offset(, 1).Value
          End If
        ElseIf .Columns.Count = 3
'        Case 3    '
          If .Value = "" Then
            .Offset(, -1).Value = ""
          Else
            .Offset(, -1).Value = Sheet1.Range("VIE").Find(Target).Offset(, -1).Value
          End If
       End If
'      End Select    '
    End With

Nhưng như vậy có quá nhiều If . . . End If, dễ rối mắt; Do chắc vậy nên tác giả macro đã 'Đổi gió' ấy mà!

Thân ái
 
Upvote 0
to: SA_DQ
- Cảm ơn bạn mình cũng đang tìm hiểu đây.
- "find method"
Mình cũng tập tành làm thử 1 Macro tìm kiếm dữ liệu trong mảng. song không hiểu sao cứ sai hoài.
code của mình như sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Sheet1.Range("d1").Select
Sheet1.Range("d1").Offset(1, 0).Value = Sheet1.Range("a1:b5").Find(Target).Offset(, 1).Value
End Sub
trong code của mình nếu mình xóa đoạn ".offset" thì nó lại chạy bình thường và cho ra kết quả đúng. Mong mọi người giúp đỡ.}}}}}
- Ah trong file "vi du ve find" mình gửi lần trước mình không biết làm sao mà tác giả của file đó có thể làm "validation" kiểu chỉ cần gõ 1 ký tự gợi nhớ là sẽ hiện ra 1 danh sách cần chọn. ví dụ gõ chư "a" thì hiện ra ngay danh sách nhũng máy móc có tên bắt đầu bằng chữ "a"-0-/.
Thân

-
 
Upvote 0
Mình tập tành làm thử 1 Macro tìm kiếm dữ liệu trong mảng. song không hiểu sao cứ sai hoài.
code của mình như sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
1 Sheet1.Range("d1").Select
Sheet1.Range("d1").Offset(1, 0).Value = Sheet1.Range("a1:b5").Find(Target).Offset(, 1).Value
End Sub
trong code của mình nếu mình xóa đoạn ".offset" thì nó lại chạy bình thường và cho ra kết quả đúng. Mong mọi người giúp đỡ.}}}}}
Thân -

(*) Đầu tiên cho mình hỏi ô hay vùng nào bạn sẽ 'đụng vô' để có sự kiện Worksheet_Change vậy?
(*) Hình như dòng lệnh 1 có thể vô hiệu hóa đi, thử xem;
(*) Bạn mới 'Tập tành' thì nên đề phòng Nó không tìm thấy trị mà bạn vừa nhập đó trong vùng 'A1:b5' & như vậy sẽ báo lỗi; Khi đó bạn không biết sao bị lỗi nữa kia.
Bạn nên áp đặt rằng tìm thấy mới gán trị; Nếu không tìm thấy thì cảnh báo cho bạn biết bằng cách:
+ Hộp thoại MsgBoxx
+ Gán đòng chữ có nghĩa vô nơi cần gán;
+ . . . .

Chào bạn! :-=
 
Upvote 0
To Quochuy:
Các vấn đề khác các bạn đã có ý kiến. Mình chỉ có ý kiến chút về nội dung.Mình thấy code của bạn quá nhiệu lệnh thừa. Ví dụ:

Sheet1.Range("d1").Select
Sheet1.Range("d1").Offset(1, 0)

Tương đương sheet1.Range("d2") hay Sheet1.[d2]

Câu lệnh của bạn chỉ còn:

Sheet1.[d2]= Sheet1.Range("a1:b5").Find(Target).Offset(, 1).Value

Mình không rõ code của bạn tìm cái gì mà sửa vào vùng dò tìm, code lại nằm trong event
Worksheet_Change thì dễ dính Circular lắm đấy.
 
Lần chỉnh sửa cuối:
Upvote 0
to: Hyen17 ,sealand
(*) Ô mình định thay đổi là ô "d1"
(*) Cảm ơn bạn đã hướng dẫn mình rút gọn câu lênnhj
(*) Thực ra là mình đang tìm hiểu về "find method" nên thử làm 1 ví dụ tìm kiếm dữ liệu giống như file đã gửi ở bài trước. Ở đây , mình muốn khi gõ vào ô "d1 = 1" thì ô "d2" sẽ cho kết quả là "a" (chỗ này mình không dung vlookup nha). vùng tìm kiếm dữ liệu là "a1:a5"
Mình gửi kèm theo file làm thử. mong mọi người giúp đỡ.
Ah, còn thắc mắc này nữa giải đáp giúp mình với:
"Ah trong file "vi du ve find" mình gửi lần trước mình không biết làm sao mà tác giả của file đó có thể làm "validation" kiểu chỉ cần gõ 1 ký tự gợi nhớ là sẽ hiện ra 1 danh sách cần chọn. ví dụ gõ chư "a" thì hiện ra ngay danh sách nhũng máy móc có tên bắt đầu bằng chữ "a"-0-/."
 
Upvote 0
"Ah trong file "vi du ve find" mình gửi lần trước mình không biết làm sao mà tác giả của file đó có thể làm "validation" kiểu chỉ cần gõ 1 ký tự gợi nhớ là sẽ hiện ra 1 danh sách cần chọn. ví dụ gõ chư "a" thì hiện ra ngay danh sách nhũng máy móc có tên bắt đầu bằng chữ "a"-0-/."
Toàn bộ nguyên tắc của nó nằm ở 2 chổ:
1> Vào menu Insert\Name\Define để xem người ta lập công thức ---> Ở đây người ta dùng name động để xác định ListRange cho Validation ---> Cộng thêm dử liệu nguồn phải được Sort trước
2> Vào menu Data\Validation để xem cách thiết lập ---> Trong tab Error Alert người ta đã bỏ chọn mục "Show error alert after...." <--- đây là mấu chốt, nếu bạn không bỏ chọn mục này thì không tài nào gõ được
Cũng hơi khó để hiểu hết file này nếu bạn là người mới học ---> Nhưng tôi tin rằng bạn sẽ hiểu được mấu chốt vấn đề nếu bạn cố gắng
 
Upvote 0
to ndu
thanks bạn đã gợi mở cho mình.
 
Upvote 0
Chào bạn Quôchuy86!
Code này do tôi đưa lên diển đàn từ những ngày đầu gia nhập GPE
Thú thật tôi sưu tầm nó trên 1 trang web nước ngoài, thấy hay và có thể áp dụng được vào 1 số bài toán thực tế nên muốn đưa lên cho mọi người tham khảo
Ngày ấy tôi chưa biết gì về VBA nên có sao cứ để vậy... Hôm nay, nếu tôi viết code này thì sẽ rút ngắn lại rất nhiều:
PHP:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  Dim Check As Boolean
  On Error Resume Next
  Application.EnableEvents = False
  If Not Intersect(Range("B20:C30"), Target) Is Nothing Then
    If Target.Count > 1 Then Exit Sub
    Check = Target.Column = 2
    Target(, -Check * 2).ClearContents
    Target(, -Check * 2) = Sheet1.Range("A1").CurrentRegion.Find(Target, , , xlWhole)(, -Check * 2)
  End If
  Application.EnableEvents = True
End Sub
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect(Range("B20:C30"), Target) Is Nothing Then
    With Sheet1.Range("A1").CurrentRegion
      .Sort .Cells(2, Target.Column - 1), 1, Header:=xlGuess
    End With
  End If
End Sub
Bạn thử code mới này xem... Thậm chí cả Define name cũng có thể tối ưu, chỉ 2 name là đủ
 
Upvote 0
to: anhtuan1066
thanks bạn đã quan tâm, code rút gọn hay quá, nhưng mình đọc từ hôm qua đến h mà vẫn chưa thông.
Có thể giải thích kỹ hơn cho mình về: "find method", "-check" được không!
Thân
 
Upvote 0
to: anhtuan1066
thanks bạn đã quan tâm, code rút gọn hay quá, nhưng mình đọc từ hôm qua đến h mà vẫn chưa thông.
Có thể giải thích kỹ hơn cho mình về: "find method", "-check" được không!
Thân
Về Find Method bạn có thể tham khảo toàn bộ tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=15116
Biến Check dùng để kiểm tra xem Cell ta đang chọn có phải nằm ở cột B hay không
PHP:
 Check = Target.Column = 2
Nếu cell ta chọn là cột B, Check cho kết quả = TRUE, và ngược lại cho kết quả = FALSE
Trong VBA, giá trị TRUE = -1FALSE = 0 nên khi tính toán có khi phải đảo dấu cho nó để nhận được giá trị = 1 ... vì thế mới có vụ -Check
 
Upvote 0
các bác ơi !!!..cho em hỏi...em post bài lên , bấm gởi trả lời thi thấy bài mình...nhưng tý em ko thấy đâu nữa...các bác giúp em ...em là thành viên mới..nên còn nhiều điều ko hiểu...mong các bác chỉ bảo thêm ạ
 
Upvote 0
Chao các bác, các bác giúp em:
- em muốn thêm tìm kiếm theo list gợi nhớ vật tư: khi gõ là A cho một loạt vật tư có chữ A để mình lựa chọn tìm kiếm
thao tác ở Sheet: Autorun ạ
em gửi file đính kèm
mong các bác chỉ bảo giúp ạ
 

File đính kèm

  • BẢNG TỒN KHO HÀNG TUẦN 1.xls
    149.5 KB · Đọc: 2
Upvote 0
các bác giúp em cái này với. Không biết sai chỗ nào mà nó ko chạy được. 1724723542938.png
 

File đính kèm

  • vlookup.xlsb
    40.6 KB · Đọc: 3
Upvote 0
các bác giúp em cái này với. Không biết sai chỗ nào mà nó ko chạy được.
Bạn dùng thử code củ chuối này xem sao nhé:

Mã:
Sub Loc()
    
    Dim lastRow1 As Long
    Dim lastRow2 As Long
    Dim sumifsFormula As String
    
    ' Find the last row with data in column B of the "MA" sheet
    With Worksheets("MA")
        lastRow1 = .Cells(.Rows.Count, "B").End(xlUp).Row
    End With
    
    ' Find the last row with data in column B of the "CT" sheet
    With Worksheets("CT")
        lastRow2 = .Cells(.Rows.Count, "B").End(xlUp).Row
    End With
    
    ' Construct the SUMIFS formula
    sumifsFormula = "=SUMIFS(MA!H3:H" & lastRow1 & ", MA!B3:B" & lastRow1 & ", CT!B4)"
    
    ' Clear the contents of the range K4:K" & lastRow2
    Range("K4:K" & lastRow2).ClearContents
    
    ' Select cell K4 and enter the formula using A1 notation
    Range("K4").Formula = sumifsFormula
    
    ' Fill the formula down from K4 to K" & lastRow2
    Range("K4:K" & lastRow2).FillDown
End Sub
Về cơ bản là code đang không hoạt động được.
Vâng anh, vậy viết lại code khác theo hàm Sumif/sumifs là được anh nhỉ, hihi
 
Upvote 0
Web KT

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

Back
Top Bottom