Hỏi về cách lọc dữ liệu và sau đó trích xuất dữ liệu ra sheet khác!

Liên hệ QC

thangteo

Thành viên thường trực
Tham gia
8/5/07
Bài viết
393
Được thích
43
Em có file như đính kèm, và có 1 vài mong muốn được trợ giúp:
1. Ở sheet VBA: Cách tìm kiếm dữ liệu trên 2 hoặc nhiều cột 1 lúc, em đã làm bằng cách chạy form và sử dụng hàm BS_functions của A-Toll bản free (giới hạn tìm được là 200 dòng dữ liệu). Nhưng nếu không sử dụng hàm của A-Tool mà chạy VBA thuần túy có sẵn của Ex thì có cách nào không ạ?
2. Sau khi tìm kiếm được dữ liệu trên form thì mình muốn chọn dữ liệu nào để trích xuất sang sheet DuLieuTrinhBay thì chonjh và nhấn nút Trich xuat du lieu ở trên form, nhưng ở sheet DuLieuTrinhBay thì bố cục trình bày nó khác không giống như bảng nguồn ở sheet DuLieuNguon mà em muốn khi trích xuất thì nó sẽ trình bày nội dung như ở sheet DuLieuTrinhBay (sheet DuLieuTrinhBay1 là ví dụ dạng trình bày dữ liệu đó)
---------
Cảm ơn mọi người!
 

File đính kèm

  • Tong hop bao gia thi cong.xlsm
    31.6 KB · Đọc: 45
Em có file như đính kèm, và có 1 vài mong muốn được trợ giúp:
1. Ở sheet VBA: Cách tìm kiếm dữ liệu trên 2 hoặc nhiều cột 1 lúc, em đã làm bằng cách chạy form và sử dụng hàm BS_functions của A-Toll bản free (giới hạn tìm được là 200 dòng dữ liệu). Nhưng nếu không sử dụng hàm của A-Tool mà chạy VBA thuần túy có sẵn của Ex thì có cách nào không ạ?
2. Sau khi tìm kiếm được dữ liệu trên form thì mình muốn chọn dữ liệu nào để trích xuất sang sheet DuLieuTrinhBay thì chonjh và nhấn nút Trich xuat du lieu ở trên form, nhưng ở sheet DuLieuTrinhBay thì bố cục trình bày nó khác không giống như bảng nguồn ở sheet DuLieuNguon mà em muốn khi trích xuất thì nó sẽ trình bày nội dung như ở sheet DuLieuTrinhBay (sheet DuLieuTrinhBay1 là ví dụ dạng trình bày dữ liệu đó)
---------
Cảm ơn mọi người!


Bạn có thể tham khảo phần mềm của mình có chức năng như bạn mô tả là trích xuất báo cáo nhập và bán có sử dụng advancefilter (pass là phiên bản của phần mềm)

 
Xài được thì mua quách bản đàng hoàng cho rồi.
Nhiều khi mới khởi nghiệp công ty còn nghèo. Còn nếu đi làm thuê mà sếp giao việc lại phải bỏ tiền túi ra mua thì vài lần như thế lương sẽ không đủ mua. Cuối cùng đi làm lại bị lỗ. :D
 
Em có file như đính kèm, và có 1 vài mong muốn được trợ giúp:
1. Ở sheet VBA: Cách tìm kiếm dữ liệu trên 2 hoặc nhiều cột 1 lúc, em đã làm bằng cách chạy form và sử dụng hàm BS_functions của A-Toll bản free (giới hạn tìm được là 200 dòng dữ liệu). Nhưng nếu không sử dụng hàm của A-Tool mà chạy VBA thuần túy có sẵn của Ex thì có cách nào không ạ?
2. Sau khi tìm kiếm được dữ liệu trên form thì mình muốn chọn dữ liệu nào để trích xuất sang sheet DuLieuTrinhBay thì chonjh và nhấn nút Trich xuat du lieu ở trên form, nhưng ở sheet DuLieuTrinhBay thì bố cục trình bày nó khác không giống như bảng nguồn ở sheet DuLieuNguon mà em muốn khi trích xuất thì nó sẽ trình bày nội dung như ở sheet DuLieuTrinhBay (sheet DuLieuTrinhBay1 là ví dụ dạng trình bày dữ liệu đó)
---------
Cảm ơn mọi người!
Mình ko cài Atool nên ko chạy đc chức năng search trên file của bạn.xem file chỉ hiểu yêu cầu bên sheet trình bày.còn yêu cầu tìm kiếm thì mình chưa hiểu dùng điều kiện gì để tìm dữ liệu ở sheet dữ liệu
 
Em có file như đính kèm, và có 1 vài mong muốn được trợ giúp:
1. Ở sheet VBA: Cách tìm kiếm dữ liệu trên 2 hoặc nhiều cột 1 lúc, em đã làm bằng cách chạy form và sử dụng hàm BS_functions của A-Toll bản free (giới hạn tìm được là 200 dòng dữ liệu). Nhưng nếu không sử dụng hàm của A-Tool mà chạy VBA thuần túy có sẵn của Ex thì có cách nào không ạ?
1. Sửa trong DMXD thành
Mã:
=DuLieuNguon!$B$2:$F$19

2. Thêm Module2 và dán code. Tôi chú thích cặn kẽ. Hãy đọc kỹ để biết cách dùng cho nhiều kiểu tìm kiếm.
Mã:
Sub FindMultiCol_to_ListBox(ByVal findvalue, ByVal ignorecase As Boolean, ByVal matchstr As String, data(), ListBox As Object, ParamArray cols())
'    - tim findvalua trong mang 2 chieu data, ket qua nhap vao ListBox. Truoc khi tim thi cac muc trong ListBox duoc xoa.
'    - findvalue: gia tri can tim
'    - data: mang 2 chieu
'    - ListBox: ListBox voi cac muc duoc tim thay
'    - cols la danh sach chi so cac cot can tim trong mang data duoc phan cach boi dau phay. Cac chi so cot phai duoc tinh
'    tu 1 cho du chi so cot trong mang duoc tinh tu dau. Vd. mang data co chi so cot duoc tinh tu 3 do vd. data(1 to 100, 3 to 7)
'    thi neu ta muon tim kiem trong cot dau tien cua mang data thi ta truyen 1 chu khong phai la truyen 3.
'    Neu tim tat ca cac cot cua mang data thi ngoai cach liet ke chi so cua tat ca cac cot cung co the khong truyen cols.
'    Tuc neu bo qua cols thi hieu la tim tat ca cac cot
'    ignorecase = True la khong phan biet chu hoa chu thuong
'    matchstr = "" la tim dung
'    matchstr = "<" la tim voi findvalue la doan dau
'    matchvalue = ">" la tim voi findvalue la doan cuoi
'    matchstr khac "", "<", ">" la tim voi findvalue o vi tri bat ky
Dim r As Long, k As Long, count As Long, c, value_, chiso, result()
    ListBox.Clear
    On Error GoTo end_
    If ignorecase Then findvalue = LCase(findvalue)
    If matchstr = "<" Then
        findvalue = findvalue & "*"
    ElseIf matchstr = ">" Then
        findvalue = "*" & findvalue
    ElseIf matchstr <> "" Then
        findvalue = "*" & findvalue & "*"
    End If
    If UBound(cols) = -1 Then
        ReDim chiso(1 To UBound(data, 2) - LBound(data, 2) + 1)
        For c = 1 To UBound(chiso)
            chiso(c) = c
        Next c
    Else
        chiso = cols
    End If
    For r = LBound(data) To UBound(data)
        For Each c In chiso
            If ignorecase Then
                value_ = LCase(data(r, LBound(data, 2) + c - 1))
            Else
                value_ = data(r, LBound(data, 2) + c - 1)
            End If
            If value_ Like findvalue Then
                count = count + 1
                ReDim Preserve result(LBound(data, 2) To UBound(data, 2), 1 To count)
                For k = LBound(data, 2) To UBound(data, 2)
                    result(k, count) = data(r, k)
                Next k
                Exit For
            End If
        Next c
    Next r
    If count Then ListBox.Column = result
end_:
End Sub

3. Do bạn dùng tiếng Việt nên phải gõ trong TextBox1 đúng như trên sheet thì mới tìm thấy. Tức nếu trên sheet là ký tự unicode dựng sẵn (unicode tổ hợp) thì phải gõ trong TextBox1 ký tự unicode dựng sẵn (unicode tổ hợp). Khi gõ bằng Unikey và chọn bảng mã Unicode thì chính là gõ unicode dựng sẵn, nếu tôi không lầm.

4. Toàn bộ code trong UserForm
Mã:
Private Arr()

Private Sub TextBox1_Change()
    If IsEmpty(TextBox1.Value) Then
        ListBox1.List = Arr
    Else
        ListBox1.Clear
'        vi du liet ke tuong minh cac cot can tim, tuc nhap mang cols. Ta khong phan biet chu hoa hay chu thuong
        FindMultiCol_to_ListBox TextBox1.Value, True, "-", Arr, ListBox1, 1, 2
    End If
    Label2 = "SO HANG MUC TIM KIEM DUOC: " & ListBox1.ListCount
End Sub

Private Sub UserForm_Activate()
    Arr = Range("DMXD").Value2
    ListBox1.ColumnCount = 2
    TextBox1_Change
End Sub
2. Sau khi tìm kiếm được dữ liệu trên form thì mình muốn chọn dữ liệu nào để trích xuất sang sheet DuLieuTrinhBay thì chonjh và nhấn nút Trich xuat du lieu ở trên form, nhưng ở sheet DuLieuTrinhBay thì bố cục trình bày nó khác không giống như bảng nguồn ở sheet DuLieuNguon mà em muốn khi trích xuất thì nó sẽ trình bày nội dung như ở sheet DuLieuTrinhBay (sheet DuLieuTrinhBay1 là ví dụ dạng trình bày dữ liệu đó)
Hãy cho ví dụ cụ thể để dễ cho người khác. Giả gử tôi chọn dòng
Phần điện, điều hòa Chạy điện và kiểm tra nước

Sau đó tôi lại chọn
Phần xây,sơn bả, thạch cao Gạch ốp WC

Hãy nhập tay kết quả mong đợi sau khi tôi chọn 2 dòng trên. Như thế để người ta biết cái gọi là "bố cục trình bày" mặt mũi nó thế nào.
Hoặc nói rõ ra sheet DuLieuTrinhBay có những cột nào, từng cột lấy từ cột nào của sheet DuLieuNguon hoặc được xào nấu như thế nào từ những nguyên liệu nào.

Đừng bắt người khác suy đoán, mường tượng không cần thiết khi mình có thể nói thêm 1 câu.
 
Lần chỉnh sửa cuối:
Hãy cho ví dụ cụ thể để dễ cho người khác. Giả gử tôi chọn dòng
Phần điện, điều hòa Chạy điện và kiểm tra nước

Sau đó tôi lại chọn
Phần xây,sơn bả, thạch cao Gạch ốp WC

Hãy nhập tay kết quả mong đợi sau khi tôi chọn 2 dòng trên. Như thế để người ta biết cái gọi là "bố cục trình bày" mặt mũi nó thế nào.
Hoặc nói rõ ra sheet DuLieuTrinhBay có những cột nào, từng cột lấy từ cột nào của sheet DuLieuNguon hoặc được xào nấu như thế nào từ những nguyên liệu nào.
Cảm ơn bạn và cũng mong thông cảm vì chưa nói cụ thể hơn về việc trích xuất theo dạng bố cục trình bày cho dễ hình dung. Xin phép cụ thể thế này:
1. Giả sử chọn dòng: "Phần điện, điều hòa Chạy điện và kiểm tra nước" để trích xuất và sau đó chọn "Phần xây,sơn bả, thạch cao Gạch ốp WC" thì bên sheet DuLieuTrinhBay sẽ thể hiện bố cục như sau:
VD1.JPG
- Tiếp tục tôi lại tìm kiếm và chọn dòng: "Phần điện, điều hòa Sàn gỗ" để trích xuất, sau đó chọn "Phần xây,sơn bả, thạch cao Sơn bả tường" và "Phần xây,sơn bả, thạch cao Nắp thăm trần 30x30" để trích xuất thì bên sheet DuLieuTrinhBay sẽ thể hiện bố cục như sau:
VD2.JPG
Tức là nếu trích xuất thêm những Hạng mục lớn đã có mà khác phần Công tác xây dựng thì sẽ tiếp tục chèn thứ tự dữ liệu tiếp theo vào phần Công tác xây dựng.
----------
Bố cục trình bày sẽ thể hiện như vậy, cột A của sheet DuLieuTrinhBay sẽ là dữ liệu của cột B (hạng mục lớn) sheet DuLieuNguon.
Bạn xem giúp lại. Cảm ơn!
 
Nhiều khi mới khởi nghiệp công ty còn nghèo. Còn nếu đi làm thuê mà sếp giao việc lại phải bỏ tiền túi ra mua thì vài lần như thế lương sẽ không đủ mua. Cuối cùng đi làm lại bị lỗ. :D
Cái đó là lô gic bình thường. GPE theo lô gic khác.

Bình thường:
Khi người ta dùng được cái A Tun gì đó thì người bắt buộc phải hiểu nó, và điều quan trọng hơn là đã phải tự uốn nắn bảng tính của mình để có thể sử dụng nó.
Có GPE:
Khi có người sẵn sàng viết giùm code, như GPE, thì người ta không cần hiểu, và không cần uốn nắn cái gì cả. Kẻ cần hiểu, cần giải thích cho người ta hiểu, và cần nắn code là bạn. Và người bảo hành cũng là bạn.

Vả lại, đi làm mà để cho công việc "bỏ tiền túi ra mua" này xảy ra "vài lần" thì chứng tỏ là lúc xin việc, cái CV được thổi phồng lên hơi nhiều.
Thổi phồng CV không phải là điều xấu. Nó chỉ xấu khi sau khi được việc rồi thì lại ỷ y, không chịu học hỏi để bổ khuyết cái chỗ "thổi phồng" ấy.
 
Tóm lại là ý chủ topic muốn lấy các mục trong DuLieuNguon vào DuLieuTrinhBay mà phân ra I {1,2,3...,n}, II{1,2,3...,n} để in ra tính tiền đúng không.
bạn phải có thêm mục mục I,II,III. là cái gì người ta mới biết chứ chuyên môn của bạn ai biết đâu mà mò
Ví dụ
I: Phần xây thô.
1. gạch tynel
2.xi măng
II: Phần Thạch cao
1. Son bả tường
2.......
 
Thôi đã trót làm thì tôi làm cho hết.

Hãy đọc bài #6 và làm đúng các điểm 1, 2 và 3.

Riêng điểm 4 thì thay code bằng code dưới đây.
Mã:
Private Arr()

Private Sub CommandButton1_Click()
Dim lastRow As Long, c As Long, rowindex As Long, number As Long, pos As Long, find_value As String, rng As Range, cell_ As Range, sh As Worksheet
    If ListBox1.ListIndex = -1 Then Exit Sub
    rowindex = ListBox1.ListIndex
    find_value = ". " & ListBox1.List(ListBox1.ListIndex, 0)
    Set sh = ThisWorkbook.Worksheets("DuLieuTrinhBay")
    lastRow = sh.Cells(Rows.count, "B").End(xlUp).Row
    If lastRow = 6 Then
        Set rng = sh.Range("A7")
    Else
        Set rng = sh.Range("A7:A" & lastRow)
    End If
    Set cell_ = rng.Find(find_value, , xlValues, xlPart)
    If cell_ Is Nothing Then
        If rng(1).Value <> "" Then number = rng.Rows.count - Application.count(rng)
        number = number + 1
        sh.Range("A" & lastRow + 1).Value = Application.Roman(number) & ". " & ListBox1.List(rowindex, 0)
        With sh.Range("A" & lastRow + 2)
            .Value = 1
            For c = 1 To 4
                .Offset(0, c).Value = ListBox1.List(rowindex, c)
            Next c
        End With
    Else
        lastRow = cell_.Row + 1
        Do While IsNumeric(sh.Range("A" & lastRow).Value) And (sh.Range("A" & lastRow).Value <> "")
            lastRow = lastRow + 1
        Loop
        If sh.Range("A" & lastRow).Value <> "" Then sh.Range("A" & lastRow).EntireRow.Insert xlShiftDown
        With sh.Range("A" & lastRow)
            .Value = .Offset(-1).Value + 1
            For c = 1 To 4
                .Offset(0, c).Value = ListBox1.List(rowindex, c)
            Next c
        End With
    End If
End Sub

Private Sub TextBox1_Change()
    If IsEmpty(TextBox1.Value) Then
        ListBox1.List = Arr
    Else
        ListBox1.Clear
'        vi du liet ke tuong minh cac cot can tim, tuc nhap mang cols. Ta khong phan biet chu hoa hay chu thuong
        FindMultiCol_to_ListBox TextBox1.Value, True, "-", Arr, ListBox1, 1, 2
    End If
    Label2 = "SO HANG MUC TIM KIEM DUOC: " & ListBox1.ListCount
End Sub

Private Sub UserForm_Activate()
    Arr = Range("DMXD").Value2
    ListBox1.ColumnCount = 5
    ListBox1.ColumnWidths = "205 pt;205 pt;72 pt;72 pt;205 pt"
    TextBox1_Change
End Sub
 
Hy vọng bác không bị vướng vào cái vòng "bảo trì code". Theo luật "được đằng chân, lân đằng đầu", đồ phơ-ri mà bảo "hết" thì khó lắm.
Các anh nói mà ngại quá! Bản thân sẽ cố gắng giành thời gian tự học thêm dần và trau dồi kiến thức.
 
Hy vọng bác không bị vướng vào cái vòng "bảo trì code". Theo luật "được đằng chân, lân đằng đầu", đồ phơ-ri mà bảo "hết" thì khó lắm.
Tôi đã kết thúc với chủ thớt rồi, bác đừng lo.
Thực ra mình cầy thế nhưng có được gì đâu. Một câu đùa cũng có thể kiếm được like. Không đáng.
 
Tôi đã kết thúc với chủ thớt rồi, bác đừng lo.
Thực ra mình cầy thế nhưng có được gì đâu. Một câu đùa cũng có thể kiếm được like. Không đáng.
Có gì không đúng thì cũng mong a thông cảm, chưa kịp nói lời cảm ơn khi a đã bỏ thời gian và kiến thức để hỗ trợ ạ.
 
Web KT
Back
Top Bottom