doanthuha203
Thành viên chính thức
- Tham gia
- 6/10/08
- Bài viết
- 53
- Được thích
- 4
Cho em hỏi làm cách nào bên sheet tổng hợp trả về nhiều dòng do mình dò tìm cùng một giá trị là số chứng từ. Khi mình nhập số chứng từ thì sẽ trả về nhiều dòng. Nếu dùng hàm vlookup thì chỉ trả về một giá trị.
Em không biết cách áp dụng cho 1 file khác với yêu cầu tương tự. Hướng dẫn thêm về cách sửa lại hàm này được không ạ?
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
'Nếu ta thay đổi DL (dữ liệu) của ô [E3] thì macro sẻ thực hiện dòng lệnh thức 2 trở về sau:'
1 If Not Intersect(Target, [E3]) Is Nothing Then
' Khai báo các biến cần dùng:'
Dim Rng As Range, Sh As Worksheet, sRng As Range
Dim MyAdd As String
' Gán trang 'NhapLieu} vô biến đã khai báo:'
3 Set Sh = Sheets("NhapLieu")
'Lấy vùng có DL của cột 'A' trang tính "NhapLieu" gán vô biến đã khai báo:'
Set Rng = Sh.Range(Sh.[A1], Sh.[A65500].End(xlUp))
'Tạo bãi đáp cho dữ liệu sẽ được macro tìm ra, bằng cách xoá DL cũ:'
5 [A5].Resize(Rng.Rows.Count, 6).ClearContents
'Tìm mã cần thiết trên vùng mà biến Rng đang lưu trữ:'
Set sRng = Rng.Find([E3].Value, , xlFormulas, xlWhole)
'Nếu tìm thầy thì thực hiện các lệnh trước dòng lệnh 15:'
7 If Not sRng Is Nothing Then
'Lấy địa chỉ tìm thấy gán vô biến chuỗi đã khai báo:'
MyAdd = sRng.Address
'Tạo vòng lặp đến dòng lệnh 14 để tìm hếu các mã có trong vùng thuộc biện Rng:'
9 Do
'TB (thông báo) sẽ làm việc với ô dưới 1 ô so với ô cuối cùng thuộc cột "A" có DL:'
With [A65500].End(xlUp).Offset(1)
'Cả 5 ô cùng dòng bắt đầu từ ô đã TB được gán trị từ 5 ô kể từ ô tìm thấy về fía fải:'
11 .Resize(, 5).Value = sRng.Offset(, 1).Resize(, 5).Value
End With 'Kết thúc TB'
'Tìm tiếp tục cho đến khi. . . '
13 Set sRng = Rng.FindNext(sRng)
'. . . . Không còn tìm thấy:'
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
' Nếu không tìm thấy:'
15 Else
MsgBox "Nothing" 'Hiện hộp thoại báo cho biết không tìm ra:'
17 End If
End If
End Sub
Em thử sửa dòng này thành [A7] mà không được "5 [A5].Resize(Rng.Rows.Count, 6).ClearContents"
Nếu mình nhặt dữ liệu bên sheet "Nhaplieu" chỉ các cột B, C, E, F ... (nhặt theo cột) và trả về các cột bên sheet "Tổng hợp không liền mạch ví dụ như C (DL) = E (TH); B (DL) = C (TH) ... thì code viết thế nào được bạnĐó chưa f ải là hàm; chỉ là macro sự kiện
Mình diễn dịch để bạn hiểu các công việc mà macro làm, như sau:
PHP:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) 'Nếu ta thay đổi DL (dữ liệu) của ô [E3] thì macro sẻ thực hiện dòng lệnh thức 2 trở về sau:' 1 If Not Intersect(Target, [E3]) Is Nothing Then ' Khai báo các biến cần dùng:' Dim Rng As Range, Sh As Worksheet, sRng As Range Dim MyAdd As String ' Gán trang 'NhapLieu} vô biến đã khai báo:' 3 Set Sh = Sheets("NhapLieu") 'Lấy vùng có DL của cột 'A' trang tính "NhapLieu" gán vô biến đã khai báo:' Set Rng = Sh.Range(Sh.[A1], Sh.[A65500].End(xlUp)) 'Tạo bãi đáp cho dữ liệu sẽ được macro tìm ra, bằng cách xoá DL cũ:' 5 [A5].Resize(Rng.Rows.Count, 6).ClearContents 'Tìm mã cần thiết trên vùng mà biến Rng đang lưu trữ:' Set sRng = Rng.Find([E3].Value, , xlFormulas, xlWhole) 'Nếu tìm thầy thì thực hiện các lệnh trước dòng lệnh 15:' 7 If Not sRng Is Nothing Then 'Lấy địa chỉ tìm thấy gán vô biến chuỗi đã khai báo:' MyAdd = sRng.Address 'Tạo vòng lặp đến dòng lệnh 14 để tìm hếu các mã có trong vùng thuộc biện Rng:' 9 Do 'TB (thông báo) sẽ làm việc với ô dưới 1 ô so với ô cuối cùng thuộc cột "A" có DL:' With [A65500].End(xlUp).Offset(1) 'Cả 5 ô cùng dòng bắt đầu từ ô đã TB được gán trị từ 5 ô kể từ ô tìm thấy về fía fải:' 11 .Resize(, 5).Value = sRng.Offset(, 1).Resize(, 5).Value End With 'Kết thúc TB' 'Tìm tiếp tục cho đến khi. . . ' 13 Set sRng = Rng.FindNext(sRng) '. . . . Không còn tìm thấy:' Loop While Not sRng Is Nothing And sRng.Address <> MyAdd ' Nếu không tìm thấy:' 15 Else MsgBox "Nothing" 'Hiện hộp thoại báo cho biết không tìm ra:' 17 End If End If End Sub
Các chú í khi sử dụng macro sự kiện này trên trang tính của 1 workbook khác:
(|) Ô [E3] có 1 danh sách mã (duy nhứt) để chọn (Validation)
(|) CSDL có trên trang tính tên là 'NhapLieu'; Nếu tên khác thì đổi lại cho fù hợp.
(|) Nếu bạn cần kết quả từ hàm người dùng thì cho biết í kiến để còn ngâm cứu khả năng giải quyết tiếp cho bạn
Thân ái!