Insert dòng và điền dữ liệu sau khi lọc bằng hàm Filter2Darray (1 người xem)

Liên hệ QC

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

vanhesing

Thành viên thường trực
Tham gia
12/8/10
Bài viết
223
Được thích
30
Xin chào mọi người !
Tôi có 1 ví dụ về hàm Filter2Darray cho việc insert và điền dữ liệu , mong mọi người xem qua và giúp đỡ
Trong file tôi gửi có dùng hàm Filter2Darray của thầy NDU.hàm này ngoài việc lọc theo 2 điều kiện tôi muốn tìm hiểu xem có insert và điền dữ liệu cho dòng đã insert hay không.Nếu sử dụng hàm Find thì tôi làm được khi không lọc bằng Filter2Darray nhưng sau khi lọc thì không được.Vậy nếu dùng Filter2Darray có insert và điền dữ liệu vào dòng vừa insert trước và sau khi lọc và được hay không ?tôi đã mày mò tìm hiểu nhưng vẫn không tìm được hướng.
Trong file mình dùng hàm Filter2Darray để chỉnh sữa dữ liệu.giờ mong muốn mọi người giúp và giải thích giùm việc insert bằng Filter2Darray.
Mong mọi người giúp đỡ.Chân thành cảm ơn
=http://quanaososinh.vn/quan-ao-tre-em/quan-ao-so-sinh
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
À, do lúc nghiên cứu biến tấu code của Anh nên chưa xóa .Cảm ơn nhắc nhở của Anh
Vả lại, bạn "biến tấu" đôi khi không đúng và còn vụng về các trường hợp (xóa, sửa). Bây giờ, để tiện cho bạn không phải sửa code khi thay đổi qua file chính, khi mà hàng đầu tiên của số thứ tự đầu tiên không như file test thì tôi làm luôn cho bạn, bạn chỉ cần thay thế số dòng trong câu lệnh này, còn lại nó tự hiểu phải làm gì:

Private Const StandardRow As Long = 6

Và đây là toàn bộ code tôi viết lại cho bạn:

Mã:
Option Explicit
Private sArray
Private RowIndex As Long
[COLOR=#0000ff][B]Private Const StandardRow As Long = [/B][/COLOR][SIZE=5][COLOR=#ff0000][B]6[/B][/COLOR][/SIZE]


Private Sub UserForm_Initialize()
    Call Nap
End Sub


Sub TaoSTT()
    Dim LastRow As Long
    With Sheet1
        LastRow = .Range("E65536").End(xlUp).Row
        Select Case LastRow
        Case Is < StandardRow
            Exit Sub
        Case StandardRow
            .Range("A" & StandardRow) = 1
        Case StandardRow + 1
            .Range("A" & StandardRow) = 1
            .Range("A" & StandardRow + 1) = 2
        Case Else
            .Range("A" & StandardRow) = 1
            .Range("A" & StandardRow + 1) = 2
            .Range("A" & StandardRow).Resize(2, 1).AutoFill _
             Destination:=.Range("A" & StandardRow & ":A" & LastRow)
        End Select
    End With
End Sub


Sub Nap()
    Dim Dict As Object
    Dim LastRow As Long, r As Long, u As Long
    LastRow = Sheet1.Range("E65536").End(xlUp).Row
    sArray = Sheet1.Range("A" & StandardRow & ":N" & LastRow).Value
    u = UBound(sArray)
    ''Dung de loc duy nhat so nha, gan cho Combobox:
    Set Dict = CreateObject("Scripting.Dictionary")
    For r = 1 To u
        sArray(r, 14) = r + StandardRow
        Dict(sArray(r, 3)) = sArray(r, 3)
    Next
    ListBox1.List() = sArray
    LOC.List = Dict.Keys
End Sub


Private Sub ListBox1_Click()
    Dim c As Byte
    For c = 1 To 12
        Controls("Combobox" & c) = ListBox1.List(, c)
    Next
    RowIndex = ListBox1.List(, 13)
    cmdInsert.Enabled = True
    Cmdxoa.Enabled = True
    Cmdsua.Enabled = True
End Sub


Private Sub LOC_Change()
    ListBox1.List() = Filter2DArray(sArray, 3, LOC.Text & "*", False)
End Sub


Private Sub cmdInsert_Click()
    Dim c As Byte
    Sheet1.Range("A" & RowIndex & ":P" & RowIndex).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    For c = 1 To 12
        Sheet1.Range("A" & RowIndex).Offset(, c) = Controls("Combobox" & c)
    Next
    Call TaoSTT
    Call Nap
    ListBox1.ListIndex = RowIndex - StandardRow
End Sub


Private Sub NUTNL_Click()
    Dim c As Long, LastRow As Long
    With Sheet1
        LastRow = .Range("E65536").End(xlUp).Row + 1
        For c = 1 To 12
            Sheet1.Range("A" & LastRow).Offset(, c) = Controls("Combobox" & c)
        Next
    End With
    Call TaoSTT
    Call Nap
    ListBox1.ListIndex = ListBox1.ListCount - 1
End Sub


Private Sub Cmdxoa_Click()
    Sheet1.Range("A" & RowIndex - 1 & ":n" & RowIndex).Delete Shift:=xlUp
    Call TaoSTT
    Call Nap
    ListBox1.ListIndex = RowIndex - 1 - StandardRow
End Sub


Private Sub Cmdsua_Click()
    Dim c As Byte
    For c = 1 To 12
        Sheet1.Range("A" & RowIndex - 1).Offset(, c) = Controls("Combobox" & c)
    Next
    Call TaoSTT
    Call Nap
    ListBox1.ListIndex = RowIndex - 1 - StandardRow
End Sub
 

File đính kèm

Upvote 0
Mã:
Private Sub Cmdxoa_Click()
    Sheet1.Range("A"
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Nghĩa vui lòng giúp nốt tôi phần này với,tôi đã mò đủ kiểu nhưng vẫn lỗi.cơ bản mặc định code Anh xóa 1 lần 2 dòng nếu chọn random.còn chọn dòng cuối thì báo lỗi . - - -
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Anh Nghĩa vui lòng giúp nốt tôi phần này với,tôi đã mò đủ kiểu nhưng vẫn lỗi.cơ bản mặc định code Anh xóa 1 lần 2 dòng nếu chọn random.còn chọn dòng cuối thì báo lỗi .+-+-+-+
tôi không tham gia từ đầu nên không biết tại sao lại phải xóa 1 lần 2 dòng ? tôi đâu thấy 2 dòng liên tiếp có liên quan gì ?
đây là code xóa 1 lần 1 dòng . xóa dòng nào tùy
Mã:
Private Sub Cmdxoa_Click()
    Sheet1.Range("A" & RowIndex - 1 & ":n" & RowIndex - 1).Delete Shift:=xlUp
    Call TaoSTT
    Call Nap
    ListBox1.ListIndex = WorksheetFunction.Min(RowIndex - 1 - StandardRow, ListBox1.ListCount - 1)
End Sub
 
Upvote 0
tôi không tham gia từ đầu nên không biết tại sao lại phải xóa 1 lần 2 dòng ? tôi đâu thấy 2 dòng liên tiếp có liên quan gì ?
đây là code xóa 1 lần 1 dòng . xóa dòng nào tùy
Mã:
Private Sub Cmdxoa_Click()
    Sheet1.Range("A"
 
Lần chỉnh sửa cuối:
Upvote 0
Chào bạn !
Quả thật 2 dòng liên tiếp không có liên quan và mình cũng không uốn xóa như vậy.mình chỉ muốn xóa 1 dòng và code của bạn đã đúng ý mình.hóa ra vấn đề đơn giản vậy.
Cảm ơn bạn đã khai sáng , chúc sức khỏe bạn
Cuối tuần với gia đình nên không lên mạng. Nếu không muốn đụng chạm gì đến WorksheetFunction thì dùng code sau:

Mã:
Private Sub Cmdxoa_Click()
    Dim ListIndex As Long
    Sheet1.Range("A" & RowIndex - 1 & ":n" & RowIndex).Delete Shift:=xlUp
    Call TaoSTT
    Call Nap
    ListIndex = RowIndex - 1 - StandardRow
    With ListBox1
        .ListIndex = IIf(ListIndex < .ListCount - 1, ListIndex, .ListCount - 1)
    End With
End Sub
 
Upvote 0
ok rồi Anh
Anh vui lòng cho tôi hỏi thêm 1 cái nữa .
Sau khi nạp và lọc trên listbox tôi tạo một label đếm lấy tổng các số nhà có ký tự là "A".Đếm cột số nhà trong trong listbox sau khi lọc chứ không phải đếm trên range.
Thanks Anh
Tôi thêm cho bạn:

1) TextBox: Bạn gõ ký tự cần tìm

2) Label: Đếm số lượng ký tự đó xuất hiện trên tổng số mục đã lọc (x/X)

3) Ở CoboBox tìm kiếm, tôi thêm một dấu sao (*) để lọc ký tự bất kỳ chứa trong dãy số nhà, thay vì gõ 137 thì chỉ cần gõ 37 nó cũng sẽ lọc toàn bộ những địa chỉ có số *37*.

4) Code cho các sự kiện:

Mã:
Private Sub LOC_Change()
    On Error Resume Next
[B]    arrFilter = Filter2DArray(sArray, 3,[COLOR=#ff0000] "*" &[/COLOR] LOC.Text & "*", False)[/B]
    ListBox1.List() = arrFilter
    txtKey = ""
    lblCount = ""
End Sub


Private Sub txtKey_Change()
    If IsArray(arrFilter) Then
        Dim r As Long, u As Long, i As Long
        u = UBound(arrFilter)
        For r = 1 To u
            If InStr(UCase(arrFilter(r, 3)), UCase(txtKey)) Then
                i = i + 1
            End If
        Next
        lblCount = i & " / " & u
    End If
End Sub
 

File đính kèm

Upvote 0
Rất đúng ý tôi .Chân thành cảm ơn Anh .
Tôi đã có làm như Anh cũng dùng hàm Filter2Darray để lọc rồi dù code viết không pro bằng Anh .thêm 1 ví dụ , nếu tôi có thêm nhiều cái label nữa , lần này , điều kiện đếm là "A1", "A2", "A3","B1","B2","B3","C1","C2","C3" và không cần textbox để tìm kí tự gần giống (Anh sữa cột số nhà theo dk giùm ).vậy ta sẽ dùng bao nhiu vòng lặp lồng vào nhau ?cho các label mặc định theo số thứ tự, cho dễ dàng khi dùng vòng lặp. Anh có thể hướng dẫn tôi bằng code vòng lặp thích hợp được không?
Thú thật tôi đang cố gắng học và hiểu về các vòng lặp.
Thanks Anh
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Rất đúng ý tôi .Chân thành cảm ơn Anh .
Tôi đã có làm như Anh cũng dùng hàm Filter2Darray để lọc rồi dù code viết không pro bằng Anh .thêm 1 ví dụ , nếu tôi có thêm nhiều cái label nữa , lần này , điều kiện đếm là "A1", "A2", "A3","B1","B2","B3","C1","C2","C3" và không cần textbox để tìm kí tự gần giống (Anh sữa cột số nhà theo dk giùm ).vậy ta sẽ dùng bao nhiu vòng lặp lồng vào nhau ?cho các label mặc định theo số thứ tự, cho dễ dàng khi dùng vòng lặp. Anh có thể hướng dẫn tôi bằng code vòng lặp thích hợp được không?
Thú thật tôi đang cố gắng học và hiểu về các vòng lặp.
Thanks Anh
Đúng là ĐƯỢC VOI ĐÒI 2 BÀ TƯNG mà!

Lỡ cưỡi bà Tưng rồi, ủa quên, lỡ cưỡi voi rồi phải đi luôn chớ biết làm sao!

Mã:
Private Sub LOC_Change()
    On Error Resume Next
    Dim arrFilter, arrKey
    Dim arrCount(0 To 11) As Long
    Dim c As Long, uc As Long, r As Long, ur As Long
    
    arrKey = Array("A", "B", "C", "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
    
    arrFilter = Filter2DArray(sArray, 3, "*" & LOC.Text & "*", False)
    ListBox1.List() = arrFilter
    
    ur = UBound(arrFilter): uc = UBound(arrKey)
    
    For r = 1 To ur
        For c = 0 To uc
            If InStr(UCase(arrFilter(r, 3)), arrKey(c)) Then
                arrCount(c) = arrCount(c) + 1
            End If
        Next
    Next
    
    For c = 0 To uc
        Select Case c
        Case 0 To 2
            Controls("lbl" & arrKey(c)) = "Nhóm " & arrKey(c) & ": " & arrCount(c)
        Case Else
            Controls("lbl" & arrKey(c)) = arrKey(c) & ": " & arrCount(c)
        End Select
    Next
End Sub

Code cho 12 Label đó.
 

File đính kèm

Upvote 0
Đúng là ĐƯỢC VOI ĐÒI 2 BÀ TƯNG mà!

Lỡ cưỡi bà Tưng rồi, ủa quên, lỡ cưỡi voi rồi phải đi luôn chớ biết làm sao!
Bể học mênh mông mà Anh.Không biết phải hỏi, càng hỏi càng mù.
Cưỡi bà Tưng thì tôi không ngại đâu .
Tôi không đòi voi nữa đâu chỉ muốn hỏi thêm 1 câu :
Các số từ các control trên form đưa xuống cells đều bị lỗi và mất số "0" đầu .thật đau đầu khi phải convert to number từng cột.
Thanks và chúc sức khỏe
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bể học mênh mông mà Anh.Không biết phải hỏi, càng hỏi càng mù.
Cưỡi bà Tưng thì tôi không ngại đâu .
Tôi không đòi voi nữa đâu chỉ muốn hỏi thêm 1 câu :
Các số từ các control trên form đưa xuống cells đều bị lỗi và mất số "0" đầu .thật đau đầu khi phải convert to number từng cột.
Thanks và chúc sức khỏe

Muốn giữ là số thì dùng hàm Val. Ví dụ:

Range("A1").Value = Val(TextBox1)
 
Upvote 0
Nhưng trong file ta dùng vòng lặp --=0

Bạn nên định dạng ở các cột 1, 7, 9 (B, H, J) với cột 1 là General, 7 là dd/mm/yyyy, 9 là 000000000. Các số liệu đã lưu trước nên sửa về đúng định dạng chuẩn của nó thì mới dễ dàng thao tác được (tôi đánh giá cao sự "gan dạ" của bạn vì chương trình chưa hoàn thành đã dám nhập vào CSDL).

Việc code có dòng lặp ta làm như sau:

Mã:
Private Sub Cmdsua_Click()
    Dim c As Byte
    For c = 1 To 12
        Select Case c
        Case 1, 9
            Sheet1.Range("A" & RowIndex - 1).Offset(, c) = Val(Controls("Combobox" & c))
        Case 7
            Sheet1.Range("A" & RowIndex - 1).Offset(, c) = DateValue(Controls("Combobox" & c))
        Case Else
            Sheet1.Range("A" & RowIndex - 1).Offset(, c) = Controls("Combobox" & c)
        End Select
    Next
    Call TaoSTT
    Call Nap
    ListBox1.ListIndex = RowIndex - 1 - StandardRow
End Sub

Private Sub cmdInsert_Click()
    Dim c As Byte
    Sheet1.Range("A" & RowIndex & ":P" & RowIndex).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    For c = 1 To 12
        Select Case c
        Case 1, 9
            Sheet1.Range("A" & RowIndex).Offset(, c) = Val(Controls("Combobox" & c))
        Case 7
            Sheet1.Range("A" & RowIndex).Offset(, c) = (Controls("Combobox" & c))
        Case Else
            Sheet1.Range("A" & RowIndex).Offset(, c) = Controls("Combobox" & c)
        End Select
    Next
    Call TaoSTT
    Call Nap
    ListBox1.ListIndex = RowIndex - StandardRow
End Sub


Private Sub NUTNL_Click()
    Dim c As Long, LastRow As Long
    With Sheet1
        LastRow = .Range("E65536").End(xlUp).Row + 1
        For c = 1 To 12
            Select Case c
            Case 1, 9
                .Range("A" & LastRow).Offset(, c) = Val(Controls("Combobox" & c))
            Case 7
                .Range("A" & LastRow).Offset(, c) = DateValue(Controls("Combobox" & c))
            Case Else
                .Range("A" & LastRow).Offset(, c) = Controls("Combobox" & c)
            End Select
        Next
    End With
    Call TaoSTT
    Call Nap
    ListBox1.ListIndex = ListBox1.ListCount - 1
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Các số từ các control trên form đưa xuống cells đều bị lỗi và mất số "0" đầu .thật đau đầu khi phải convert to number từng cột.
Thanks và chúc sức khỏe
Để chữa cháy cho trường hợp này ta làm như sau:

Chọn khối ô cần Convert thành Number (đừng chọn cả cột nha, chọn khối có giá trị thôi, chọn cả cột có khi hút xong điếu thuốc nó chưa chạy xong đấy) rồi chạy code sau:

Mã:
Sub NumberConvert()
    On Error Resume Next
    Dim cell As Range
    For Each cell In Selection
        If cell.Value > "" Then
            cell.Value = Val(cell)
        End If
    Next
End Sub

Tương tự với cột ngày tháng:

Mã:
Sub DateConvert()
    On Error Resume Next
    Dim cell As Range
    For Each cell In Selection
        If cell.Value > "" Then
            cell.Value = DateValue(cell)
        End If
    Next
End Sub

Trời ơi, gõ thủ công từng ngày một chắc giập mật quá!
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nên định dạng ở các cột 1, 7, 9 (B, H, J) với cột 1 là General, 7 là dd/mm/yyyy, 9 là 000000000. Các số liệu đã lưu trước nên sửa về đúng định dạng chuẩn của nó thì mới dễ dàng thao tác được (tôi đánh giá cao sự "gan dạ" của bạn vì chương trình chưa hoàn thành đã dám nhập vào CSDL).

Việc code có dòng lặp ta làm như sau:

Mã:
Private Sub Cmdsua_Click()
    Dim c As Byte
    For c = 1 To 12
        Select Case c
        Case 1, 9
            Sheet1.Range("A"
 
Lần chỉnh sửa cuối:
Upvote 0
Anh đừng đề cao sự gan dạ tôi thế, CSDL của tôi không có dòng nào bị vậy cả(chỉ bị mỗi ô số dt) .Trước kia tôi nhập không dùng vòng lặp mà .còn file mẫu tôi gửi lên diễn đàn chỉ là file test copy dữ liệu nên chưa convert nên tôi không gan dạ như Anh nghỉ đâu!$@!!
Bạn biết cách phân biệt đâu là chuỗi, đâu là số chưa? Khi không định dạng canh trái, canh phải hay canh giữa, mặc nhiên Text thì nằm bên trái ô, Number thì lại nằm bên phải. Cả 3 cột mà tôi nói đều là như thế, bạn xem file test tôi tải từ bài đầu tiên của bạn để xem nhé.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom