Tim kiếm dữ liệu từ một chuỗi điều kiện ??? (1 người xem)

Liên hệ QC

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

dinh_trong_hoa

Thành viên mới
Tham gia
14/8/12
Bài viết
23
Được thích
3
Chào các bạn !

- Mình có một vướn mắc về LBound & UBound. Mong các bạn chỉ dẫn thêm.
- Trong file kèm theo có 02 sheets: sheet "danh sach" là sheet gốc, lưu trữ thông tin về sản phẩm, sheet "he thong code" là danh sách code cần kiểm tra. Mỗi một cell là một tập hợp các code của một sản phẩm cách nhau bằng dấu ";" (Một sản phẩm có thể có nhiều code vd: sửa rữa mặt tên "A", có nhiều loại dung tích, mỗi dung tích là một code, nhưng có cùng tên sản phẩm là "A"). Mình muốn viết một code dùng để tìm kiếm dữ liệu từ các cells đó, bằng phương pháp tách ra thành từng mãng nhỏ rồi bỏ vào vòng lặp For kết hợp với Split; UBound & LBound. Cách này dùng trong access thì chạy gog lắm nhưng ứng dụng vào excel thì bị báo lỗi mãng.

https://drive.google.com/file/d/0B_rEhoBtrvsQMENZVlMxNklOS3c/edit?usp=sharing

Sub demo()
Dim i, z As Integer
Dim mang As String
For i = 2 To 2889
mang = Split(Sheets("he thong code").Cells(i, 1), ";")
For z = 1 To UBound(mang, 1)
For y = 2 To 1595
If mang(z) = Sheets("danh sach").Cells(y, 1) Then _
Sheets("he thong code").Cells(i, 2) = Sheets("danh sach").Cells(y, 1)
Next
Next
Next
End Sub
 
Lần chỉnh sửa cuối:
Mình cũng cần sự giúp đỡ như chủ thớt, rất mong đc các bạn giúp đỡ của các bạn
 
Upvote 0
Mình cũng cần sự giúp đỡ như chủ thớt, rất mong đc các bạn giúp đỡ của các bạn

Có thấy file đính kèm đâu, nhưng nhìn qua code mình cũng đã thấy có vấn đề rồi :
* Hàm Slpit Trả kết quả về là một mảng (Array), số phần tử đầu tiên của mảng này là số 0
Bạn khai báo Dim Mang as string : Mang= Split... --> sẽ xuất hiện lỗi

mình test thử như sau :
Mã:
Sub Tst()    
Dim mang
        mang = Split("Giai;Phap;excel", ";")
        MsgBox UBound(mang)
End Sub
--
 
Upvote 0
Có thấy file đính kèm đâu, nhưng nhìn qua code mình cũng đã thấy có vấn đề rồi :
* Hàm Slpit Trả kết quả về là một mảng (Array), số phần tử đầu tiên của mảng này là số 0
Bạn khai báo Dim Mang as string : Mang= Split... --> sẽ xuất hiện lỗi

mình test thử như sau :
Mã:
Sub Tst()    
Dim mang
        mang = Split("Giai;Phap;excel", ";")
        MsgBox UBound(mang)
End Sub
--

Cám ơn góp ý của bạn !

Mình có gởi link đó bạn.

Bạn nói vắng tắc quá mình không hiểu, nếu dùng split("tên chuỗi cụ thể",";") thì có gì để nói. Ý mình muốn gán chuỗi theo cells để giá trị thay đổi tương ứng theo vòng lặp. Nếu trường hợp cách của mình không khả thi thì các bạn có cách nào giải quyết được vấn đề của mình không, xin chỉ giúp.

Thanks
 
Upvote 0
Cám ơn góp ý của bạn !

Mình có gởi link đó bạn.

Bạn nói vắng tắc quá mình không hiểu, nếu dùng split("tên chuỗi cụ thể",";") thì có gì để nói. Ý mình muốn gán chuỗi theo cells để giá trị thay đổi tương ứng theo vòng lặp. Nếu trường hợp cách của mình không khả thi thì các bạn có cách nào giải quyết được vấn đề của mình không, xin chỉ giúp.

Thanks

bạn nói :
Chào các bạn !

- Mình có một vướn mắc về LBound & UBound. Mong các bạn chỉ dẫn thêm.
- Trong file kèm theo có 02 sheets: sheet "danh sach" là sheet gốc, lưu trữ thông tin về sản phẩm, sheet "he thong code" là danh sách code cần kiểm tra. Mỗi một cell là một tập hợp các code của một sản phẩm cách nhau bằng dấu ";" (Một sản phẩm có thể có nhiều code vd: sửa rữa mặt tên "A", có nhiều loại dung tích, mỗi dung tích là một code, nhưng có cùng tên sản phẩm là "A"). Mình muốn viết một code dùng để tìm kiếm dữ liệu từ các cells đó, bằng phương pháp tách ra thành từng mãng nhỏ rồi bỏ vào vòng lặp For kết hợp với Split; UBound & LBound. Cách này dùng trong access thì chạy gog lắm nhưng ứng dụng vào excel thì bị báo lỗi mãng.

Bạn nói là code bị lỗi mảng, mình giải thích lý do lỗi thôi !

còn cái link bạn đưa lên, xem xong mình chẳng hiểu gì, tách code gì , ở cột nào ?....vv...
 
Upvote 0
Cám ơn góp ý của bạn !

Mình có gởi link đó bạn.

Bạn nói vắng tắc quá mình không hiểu, nếu dùng split("tên chuỗi cụ thể",";") thì có gì để nói. Ý mình muốn gán chuỗi theo cells để giá trị thay đổi tương ứng theo vòng lặp. Nếu trường hợp cách của mình không khả thi thì các bạn có cách nào giải quyết được vấn đề của mình không, xin chỉ giúp.

Thanks
Mình chưa thử code của bạn ( và chưa chắc hiểu đúng ý định của bạn ) nhưng mình đề nghị cách viết khác, với dữ liệu lớn mà chạy vòng lặp kiểu đó ....mệt máy lắm:
Mã:
Public Sub DoTim()
    Dim DanhSach, HeThong, MgKq, Tach, I, J, d
    Set d = CreateObject("scripting.dictionary")
    DanhSach = Sheets("DANH SACH").Range(Sheets("DANH SACH").[A2], Sheets("DANH SACH").[A50000].End(xlUp))
    HeThong = Sheets("He Thong Code").Range(Sheets("He Thong Code").[A2], Sheets("He Thong Code").[A50000].End(xlUp))
    ReDim MgKq(1 To UBound(HeThong), 1 To 1)
        For I = 1 To UBound(DanhSach)
            If DanhSach(I, 1) <> "" Then
                If Not d.exists(DanhSach(I, 1)) Then d.Add DanhSach(I, 1), ""
            End If
        Next I
            For I = 1 To UBound(HeThong)
                If HeThong(I, 1) <> "" Then
                    Tach = Split(HeThong(I, 1), ";")
                        For J = LBound(Tach) To UBound(Tach)
                            If d.exists(Tach(J)) Then MgKq(I, 1) = MgKq(I, 1) & Tach(J) & " "
                        Next J
                End If
            Next I
    [B2].Resize(UBound(HeThong)) = MgKq
End Sub
Xóa hết những dòng chứa dữ liệu "Value#" đi nhé bạn
Trúng thì tốt, trật thì thôi vậy
Thân
 

File đính kèm

Upvote 0
Cám ơn bạn nhiều,

File của bạn gởi chạy rất tốt và đúng với ý mình,

Cám ơn mọi người đã tham gia bài viết của mình.
 
Upvote 0
Mình chưa thử code của bạn ( và chưa chắc hiểu đúng ý định của bạn ) nhưng mình đề nghị cách viết khác, với dữ liệu lớn mà chạy vòng lặp kiểu đó ....mệt máy lắm:
Mã:
Public Sub DoTim()
    Dim DanhSach, HeThong, MgKq, Tach, I, J, d
    Set d = CreateObject("scripting.dictionary")
    DanhSach = Sheets("DANH SACH").Range(Sheets("DANH SACH").[A2], Sheets("DANH SACH").[A50000].End(xlUp))
    HeThong = Sheets("He Thong Code").Range(Sheets("He Thong Code").[A2], Sheets("He Thong Code").[A50000].End(xlUp))
    ReDim MgKq(1 To UBound(HeThong), 1 To 1)
        For I = 1 To UBound(DanhSach)
            If DanhSach(I, 1) <> "" Then
                If Not d.exists(DanhSach(I, 1)) Then d.Add DanhSach(I, 1), ""
            End If
        Next I
            For I = 1 To UBound(HeThong)
                If HeThong(I, 1) <> "" Then
                    Tach = Split(HeThong(I, 1), ";")
                        For J = LBound(Tach) To UBound(Tach)
                            If d.exists(Tach(J)) Then MgKq(I, 1) = MgKq(I, 1) & Tach(J) & " "
                        Next J
                End If
            Next I
    [B2].Resize(UBound(HeThong)) = MgKq
End Sub
Xóa hết những dòng chứa dữ liệu "Value#" đi nhé bạn
Trúng thì tốt, trật thì thôi vậy
Thân

Xin chào concogia !

Phương pháp của bạn rất hay, công việc hiện tại của mình thường dùng vòng lặp để giải quyết vấn đề, với dữ liệu lớn nên vòng lặp chạy rất chậm, nhờ bạn chỉ mình cách làm của bạn. Mình có nghiên cứu qua nhưng chua nắm được, nhờ bạn phân tích giùm

Thanks
 
Upvote 0
Xin chào concogia !

Phương pháp của bạn rất hay, công việc hiện tại của mình thường dùng vòng lặp để giải quyết vấn đề, với dữ liệu lớn nên vòng lặp chạy rất chậm, nhờ bạn chỉ mình cách làm của bạn. Mình có nghiên cứu qua nhưng chua nắm được, nhờ bạn phân tích giùm

Thanks
Mã:
Public Sub DoTim()
[CODE]
    Dim DanhSach, HeThong, MgKq, Tach, I, J, d '[COLOR=#ff0000]Khai báo các biến mảng và các biến chạy vòng lặp[/COLOR]
    Set d = CreateObject("scripting.dictionary") ' Khai báo biến đối tượng dictionary
    DanhSach = Sheets("DANH SACH").Range(Sheets("DANH SACH").[A2], Sheets("DANH SACH").[A50000].End(xlUp))[COLOR=#ff0000] ' Đưa dữ liệu cột A từ A2 tới ô có dữ lieu cuối vào mảng[/COLOR]
    HeThong = Sheets("He Thong Code").Range(Sheets("He Thong Code").[A2], Sheets("He Thong Code").[A50000].End(xlUp))[COLOR=#ff0000] ' Đưa dữ liệu cột A từ A2 [COLOR=#ff0000]tới ô có dữ lieu cuối [/COLOR]vào mản[/COLOR]g
    ReDim MgKq(1 To UBound(HeThong), 1 To 1)  [COLOR=#ff0000]' khai báo lại hay định lại "kích thước" mảng[/COLOR]
        For I = 1 To UBound(DanhSach) [COLOR=#ff0000]'chạy vòng lặp từ 1 tới số "phần tử" của mảng danh sach[/COLOR]
            If DanhSach(I, 1) <> "" Then [COLOR=#ff0000]' kiểm tra phần tử không rỗng thì làm việc sau[/COLOR]
                If Not d.exists(DanhSach(I, 1)) Then d.Add DanhSach(I, 1),[COLOR=#008000] "" ' Thông thường chỗ này mình hay nạp là "I" key và item cho dictionary "d"
        [/COLOR]    End If
        Next I
            For I = 1 To UBound(HeThong) [COLOR=#ff0000] ' chạy vòng lặp qua phần tử của mảng hệ thống[/COLOR]
                If HeThong(I, 1) <> "" Then [COLOR=#ff0000]' kiểm tra phần tử không rỗng thì làm việc sau[/COLOR]
                    Tach = Split(HeThong(I, 1), ";") [COLOR=#ff0000]' tách nhỏ phần tử của phần tử hệ thống nếu gặp ";" và đưa vào mảng "tach"[/COLOR] 
                        For J = LBound(Tach) To UBound(Tach) [COLOR=#ff0000]' chạy vòng lặp qua số phần tử của mảng tách "j bắt đầu bằng 0"[/COLOR]
                            If d.exists(Tach(J)) Then MgKq(I, 1) = MgKq(I, 1) & Tach(J) & " " [COLOR=#ff0000]' kiểm tra phần tử của mảng tách có phải là key của dictionary "d" khong? phải thì làm
                       [/COLOR] Next J [COLOR=#ff0000] '----> gán phần tử trong mảng tách trên vào MgKq có idex tương dương với mảng "hethong"  [/COLOR]             
                End If
            Next I
    [B2].Resize(UBound(HeThong)) = MgKq
End Sub                                                     
[CODE]
Xin dùng lại code của bạn [COLOR=#008000]CONCOGIA[/COLOR] giải thích cho thành viên nhé!
bạn nghiên cứu thêm phần dictionary nhé mình học được từ anh [COLOR=#006400]NDU[/COLOR] đó
[CODE]
If Not d.exists(DanhSach(I, 1)) Then d.Add DanhSach(I, 1),[COLOR=#008000] ""
[COLOR=#008000][/COLOR][/COLOR][CODE][COLOR=#008000] Xin hoi thêm là nạp item bằng "" khác gì với I chỉ số của mảng luôn không với a?
[/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom