Hỏi VBA tìm kiếm dữ liệu theo nhiều điều kiện!

Liên hệ QC

theanhst92

Thành viên hoạt động
Tham gia
31/3/16
Bài viết
134
Được thích
15
Kính gửi mọi người trên diễn đàn ạ!
em đang cần tìm kiếm theo điều kiện cho trước nhưng do có nhiều điều kiện khi tìm kiếm nên mong mọi người có thể viết giúp em được không ạ!
Em có 1 bảng dữ liệu có cột mã hàng ở cột A (điều kiện 1) và từ cột H đến cột L sẽ có dữ liệu (điều kiện thứ 2). vùng giá trị sẽ lần lượt từ cột M đến Q.
điều kiện tìm kiếm 1 là khi mã hàng bằng cột A và điều kiện 2 là lần lượt từ cột H đến cột L, khi thoả mãn cả hai điều kiện thì sẽ cho ra kết quả tương ứng từ cột M đến Q.
Mong mọi người giúp đỡ ạ!
 

File đính kèm

  • TIMKIEM.xlsm
    13.7 KB · Đọc: 24
Vì bạn chưa cho biết số dòng trên trang 'DuLieu' nên tạm thời xài con rùa này:
PHP:
Sub TimSLKH()
Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
Dim Rws As Long, J As Long, Size_ As Long

Set Sh = ThisWorkbook.Worksheets("MaHang")
Rws = Sh.[A2].CurrentRegion.Rows.Count
Set Rng = Sh.[A2].Resize(Rws)
Sheets("DuLieu").Select
For Each Cls In Range([H2], [H2].End(xlDown))
    Size_ = Cls.Offset(, 6).Value
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 6 To 10
            If sRng.Offset(, J).Value = Size_ Then
                Cells(Cls.Row, "S").Value = sRng.Offset(, J + 5).Value
                Exit For
            End If
        Next J
    End If
Next Cls
End Sub
 
Upvote 0
Vì bạn chưa cho biết số dòng trên trang 'DuLieu' nên tạm thời xài con rùa này:
PHP:
Sub TimSLKH()
Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
Dim Rws As Long, J As Long, Size_ As Long

Set Sh = ThisWorkbook.Worksheets("MaHang")
Rws = Sh.[A2].CurrentRegion.Rows.Count
Set Rng = Sh.[A2].Resize(Rws)
Sheets("DuLieu").Select
For Each Cls In Range([H2], [H2].End(xlDown))
    Size_ = Cls.Offset(, 6).Value
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 6 To 10
            If sRng.Offset(, J).Value = Size_ Then
                Cells(Cls.Row, "S").Value = sRng.Offset(, J + 5).Value
                Exit For
            End If
        Next J
    End If
Next Cls
End Sub
Sao lại gọi là rùa hả bac.Cháu thấy vẫn nhanh mà.
 
Upvote 0
Có mươi dòng dữ liệu thì không thể nhanh hay chậm, vạn dòng dữ liệu nó sẽ là rùa ngay ý mà!


em cảm ơn ạ. nếu mà dữ liệu khoảng 2000 dòng chắc vẫn ổn phải không ạ!
[Thêm tham biến đo thời gian tiêu tốn khi chạy nó; Nếu thấy chậm thì tìm cách khác nhanh hơn. . . .]
PHP:
Sub TimSLKH()
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
 Dim Rws As Long, J As Long, Size_ As Long, Tmr As Double   'X  '
 
 Set Sh = ThisWorkbook.Worksheets("MaHang")
 Rws = Sh.[A2].CurrentRegion.Rows.Count
 Set Rng = Sh.[A2].Resize(Rws)
 Sheets("DuLieu").Select:                       Tmr = Timer()   'xx '
 For Each Cls In Range([H2], [H2].End(xlDown))
    Size_ = Cls.Offset(, 6).Value
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 6 To 10
            If sRng.Offset(, J).Value = Size_ Then
                Cells(Cls.Row, "S").Value = sRng.Offset(, J + 5).Value
                Exit For
            End If
        Next J
    End If
 Next Cls
 MsgBox Timer() - Tmr   'xx '
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Vì bạn chưa cho biết số dòng trên trang 'DuLieu' nên tạm thời xài con rùa này:
PHP:
Sub TimSLKH()
Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
Dim Rws As Long, J As Long, Size_ As Long

Set Sh = ThisWorkbook.Worksheets("MaHang")
Rws = Sh.[A2].CurrentRegion.Rows.Count
Set Rng = Sh.[A2].Resize(Rws)
Sheets("DuLieu").Select
For Each Cls In Range([H2], [H2].End(xlDown))
    Size_ = Cls.Offset(, 6).Value
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 6 To 10
            If sRng.Offset(, J).Value = Size_ Then
                Cells(Cls.Row, "S").Value = sRng.Offset(, J + 5).Value
                Exit For
            End If
        Next J
    End If
Next Cls
End Sub
em cảm ơn ạ. nếu mà dữ liệu khoảng 2000 dòng chắc vẫn ổn phải không ạ!
 
Upvote 0
Với gần 3 000 dòng ở trang DuLieu cần có 0.345 gy
 
Upvote 0
Có mươi dòng dữ liệu thì không thể nhanh hay chậm, vạn dòng dữ liệu nó sẽ là rùa ngay ý mà!



[Thêm tham biến đo thời gian tiêu tốn khi chạy nó; Nếu thấy chậm thì tìm cách khác nhanh hơn. . . .]
PHP:
Sub TimSLKH()
Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
Dim Rws As Long, J As Long, Size_ As Long, Tmr As Double   'X  '

Set Sh = ThisWorkbook.Worksheets("MaHang")
Rws = Sh.[A2].CurrentRegion.Rows.Count
Set Rng = Sh.[A2].Resize(Rws)
Sheets("DuLieu").Select:                       Tmr = Timer()   'xx '
For Each Cls In Range([H2], [H2].End(xlDown))
    Size_ = Cls.Offset(, 6).Value
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 6 To 10
            If sRng.Offset(, J).Value = Size_ Then
                Cells(Cls.Row, "S").Value = sRng.Offset(, J + 5).Value
                Exit For
            End If
        Next J
    End If
Next Cls
MsgBox Timer() - Tmr   'xx '
End Sub
Bác cho em hỏi là em có một sheets nữa với dữ liệu là số lượng đã xuất đầu kỳ và em dùng mã này luôn của bác nhưng làm sao để có thể cộng luôn số lượng ở cột xuất để ra số lượng đã xuất luỹ kế và còn lại số lượng bao nhiêu được không ạ. em nhìn code thì hiểu qua qua nhưng k biết cách sửa và viết thêm bác ạ! mong được bác giúp đỡ!
 

File đính kèm

  • TIMKIEM.xlsm
    22.4 KB · Đọc: 11
Upvote 0
Mở file mới, mình thấy có thêm trang 'Ton', Vậy các trị trong trang này là những giá trị đã xuất hay số tồn kho sau khi xuất?

Trong macro, trước khi đi tìm số lượng theo size, ta phải tìm trị đã xuất (hay tồn lại sau xuất) ở trang mới này

Có nghĩa là trước dòng lệnh

Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
. . . .
 
Upvote 0
Mở file mới, mình thấy có thêm trang 'Ton', Vậy các trị trong trang này là những giá trị đã xuất hay số tồn kho sau khi xuất?

Trong macro, trước khi đi tìm số lượng theo size, ta phải tìm trị đã xuất (hay tồn lại sau xuất) ở trang mới này

Có nghĩa là trước dòng lệnh

Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
. . . .
dạ. số lượng ở sheet"ton" là số lượng đã xuất của kỳ trước. khi tính luỹ kế sẽ tính số đã xuất kỳ trước + tổng số xuất kỳ này = số xuất luỹ kế ạ!
 
Upvote 0
Bạn chạy macro này; Kiểm tra số liệu kết quả & sau đó tìm cách thu gọn lại, khi số liệu kiểm tra là đúng:

PHP:
Sub TimSLKH()
Dim Sh As Worksheet, Sht As Worksheet
Dim Rg0 As Range, Rng As Range, sRng As Range, Cls As Range
Dim Rws As Long, J As Long, Size_ As Long
Dim Xuat As Double, Tmr As Double

1 Set Sh = ThisWorkbook.Worksheets("MaHang")
Rws = Sh.[A2].CurrentRegion.Rows.Count
Set Rng = Sh.[A2].Resize(Rws)
2 Set Sht = ThisWorkbook.Worksheets("Ton")
Set Rg0 = Sht.Range(Sht.[A1], Sht.[A1].End(xlDown))
Sheets("DuLieu").Select:                       Tmr = Timer()
For Each Cls In Range([H2], [H2].End(xlDown))
    Size_ = Cls.Offset(, 6).Value
10    Set sRng = Rg0.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 7 To 11
            If sRng.Offset(, J).Value = Size_ Then
                Xuat = sRng.Offset(, J + 5).Value
                Cells(Cls.Row, "W").Value = Xuat        'XX '
                Exit For
            End If
        Next J
    End If
20    Set sRng = Rng.Find(Cls.Value )
    If Not sRng Is Nothing Then
        For J = 6 To 10
            If sRng.Offset(, J).Value = Size_ Then
                Cells(Cls.Row, "S").Value = sRng.Offset(, J + 5).Value  '!! '
                Exit For
            End If
        Next J
    End If
Next Cls
MsgBox Timer() - Tmr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn chạy macro này; Kiểm tra số liệu kết quả & sau đó tìm cách thu gọn lại, khi số liệu kiểm tra là đúng:

PHP:
Sub TimSLKH()
Dim Sh As Worksheet, Sht As Worksheet
Dim Rg0 As Range, Rng As Range, sRng As Range, Cls As Range
Dim Rws As Long, J As Long, Size_ As Long
Dim Xuat As Double, Tmr As Double

1 Set Sh = ThisWorkbook.Worksheets("MaHang")
Rws = Sh.[A2].CurrentRegion.Rows.Count
Set Rng = Sh.[A2].Resize(Rws)
2 Set Sht = ThisWorkbook.Worksheets("Ton")
Set Rg0 = Sht.Range(Sht.[A1], Sht.[A1].End(xlDown))
Sheets("DuLieu").Select:                       Tmr = Timer()
For Each Cls In Range([H2], [H2].End(xlDown))
    Size_ = Cls.Offset(, 6).Value
10    Set sRng = Rg0.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 7 To 11
            If sRng.Offset(, J).Value = Size_ Then
                Xuat = sRng.Offset(, J + 5).Value
                Cells(Cls.Row, "W").Value = Xuat        'XX '
                Exit For
            End If
        Next J
    End If
20    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 6 To 10
            If sRng.Offset(, J).Value = Size_ Then
                Cells(Cls.Row, "S").Value = sRng.Offset(, J + 5).Value  '!! '
                Exit For
            End If
        Next J
    End If
Next Cls
MsgBox Timer() - Tmr
End Sub
Em cảm ơn bác ạ!
Về cơ bản đã tìm đúng số kế hoạch và số đã xuất. nhưng chưa cộng luỹ kế được số lượng xuất trong kỳ và số còn lại cuối kỳ. mong bác giúp đỡ thêm với ạ!
em không biết phải triển khai chỗ đấy như nào ạ!
 
Upvote 0
. . . . . . nhưng chưa cộng luỹ kế được số lượng xuất trong kỳ và số còn lại cuối kỳ. mong bác giúp đỡ thêm với ạ! em không biết phải triển khai chỗ đấy như nào ạ!
Có nghĩa bạn cần cột nào cộng hay trừ vào cột nào?
Nhưng dù sao bạn cũng vật lộn với số liệu đến sáng mai đi đã.
 
Upvote 0
Có nghĩa bạn cần cột nào cộng hay trừ vào cột nào?
Nhưng dù sao bạn cũng vật lộn với số liệu đến sáng mai đi đã.
Em mày mò mãi vẫn không nghĩ ra cách. ý của em là như sau ạ. cần tính giá trị cho cột u và v luôn bằng lệnh này khi cột q có sự thay đổi ạ!
Mong được bác giúp đỡ ạ!
1606968197975.png
 
Upvote 0
Cột [Còn lại] mình thấy có công thức & sẽ làm được;
Còn cột [Lũy kế] công thức hay cách tính thế nào chưa rõ lắm(?)
 
Upvote 0
Hình #15 chụp từ file ở #7 phải không bạn?
 
Upvote 0
dạ đúng ạ. em xin gửi lại ạ!
nếu có thể nhờ bác sửa giúp em code khi lọc có điều kiện chuyển dữ liệu từ hàng dọc thành hàng ngang với ạ!
 

File đính kèm

  • TIMKIEM (1).xlsm
    42.4 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Bạn chạy macro này; Kiểm tra số liệu kết quả & sau đó tìm cách thu gọn lại, khi số liệu kiểm tra là đúng:

PHP:
Sub TimSLKH()
Dim Sh As Worksheet, Sht As Worksheet
Dim Rg0 As Range, Rng As Range, sRng As Range, Cls As Range
Dim Rws As Long, J As Long, Size_ As Long
Dim Xuat As Double, Tmr As Double

1 Set Sh = ThisWorkbook.Worksheets("MaHang")
Rws = Sh.[A2].CurrentRegion.Rows.Count
Set Rng = Sh.[A2].Resize(Rws)
2 Set Sht = ThisWorkbook.Worksheets("Ton")
Set Rg0 = Sht.Range(Sht.[A1], Sht.[A1].End(xlDown))
Sheets("DuLieu").Select:                       Tmr = Timer()
For Each Cls In Range([H2], [H2].End(xlDown))
    Size_ = Cls.Offset(, 6).Value
10    Set sRng = Rg0.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For J = 7 To 11
            If sRng.Offset(, J).Value = Size_ Then
                Xuat = sRng.Offset(, J + 5).Value
                Cells(Cls.Row, "W").Value = Xuat        'XX '
                Exit For
            End If
        Next J
    End If
20    Set sRng = Rng.Find(Cls.Value )
    If Not sRng Is Nothing Then
        For J = 6 To 10
            If sRng.Offset(, J).Value = Size_ Then
                Cells(Cls.Row, "S").Value = sRng.Offset(, J + 5).Value  '!! '
                Exit For
            End If
        Next J
    End If
Next Cls
MsgBox Timer() - Tmr
End Sub
Nhờ bác giúp em với ạ. đối với mã này hôm nay em chạy lại dữ liệu thì khi xoá hết dữ liệu từ cột H đến cột N thì khi chạy dữ liệu bị phát sinh lỗi load rất lâu. và khi điền lại dữ liệu vào 2 dòng đầu
tiên thì dữ liệu cũng load lâu như vậy. nhờ bác sửa lại giúp em với ạ!
 

File đính kèm

  • TIMKIEM (1).xlsm
    42.4 KB · Đọc: 4
Upvote 0
Web KT

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

Back
Top Bottom