Tìm kiếm các chuỗi liên quan đến nhau

Liên hệ QC

KhoiSMC

Thành viên thường trực
Tham gia
19/6/09
Bài viết
246
Được thích
32
Thưa các bạn,

Mình đang mong muốn quản lý công văn có liên quan đến các thư đính kèm cần xâu chuỗi lại thành hệ thống.
Ví dụ thư:
CS2-CP2-0716 có liên quan đến thư CS2-CP2-0736, NSJV-CP2-2013-1919
tìm đến thư
CS2-CP2-0736 có liên quan đến thư NSJV-CP2-2014-0023, NSJV-CP2-2013-1919
NSJV-CP2-2013-1919 có liên quan đến thư CS2-RPMU-CP2-CP3-0583
NSJV-CP2-2014-0023 có liên quan đến thư NSJV-CP2-2013-1919

....

Kết quả xâu chuỗi các thư liên quan lại với nhau, cụ thể mình phân tích trong file đính kèm.
Mong các bạn giúp đỡ.

Thanks
Khoi
 

File đính kèm

  • text.xlsx
    9.8 KB · Đọc: 4
Lần chỉnh sửa cuối:
Thưa các bạn,

Mình đang mong muốn quản lý công văn có liên quan đến các thư đính kèm cần xâu chuỗi lại thành hệ thống.
Ví dụ thư:
CS2-CP2-0716 có liên quan đến thư CS2-CP2-0736, NSJV-CP2-2013-1919
tìm đến thư
CS2-CP2-0736 có liên quan đến thư NSJV-CP2-2014-0023, NSJV-CP2-2013-1919
NSJV-CP2-2013-1919 có liên quan đến thư CS2-RPMU-CP2-CP3-0583
NSJV-CP2-2014-0023 có liên quan đến thư NSJV-CP2-2013-1919

....

Kết quả xâu chuỗi các thư liên quan lại với nhau, cụ thể mình phân tích trong file đính kèm.
Mong các bạn giúp đỡ.

Thanks
Khoi
Kết quả của bạn khi nhập CS2-CP2-0716 là:
CS2-CP2-0736, NSJV-CP2-2013-1919, NSJV-CP2-2014-0023, CS2-RPMU-CP2-CP3-0583, NSJV-CP2-2014-0023
làm sao mà ra 2 thằng in đậm dzị ???
Nhìn bằng mắt & nếu mình đoán đúng đề bài thì kết quả sẽ là:
CS2-CP2-0736, NSJV-CP2-2013-1919, CS2-RPMU-CP2-CP3-0583, NSJV-CP2-2014-0023, NSJV-CP2-2013-1919, NSJV-CP2-2013-1919
Híc, có những thằng trùng thì sao ???? có lấy duy hất hông ????
Dữ liệu thật của bạn như thế này chứ ????
Thân
 
Kết quả của bạn khi nhập CS2-CP2-0716 là:

làm sao mà ra 2 thằng in đậm dzị ???
Nhìn bằng mắt & nếu mình đoán đúng đề bài thì kết quả sẽ là:

Híc, có những thằng trùng thì sao ???? có lấy duy hất hông ????
Dữ liệu thật của bạn như thế này chứ ????
Thân

Hic, mình xin lỗi. Mong muốn kết quả là duy nhất bạn ạ.
Kết quả mong muốn là:
CS2-CP2-0736, NSJV-CP2-2013-1919, NSJV-CP2-2014-0023, CS2-RPMU-CP2-CP3-0583

Thanks
Khoi
 
Lần chỉnh sửa cuối:
Mình đang đọc file của bạn.

Cám ơn bạn nhiều lắm.
Khoi :)
 

Oa đúng ý mình rồi bạn ạ,
Chỉ có điều mình muốn bạn chỉnh lại code một chút giúp mình đó là ghi nhập CS2-RPMU-CP2-CP3-0583 thì bị lỗi chương trình, do không có dữ liệu ở cột B, (hoặc khi nhập sai dữ liệu ở ô D4 thì cũng lỗi bạn ạ).

Một trường hợp cũng thỉnh thoảng xảy ra là khi mình nhập dữ liệu vào cột B (ô B12, B13 ...) thì file excel bị treo bạn ạ, không biết có phải do máy mình không nưa?

Cám ơn bạn nhiều lắm.
Khoi
 
Lần chỉnh sửa cuối:
Oa đúng ý mình rồi bạn ạ,
Chỉ có điều mình muốn bạn chỉnh lại code một chút giúp mình đó là ghi nhập CS2-RPMU-CP2-CP3-0583 thì bị lỗi chương trình, do không có dữ liệu ở cột B, (hoặc khi nhập sai dữ liệu ở ô D4 thì cũng lỗi bạn ạ).


Cám ơn bạn nhiều lắm.
Khoi
Right Click vào Sheet2 ==> View Code ==> Chép em này đè lên em cũ:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Vung, I, d, Tam, Gom, Tach, Kq
    If Target.Address = "$D$4" Then
        If Len(Target) Then
            Gom = Target.Value
            Set d = CreateObject("scripting.dictionary")
            Vung = Range([A2], [A1000].End(xlUp)).Resize(, 2)
                For I = 1 To UBound(Vung)
                    d.Add Vung(I, 1), Vung(I, 2)
                Next I
                If d.Item(Target.Value) = "" Or Not d.exists(Target.Value) Then Exit Sub
                    For I = 1 To UBound(Vung)
                        If Vung(I, 1) <> "" Then
                            If InStr(Gom, Vung(I, 1)) Then
                                If d.Item(Vung(I, 1)) <> "" Then Tam = Tam & ", " & d.Item(Vung(I, 1))
                                Gom = Gom & ", " & d.Item(Vung(I, 1))
                                Vung(I, 1) = "": I = 0
                            End If
                         End If
                    Next I
                        Tach = Split(Tam, ",")
                For I = 0 To UBound(Tach)
                    If Tach(I) <> "" Then
                        If InStr(Kq, Tach(I)) = 0 Then Kq = Kq & ", " & Tach(I)
                    End If
                Next I
                Target.Offset(, 1) = Right(Kq, Len(Kq) - 2)
        End If
    End If
End Sub
Thân
 
Right Click vào Sheet2 ==> View Code ==> Chép em này đè lên em cũ:

Thân

Cám ơn bạn concogia,

Đã xử lý được vấn đề mình thắc mắc rồi bạn ạ, chỉ có điều thỉnh thoảng xảy ra là khi mình nhập dữ liệu vào cột B (ô B12, B13 ...) thì file excel bị treo (xử lý chậm) bạn ạ, không biết khi dữ liệu nhiều hơn có vấn đề gì không?
có phải do máy mình không nữa?

Thân,
Khoi
 
Lần chỉnh sửa cuối:
Cám ơn bạn concogia,

Đã xử lý được vấn đề mình thắc mắc rồi bạn ạ, chỉ có điều thỉnh thoảng xảy ra là khi mình nhập dữ liệu vào cột B (ô B12, B13 ...) thì file excel bị treo (xử lý rất chậm) bạn ạ, không biết có phải do máy mình không nữa?

Thân,
Khoi
Mình cũng ...hổng biết+-+-+-++-+-+-++-+-+-+
Code chẳng đụng chạm gì đến Cell B12, B13.....nói chung cả cột B
Khi nhập vào cell [D4] thì code mới chạy chứ cột A & B chẳng liên quan gì ráo
Híc+-+-+-++-+-+-++-+-+-+ Thân
 
Mình cũng ...hổng biết+-+-+-++-+-+-++-+-+-+
Code chẳng đụng chạm gì đến Cell B12, B13.....nói chung cả cột B
Khi nhập vào cell [D4] thì code mới chạy chứ cột A & B chẳng liên quan gì ráo
Híc+-+-+-++-+-+-++-+-+-+ Thân

/-*+//-*+//-*+/
Hi cám ơn bạn concogia nhiều nhé,
Mình chờ một lúc thì cũng chạy xong bạn a,

Than,
Khoi
 
Bạn concgia ơi,

Mình triển khai tiếp công việc tuy nhiên phải sử dụng công thức để update cột A,B. Nhưng khi sử dụng công thức thì code không chạy nữa. Mình cũng thử ktra code nhưng chưa được.
Nhờ bạn gỡ rối cho mình với.
Xin xem file đính kèm.
https://www.dropbox.com/s/5q4z8qp1tinbbqi/mpi.yvlc.search letters.xlsm

Thanks
Khoi
 
Bạn concgia ơi,

Mình triển khai tiếp công việc tuy nhiên phải sử dụng công thức để update cột A,B. Nhưng khi sử dụng công thức thì code không chạy nữa. Mình cũng thử ktra code nhưng chưa được.
Nhờ bạn gỡ rối cho mình với.
Xin xem file đính kèm.
https://www.dropbox.com/s/5q4z8qp1tinbbqi/mpi.yvlc.search letters.xlsm

Thanks
Khoi
Cái bài trước và bài này giống nhau....chỗ nào vậy bạn
Híc +-+-+-++-+-+-++-+-+-+ Đọc xong hiểu..chết liền
Thân
 
Cái bài trước và bài này giống nhau....chỗ nào vậy bạn
Híc +-+-+-++-+-+-++-+-+-+ Đọc xong hiểu..chết liền
Thân

Mình chỉnh được rồi có thể do dữ liệu của mình chưa chuẩn, khi lọc những dữ liệu có thư liên quan thôi thì kết quả ra đúng bạn ạ,

Thanks
Khoi
 

File đính kèm

  • mpi.yvlc.search letters.xlsm
    48.5 KB · Đọc: 2
Mình chỉnh được rồi có thể do dữ liệu của mình chưa chuẩn, khi lọc những dữ liệu có thư liên quan thôi thì kết quả ra đúng bạn ạ,

Thanks
Khoi

Tôi không rõ nguyên nhân cụ thể nhưng nhìn bằng mắt thì thấy code có vài chỗ chưa chuẩn.

Trích
Mã:
Gom = Target.Value
...
Vung = Range([A5], [A1000].End(xlUp)).Resize(, 2)
For I = 1 To UBound(Vung)
                    d.Add Vung(I, 1), Vung(I, 2)    (B)
Next I
...
For I = 1 To UBound(Vung)
                    If Vung(I, 1) <> "" Then    (A)
                        If InStr(Gom, Vung(I, 1)) Then    (C)
                            If d.Item(Vung(I, 1)) <> "" Then Tam = Tam & ", " & d.Item(Vung(I, 1)) '<--
                            Gom = Gom & ", " & d.Item(Vung(I, 1))
                            Vung(I, 1) = "": I = 0
                        End If
                     End If
Next I
...
Target.Offset(, 1) = Right(Kq, Len(Kq) - 2)        (D)

Dòng ̣(A) có If Vung(I, 1) <> "" Then, tức ta lường được trường hợp ô trong cột "Thư" có thể rỗng. Tức ta cho phép cột "Thư" có dòng rỗng. Như thế thì code dòng (B) không chuẩn - khi nhập giá trị rỗng thứ 2 hoặc giá trị trùng với trước đó thì có lỗi. Nếu có > 2 dòng rỗng (trong tập tin ban đầu 2 ô rỗng giữa các ô có dữ liệu), hoặc > 2 ô có cùng giá trị (trong tập tin ban đầu 2 ô có giá trị "Hoi") thì tại (B) có "buuum".

Dòng (C) có If InStr(Gom, Vung(I, 1)) Then.
Nếu vd. Vung(I, 1) có dấu cách ở cuối (dữ liệu của bạn có như thế) vd. "NSJV-CP2-2014-0040 " mà Gom = "NSJV-CP2-2014-0040," thì không tìm thấy rồi. Nhưng chuyện dấu cách ở cuối quá tầm thường, không đáng để chỉ ra. Có điều là dữ liệu của bạn đa dạng.

Có "CS2-CP2-0739", và có cả "NSJV-CP2-2014-0011", tức 3 hoặc 4 (5, 6, 7, 8, 9) "khúc".

Vậy nếu bạn có vd. Gom = "NSJV-CP2-2014-0011," mà bạn muốn tìm Vung(I, 1) = ""NSJV-CP2-2014" thì rõ ràng kết quả sai rồi.

Dòng (D): nguyên tác là phải kiểm tra Kq. Thế nếu không có "liên kết" nào, tức Kq rỗng thì cũng Len, Right rồi đập xuống sheet???

Tóm lại phụ thuộc vào may rủi. Vd. nếu ô nhập và cột "Thư" đều có dấu cách ở cuối thì không sao. Nhưng nếu ô nhập không có dấu cách mà cột "Thư" có dấu cách thì "toi".
 
Lần chỉnh sửa cuối:
Tôi không rõ nguyên nhân cụ thể nhưng nhìn bằng mắt thì thấy code có vài chỗ chưa chuẩn.

Dòng ̣(A) có If Vung(I, 1) <> "" Then, tức ta lường được trường hợp ô trong cột "Thư" có thể rỗng. Tức ta cho phép cột "Thư" có dòng rỗng. Như thế thì code dòng (B) không chuẩn - khi nhập giá trị rỗng thứ 2 hoặc giá trị trùng với trước đó thì có lỗi. Nếu có > 2 dòng rỗng (trong tập tin ban đầu 2 ô rỗng giữa các ô có dữ liệu), hoặc > 2 ô có cùng giá trị (trong tập tin ban đầu 2 ô có giá trị "Hoi") thì tại (B) có "buuum".

Dòng (C) có If InStr(Gom, Vung(I, 1)) Then.
Nếu vd. Vung(I, 1) có dấu cách ở cuối (dữ liệu của bạn có như thế) vd. "NSJV-CP2-2014-0040 " mà Gom = "NSJV-CP2-2014-0040," thì không tìm thấy rồi. Nhưng chuyện dấu cách ở cuối quá tầm thường, không đáng để chỉ ra. Có điều là dữ liệu của bạn đa dạng.

Có "CS2-CP2-0739", và có cả "NSJV-CP2-2014-0011", tức 3 hoặc 4 (5, 6, 7, 8, 9) "khúc".

Vậy nếu bạn có vd. Gom = "NSJV-CP2-2014-0011," mà bạn muốn tìm Vung(I, 1) = ""NSJV-CP2-2014" thì rõ ràng kết quả sai rồi.

Dòng (D): nguyên tác là phải kiểm tra Kq. Thế nếu không có "liên kết" nào, tức Kq rỗng thì cũng Len, Right rồi đập xuống sheet???

Tóm lại phụ thuộc vào may rủi. Vd. nếu ô nhập và cột "Thư" đều có dấu cách ở cuối thì không sao. Nhưng nếu ô nhập không có dấu cách mà cột "Thư" có dấu cách thì "toi".

Nhờ bản chỉnh giúp code của concogia cho mình với nhé, mình vụ VBA này mới đang tập tẹ thôi không hiểu ý bạn lắm,

xin download file đính kèm,

Cám ơn bạn nhiều,
Khoi
 

File đính kèm

  • mpi.yvlc.search letters.xlsm
    48.5 KB · Đọc: 1
Nhờ bản chỉnh giúp code của concogia cho mình với nhé, mình vụ VBA này mới đang tập tẹ thôi không hiểu ý bạn lắm,

xin download file đính kèm,

Cám ơn bạn nhiều,
Khoi

Bạn nhờ tác giả chứ sao lại nhờ tôi?

Mà tôi có góp ý gì cho tác giả đâu? Không dám.

Tôi chỉ trả lời bạn, và muốn ý thức cho bạn những chỗ có thể có mìn để bạn lưu ý. Thế thôi
 
Đúng là mình cũng gặp các trường hợp như bạn mô tả, cũng đang học hỏi VBA nhưng chưa đủ khả năng chỉnh code này.
Mong bác concogia nghiên cứu ý của bạn siwtom để hoàn chỉnh đoạn code này nhé.

Thân,
Khoi
 
Tôi không rõ nguyên nhân cụ thể nhưng nhìn bằng mắt thì thấy code có vài chỗ chưa chuẩn.

Trích
Mã:
Gom = Target.Value
...
Vung = Range([A5], [A1000].End(xlUp)).Resize(, 2)
For I = 1 To UBound(Vung)
                    d.Add Vung(I, 1), Vung(I, 2)    (B)
Next I
...
For I = 1 To UBound(Vung)
                    If Vung(I, 1) <> "" Then    (A)
                        If InStr(Gom, Vung(I, 1)) Then    (C)
                            If d.Item(Vung(I, 1)) <> "" Then Tam = Tam & ", " & d.Item(Vung(I, 1)) '<--
                            Gom = Gom & ", " & d.Item(Vung(I, 1))
                            Vung(I, 1) = "": I = 0
                        End If
                     End If
Next I
...
Target.Offset(, 1) = Right(Kq, Len(Kq) - 2)        (D)

Dòng ̣(A) có If Vung(I, 1) <> "" Then, tức ta lường được trường hợp ô trong cột "Thư" có thể rỗng. Tức ta cho phép cột "Thư" có dòng rỗng. Như thế thì code dòng (B) không chuẩn - khi nhập giá trị rỗng thứ 2 hoặc giá trị trùng với trước đó thì có lỗi. Nếu có > 2 dòng rỗng (trong tập tin ban đầu 2 ô rỗng giữa các ô có dữ liệu), hoặc > 2 ô có cùng giá trị (trong tập tin ban đầu 2 ô có giá trị "Hoi") thì tại (B) có "buuum".

Dòng (C) có If InStr(Gom, Vung(I, 1)) Then.
Nếu vd. Vung(I, 1) có dấu cách ở cuối (dữ liệu của bạn có như thế) vd. "NSJV-CP2-2014-0040 " mà Gom = "NSJV-CP2-2014-0040," thì không tìm thấy rồi. Nhưng chuyện dấu cách ở cuối quá tầm thường, không đáng để chỉ ra. Có điều là dữ liệu của bạn đa dạng.

Có "CS2-CP2-0739", và có cả "NSJV-CP2-2014-0011", tức 3 hoặc 4 (5, 6, 7, 8, 9) "khúc".

Vậy nếu bạn có vd. Gom = "NSJV-CP2-2014-0011," mà bạn muốn tìm Vung(I, 1) = ""NSJV-CP2-2014" thì rõ ràng kết quả sai rồi.

Dòng (D): nguyên tác là phải kiểm tra Kq. Thế nếu không có "liên kết" nào, tức Kq rỗng thì cũng Len, Right rồi đập xuống sheet???

Tóm lại phụ thuộc vào may rủi. Vd. nếu ô nhập và cột "Thư" đều có dấu cách ở cuối thì không sao. Nhưng nếu ô nhập không có dấu cách mà cột "Thư" có dấu cách thì "toi".
Híc, khi viết bài này thật ra là muốn tìm cách giải thôi vì thấy dạng này hơi lạ, còn mấy cái này:
1)-
Dòng ̣(A) có If Vung(I, 1) <> "" Then, tức ta lường được trường hợp ô trong cột "Thư" có thể rỗng
Mình chẳng có lường gì cả, ban đầu ở cột "thu" đều lượm bỏ vào "Dic" hết (B), khi chạy vòng lặp, lấy Item của em nào thì xóa béng Key của em đó đi để khỏi lặp lại, nên khi chạy lại ( khi cho I=0 thì mảng "Vung" sẽ có em "" ta muốn cho qua nên sử dụng (A) có If Vung(I, 1) <> "" Then ==> thế thôi
2)- Về Instr mình biết và cũng đã nói nhiều về nhược điểm của nó trên diễn đàn rồi, nhìn thực tế dữ liệu trong bài mình mới dùng nó ( hình như mình có hỏi tác giả ngay từ bài đầu). Dĩ nhiên, nếu muốn chắc cú chỉ cần đưa dữ liệu về chung một số lượng ký tự (Len) hoặc tiếp tục một em "Dit- to" nữa.
3)-
nguyên tác là phải kiểm tra Kq. Thế nếu không có "liên kết" nào, tức Kq rỗng thì cũng Len, Right rồi đập xuống sheet???
Trong code có đoạn
If d.Item(Target.Value) = "" Or Not d.exists(Target.Value) Then Exit Sub
Tức là ngay từ khi chưa tìm kết quả của biến Tam ( biến Kq lấy dữ lệu của biến Tam) thì đã kiểm tra rồi, nếu Target không hiện hữu trong "Dic" thì thoát nên Kq luôn luôn không rỗng ==> không cần kiểm tra Kq
Nhưng, túm lại, mình làm bài này chủ yếu là tìm cách giải thôi, những cái khác sửa tý tẹo là xong. Híc
Thân
 
Híc, khi viết bài này thật ra là muốn tìm cách giải thôi vì thấy dạng này hơi lạ, còn mấy cái này:
1)-
Mình chẳng có lường gì cả, ban đầu ở cột "thu" đều lượm bỏ vào "Dic" hết (B), khi chạy vòng lặp, lấy Item của em nào thì xóa béng Key của em đó đi để khỏi lặp lại, nên khi chạy lại ( khi cho I=0 thì mảng "Vung" sẽ có em "" ta muốn cho qua nên sử dụng (A) có If Vung(I, 1) <> "" Then ==> thế thôi
2)- Về Instr mình biết và cũng đã nói nhiều về nhược điểm của nó trên diễn đàn rồi, nhìn thực tế dữ liệu trong bài mình mới dùng nó ( hình như mình có hỏi tác giả ngay từ bài đầu). Dĩ nhiên, nếu muốn chắc cú chỉ cần đưa dữ liệu về chung một số lượng ký tự (Len) hoặc tiếp tục một em "Dit- to" nữa.
3)-
Trong code có đoạn

Tức là ngay từ khi chưa tìm kết quả của biến Tam ( biến Kq lấy dữ lệu của biến Tam) thì đã kiểm tra rồi, nếu Target không hiện hữu trong "Dic" thì thoát nên Kq luôn luôn không rỗng ==> không cần kiểm tra Kq
Nhưng, túm lại, mình làm bài này chủ yếu là tìm cách giải thôi, những cái khác sửa tý tẹo là xong. Híc
Thân

Tôi có góp ý cho bạn đâu?

Mỗi một định lý trong Toán học chỉ đúng cho một số trường hợp. Nói cách khác mỗi một định lý chỉ đúng với cái giả thiết cụ thể. Bao giờ cũng có giả thiết: "Nếu hàm f(x) liên tục trong khoảng ..."

Tôi không dám nói là code sai vì tôi không biết giả thiết dữ liệu đầu vào của bạn thế nào. Tôi chỉ nói là chưa chuẩn, và do bạn không phát biểu những yêu cầu phải có về dữ liệu đầu vào nên tôi ý thức cho chủ chủ đề là: "nếu dữ liệu thế này, thế này" thì code sẽ có lỗi.

Tôi ý thức, tôi cảnh báo chủ chủ đề vd. là nếu vùng dữ liệu có > 2 ô rỗng (vì chủ chủ đề có như thế) hoặc > 2 ô cùng giá trị (vì chủ chủ đề có như thế) thì code

Mã:
For I = 1 To UBound(Vung)
                    d.Add Vung(I, 1), Vung(I, 2)    (B)
Next I

sẽ có lỗi, vì không thể có 2 Key như nhau được.

Ý thức cho người ta để người ta tránh, người ta lưu ý thôi. Ngay tôi nếu có sơ xuất gì thì ít ra tôi cũng muốn ai đó nếu phát hiện ra thì cảnh báo cho người hỏi biết. Tôi không góp ý cho bạn đâu.
 
Cám ơn các bạn,

Như vậy dữ liệu của mình sẽ tránh cách trường hợp: Không để hai giá trị rỗng và có nhiều hơn 2 giá trị trùng nhau trong cột A.

Thanks
Khoi
 
Web KT
Back
Top Bottom