Tách chuỗi dữ liệu này như thế nào đây mọi người ơi

Liên hệ QC
Anh ơi, nếu dùng Text to column thì chỉ tách được 1 số ký tự thôi.nếu tách được cùng 1 lúc mà dùng cách Anh nói, gửi file cho em xem với.
Tách được ra thành xã và thôn chứ cô chứ đâu chỉ tách ký tự
Tách xã và thôn được ngăn cách nhau bằng dấu -
Chọn dấu - trong mục Other của mục Delimiters đó
Cô làm thử đi!
Nhưng không biết linhvn_vpc muốn như vậy không nữa? hii
 
Tách được ra thành xã và thôn chứ cô chứ đâu chỉ tách ký tự
Tách xã và thôn được ngăn cách nhau bằng dấu -
Chọn dấu - trong mục Other của mục Delimiters đó
Cô làm thử đi!
Nhưng không biết linhvn_vpc muốn như vậy không nữa? hii

Anh ơi??? tách kí tự xã và thôn nhưng trong dữ liệu ở file ấy thì có dấu - và dấu , đó nên em mới không tách được +-+-+-+
 
Em nhờ các bác giúp, từ một địa danh chung chung, xây dựng hàm tách ra thôn, xã. Danh mục thôn xã đã có sẵn và chỉ tách những địa danh có trong danh mục thôi. địa danh gõ không có quy định nào cả, miễn là tìm được xã và thôn trong đó. Em nghĩ mãi không được!
File em đính kèm. Nếu không đúng chủ để mong BQT thông cảm!
thông thường dữ liệu chuẩn thì quá dễ. còn dữ liệu của bạn chắc tôi thua vì không đủ kiên nhẫnẹc ẹc
 
Em nhờ các bác giúp, từ một địa danh chung chung, xây dựng hàm tách ra thôn, xã. Danh mục thôn xã đã có sẵn và chỉ tách những địa danh có trong danh mục thôi. địa danh gõ không có quy định nào cả, miễn là tìm được xã và thôn trong đó. Em nghĩ mãi không được!
File em đính kèm. Nếu không đúng chủ để mong BQT thông cảm!
Làm đại cho bạn, trúng thì tốt không trúng thì thôi vì không hiểu rõ và dữ liệu cũng kỳ quá
 

File đính kèm

  • tach thon va xa.rar
    14 KB · Đọc: 14
bác quanghai1960 lam chưa đúng ý em rồi. Nếu chỉ dựa vào dấu "," hoặc "-" để tách ra như bác thì thôn và xã đâu có nằm trong danh mục và yêu cầu như vậy thì đơn giản quá. Nếu có dữ liệu chuẩn thì lại không phải nghĩ ra việc này rồi. Ý em ở đây là nhờ các bác xây dựng giúp em 2 hàm. Hàm 1 tìm ra được xã dựa vào địa danh, hàm 2 tìm ra được thôn trong xã đó, dựa vào danh mục thôn và xã cũng như địa danh.
 
bác quanghai1960 lam chưa đúng ý em rồi. Nếu chỉ dựa vào dấu "," hoặc "-" để tách ra như bác thì thôn và xã đâu có nằm trong danh mục và yêu cầu như vậy thì đơn giản quá. Nếu có dữ liệu chuẩn thì lại không phải nghĩ ra việc này rồi. Ý em ở đây là nhờ các bác xây dựng giúp em 2 hàm. Hàm 1 tìm ra được xã dựa vào địa danh, hàm 2 tìm ra được thôn trong xã đó, dựa vào danh mục thôn và xã cũng như địa danh.
Nếu là mình thì mình sẽ kèm theo kết quả tạm trong file, diễn giải bằng từ ngữ thì ai viết người đó hiểu. Yêu cầu là tách ra thì mình tách ra rồi bảo là không đúng, bạn có yêu cầu tìm cái nào trong cái nào đâu.
 
Lần chỉnh sửa cuối:
Nếu là mình thì mình sẽ kèm theo kết quả tạm trong file, diễn giải bằng từ ngữ thì ai viết người đó hiểu. Yêu cầu là tách ra thì mình tách ra rồi bảo là không đúng, bạn có yêu cầu tìm cái nào trong cái nào đâu.
Thực sự, yêu cầu này làm trong cel thì em chưa làm được. Em chỉ nhập một vài kết quả để bác thấy và giúp em. Đầu tiên phải tìm ra xã trước bằng cách tìm trong địa danh có chứa xã nào trong danh mục. Sau đó tìm ra thôn trong xã đó nếu địa danh có chứa thôn của xã đó.
Trong sql thì em dùng hàm like, trong cel thì hàm like không làm được.
Mong bác giúp!
 

File đính kèm

  • tach thon va xa.xls
    59 KB · Đọc: 13
Xã:
Mã:
=INDEX('Danh mục thôn xã'!B$1:B$500,MIN(IF(ISNUMBER(SEARCH('Danh mục thôn xã'!B$1:B$500,'yêu cầu'!$A2)),ROW(INDIRECT("1:"&ROWS('Danh mục thôn xã'!B$1:B$500))),"")))
Thôn:
Mã:
=INDEX('Danh mục thôn xã'!A$1:A$500,MIN(IF(ISNUMBER(SEARCH('Danh mục thôn xã'!A$1:A$500,'yêu cầu'!$A2)),ROW(INDIRECT("1:"&ROWS('Danh mục thôn xã'!A$1:A$500))),"")))
Cả hai kết thúc bằng Ctrl-Shift-Enter
 

File đính kèm

  • tach thon va xa(1).xls
    69 KB · Đọc: 8
Thực sự, yêu cầu này làm trong cel thì em chưa làm được. Em chỉ nhập một vài kết quả để bác thấy và giúp em. Đầu tiên phải tìm ra xã trước bằng cách tìm trong địa danh có chứa xã nào trong danh mục. Sau đó tìm ra thôn trong xã đó nếu địa danh có chứa thôn của xã đó.
Trong sql thì em dùng hàm like, trong cel thì hàm like không làm được.
Mong bác giúp!
Bạn muốn thế này phải không
PHP:
Sub tach()
Dim dl(), i As Long, tim As Object
Range([A2], [a65536].End(3)).Copy [B2:C2]
dl = Range([b2], [C65536].End(3)).Value
With CreateObject("Vbscript.Regexp")
   .Global = True
   .Pattern = "-.*|,.*"
   For i = 1 To UBound(dl)
      dl(i, 2) = Trim(.Replace(dl(i, 2), ""))
      Set tim = Sheet2.[a:a].Find(dl(i, 2), , , xlWhole)
      If tim Is Nothing Then dl(i, 2) = ""
   Next
   .Pattern = ".*-|.*,|TT"
   For i = 1 To UBound(dl)
      dl(i, 1) = Trim(.Replace(dl(i, 1), ""))
   Next
End With
[b2].Resize(i - 1, 2) = dl
End Sub

PS: Trúng hay trật cũng la lên cái nha
 

File đính kèm

  • tach thon va xa-1.rar
    18.8 KB · Đọc: 14
Lần chỉnh sửa cuối:
hihi, cho hàm em còn làm theo được, cho 1 đoạn code có dễ thì cũng không biết chạy thế nào +-+-+-+, nói nhiều học thôi !$@!!!$@!!
 
Bạn muốn thế này phải không
PHP:
Sub tach()
Dim dl(), i As Long, tim As Object
Range([A2], [a65536].End(3)).Copy [B2:C2]
dl = Range([b2], [C65536].End(3)).Value
With CreateObject("Vbscript.Regexp")
   .Global = True
   .Pattern = "-.*|,.*"
   For i = 1 To UBound(dl)
      dl(i, 2) = Trim(.Replace(dl(i, 2), ""))
      Set tim = Sheet2.[a:a].Find(dl(i, 2), , , xlWhole)
      If tim Is Nothing Then dl(i, 2) = ""
   Next
   .Pattern = ".*-|.*,|TT"
   For i = 1 To UBound(dl)
      dl(i, 1) = Trim(.Replace(dl(i, 1), ""))
   Next
End With
[b2].Resize(i - 1, 2) = dl
End Sub

PS: Trúng hay trật cũng la lên cái nha

Trật là chắc rồi. Ta xét dòng 32 là "XN Thuỷ nông - Móng Cầu - Thái Hòa"
code
Mã:
For i = 1 To UBound(dl)
      dl(i, 2) = Trim(.Replace(dl(i, 2), ""))
      Set tim = Sheet2.[a:a].Find(dl(i, 2), , , xlWhole)
      If tim Is Nothing Then dl(i, 2) = ""
   Next
Tôi hiểu là tìm thôn. Nhưng khi code thực hiện xong dòng dl(i, 2) = Trim(.Replace(dl(i, 2), ""))
thì dl(i, 2) = "XN Thuỷ nông", tức tiếp theo "tim = Nothing", và dl(i, 2) = "" --> không tìm thấy thôn. Trong khi đó thôn chính là "Móng Cầu"
-------------
Bạn chủ đề tài nên miêu tả dữ liệu. Tôi không thích trò đoán mò vì đã đoán thì xác suất trúng không bao giờ là 1.
Dữ liệu của bạn:
1. Xã luôn là cuối cùng? Sau xã không có "tỉnh" hay bất cứ cái gì? Vd. "khu tự trị" hay tương tự?
2. Trước xã bao giờ cũng là thôn, không có gì xen kẽ (trừ các ký tự là "-", ",". Đã hết chưa hay còn những ký tự khác?) giữa chúng?
Tóm lại dữ liệu là: "(cac ký tự bất kỳ)(ký tự phân cách - là gì?)THÔN(các ký tự phân cách - là gì?)XÃ"?
 
Bạn thử cái này, (mặc dù tốc độ không tốt nhưng dữ liệu của bạn ...lung tung quá)
Mã:
Sub tach()
Dim Arr, ArrXaThon
Dim i, j, eR As Integer


Arr = Sheet2.Range("A1:B" & Sheet2.[b65536].End(xlUp).Row)
eR = Sheet1.[A65536].End(xlUp).Row
ReDim ArrXaThon(1 To eR, 1 To 2)


For i = 1 To eR
    For j = 1 To UBound(Arr, 1)
        If InStr(1, Sheet1.Cells(i, 1), Arr(j, 2)) > 0 Then
            If InStr(1, Sheet1.Cells(i, 1), Arr(j, 1)) > 0 Then
                ArrXaThon(i, 1) = Arr(j, 1)
                ArrXaThon(i, 2) = Arr(j, 2)
            Else
                ArrXaThon(i, 2) = Arr(j, 2)
            End If
        End If
    Next
Next


    Sheet1.[e1].Resize(UBound(ArrXaThon, 1), 2) = ArrXaThon
End Sub
 

File đính kèm

  • tach thon va xa.zip
    19.8 KB · Đọc: 3
Bạn thử cái này, (mặc dù tốc độ không tốt nhưng dữ liệu của bạn ...lung tung quá)
Mã:
Sub tach()
Dim Arr, ArrXaThon
Dim i, j, eR As Integer


Arr = Sheet2.Range("A1:B" & Sheet2.[b65536].End(xlUp).Row)
eR = Sheet1.[A65536].End(xlUp).Row
ReDim ArrXaThon(1 To eR, 1 To 2)


For i = 1 To eR
    For j = 1 To UBound(Arr, 1)
        If InStr(1, Sheet1.Cells(i, 1), Arr(j, 2)) > 0 Then
            If InStr(1, Sheet1.Cells(i, 1), Arr(j, 1)) > 0 Then
                ArrXaThon(i, 1) = Arr(j, 1)
                ArrXaThon(i, 2) = Arr(j, 2)
            Else
                ArrXaThon(i, 2) = Arr(j, 2)
            End If
        End If
    Next
Next


    Sheet1.[e1].Resize(UBound(ArrXaThon, 1), 2) = ArrXaThon
End Sub

Tôi thử "bịa" ra dữ liệu. Tôi cho dữ liệu cụ thể, ở dòng cụ thể để việc xét ngắn gọn.
Giả sử ở đâu đó trong VN yêu quí có thôn "Tiến Lên", và ở đâu đó trong VN yêu quí có xã "Tiến Lên"
Trong cột Thôn có "Tiến Lên" ở dòng k, trong cột Xã có "Chiến Thắng" ở dòng k và cả "Tiến Lên" ở dòng n > k. Ở cột Thôn ở dòng n giả sử có "Thành Công". Tức:
dòng k: "Tiến Lên", "Chiến Thắng"
dòng n: "Thành Công", "Tiến Lên"
Và ta có dòng dữ liệu ở dòng i: "Công ty TNHH abc - Tiến Lên - Chiến Thắng"
-----------
Với j = k thì Arr(j, 2) = Arr(k, 2) = "Chiến Thắng", tức đk của
If InStr(1, Sheet1.Cells(i, 1), Arr(j, 2)) > 0 Then
thỏa
Vậy code sau được thực hiện:

Mã:
If InStr(1, Sheet1.Cells(i, 1), Arr(j, 1)) > 0 Then
                ArrXaThon(i, 1) = Arr(j, 1)
                ArrXaThon(i, 2) = Arr(j, 2)
Else
                ArrXaThon(i, 2) = Arr(j, 2)
End If

Do có Arr(j, 1) = Arr(k, 1) = "Tiến Lên" nên đk của
If InStr(1, Sheet1.Cells(i, 1), Arr(j, 1)) > 0 Then (chú ý là j = k)
thỏa, tức kết quả ta có:

ArrXaThon(i, 1) = Arr(j, 1) = Arr(k, 1) = "Tiến Lên"
ArrXaThon(i, 2) = Arr(j, 2) = Arr(k, 2) = "Chiến Thắng"

Nhưng vòng lặp (vòng lặp trong) vẫn được thực hiện. Khi vòng lặp chạy tới j = n thì

Arr(j, 2) = Arr(n, 2) = "Tiến Lên" nên đk của
If InStr(1, Sheet1.Cells(i, 1), Arr(j, 2)) > 0 Then
thỏa
Vậy code sau được thực hiện:

Mã:
If InStr(1, Sheet1.Cells(i, 1), Arr(j, 1)) > 0 Then
                ArrXaThon(i, 1) = Arr(j, 1)
                ArrXaThon(i, 2) = Arr(j, 2)
Else
                ArrXaThon(i, 2) = Arr(j, 2)
End If

Do có Arr(j, 1) = Arr(n, 1) = "Thành Công" (không có trong dòng dữ liệu i) nên ta chỉ có:

ArrXaThon(i, 2) = Arr(j, 2) = Arr(n, 2) = "Tiến Lên"

Sau khi vòng lặp trong kết thúc thì ta có:

ArrXaThon(i, 1) = "Tiến Lên"
ArrXaThon(i, 2) = "Tiến Lên"

Rõ ràng kết quả sai vì với dòng dữ liệu "Công ty TNHH abc - Tiến Lên - Chiến Thắng" thì Xã = "Chiến Thắng"

Nếu bạn sửa thành: sau khi tìm được thì ra khỏi vòng lặp (Exit For) thì tôi đảo lại dữ liệu:

dòng k: "Tiến Lên", "Tiến Lên"
dòng n: "Thành Công", "Chiến Thắng"

thì sau khi thực hiện vòng thứ k thì ta có:

ArrXaThon(i, 1) = "Tiến Lên"
ArrXaThon(i, 2) = "Tiến Lên"

Và ra khỏi vòng lặp.
Cũng sai.
 
Mình thấy code thế này ổn nè, các bạn test xem. Nhưng nếu đúng như anh Siwtom phân tích thì sẽ chả có code nào đúng nổi đâu. Hic, bài này cũng vui chứ.
PHP:
Sub tach()
Dim dl1(), dl2(), kq(), i As Long, j As Long
dl1 = Sheet1.Range(Sheet1.[a2], Sheet1.[A65536].End(3)).Value
dl2 = Sheet2.Range(Sheet2.[a2], Sheet2.[b65536].End(3)).Value
ReDim kq(1 To UBound(dl1), 1 To 2)
For j = 1 To UBound(dl1)
   For i = 1 To UBound(dl2)
      If InStr(dl1(j, 1), dl2(i, 2)) Then
         kq(j, 1) = dl2(i, 2)
         Exit For
      End If
   Next
   For i = 1 To UBound(dl2)
      If InStr(dl1(j, 1), dl2(i, 1)) Then
         kq(j, 2) = dl2(i, 1)
         Exit For
      End If
   Next
Next
Sheet1.[B2].Resize(j - 1, 2) = kq
End Sub
 

File đính kèm

  • tach thon va xa-1.rar
    18.1 KB · Đọc: 5
Lần chỉnh sửa cuối:
Phân tích của bác Siwtom hay quá, quả là khi có những trường hợp đặc biệt (tên xã = tên thôn) thì khi dùng Instr cho Arr(j,1) hay Arr(j,2) cũng đều cho kết quả nếu chuỗi có ký tự đó, dẫn tới sai.
Vậy nếu cho so sánh cả 2 Thôn và Xã cùng 1 lúc thì có được không ạ?
Mã:
Sub tach()
Dim Arr, ArrXaThon
Dim i, j, eR As Integer


Arr = Sheet2.Range("A2:B" & Sheet2.[b65536].End(xlUp).Row)
eR = Sheet1.[A65536].End(xlUp).Row
ReDim ArrXaThon(1 To eR, 1 To 2)


For i = 2 To eR
    For j = 1 To UBound(Arr, 1)
        If InStr(1, Sheet1.Cells(i, 1), Arr(j, 2)) > 0 And InStr(1, Sheet1.Cells(i, 1), Arr(j, 1)) > 0 Then
                ArrXaThon(i, 1) = Arr(j, 1)
                ArrXaThon(i, 2) = Arr(j, 2)
                Exit For
            ElseIf InStr(1, Sheet1.Cells(i, 1), Arr(j, 2)) > 0 Then
                ArrXaThon(i, 2) = Arr(j, 2)
            End If
    Next
Next
    Sheet1.[c1].Resize(UBound(ArrXaThon, 1), 2) = ArrXaThon
End Sub

(Bài bác QuangHai hình như cũng có vấn đề khi dữ liệu trùng nhau, bác kiểm tra lại xem)
 
Thôi hỏng chơi với bài này nữa, nhức đầu quá rồi. Khó quá là mình bỏ cuộc thôi
 
Mình thấy code thế này ổn nè, các bạn test xem. Nhưng nếu đúng như anh Siwtom phân tích thì sẽ chả có code nào đúng nổi đâu. Hic, bài này cũng vui chứ.
PHP:
Sub tach()
Dim dl1(), dl2(), kq(), i As Long, j As Long
dl1 = Sheet1.Range(Sheet1.[a2], Sheet1.[A65536].End(3)).Value
dl2 = Sheet2.Range(Sheet2.[a2], Sheet2.[b65536].End(3)).Value
ReDim kq(1 To UBound(dl1), 1 To 2)
For j = 1 To UBound(dl1)
   For i = 1 To UBound(dl2)
      If InStr(dl1(j, 1), dl2(i, 2)) Then
         kq(j, 1) = dl2(i, 2)
         Exit For
      End If
   Next
   For i = 1 To UBound(dl2)
      If InStr(dl1(j, 1), dl2(i, 1)) Then
         kq(j, 2) = dl2(i, 1)
         Exit For
      End If
   Next
Next
Sheet1.[B2].Resize(j - 1, 2) = kq
End Sub

Cái này thì cũng như code của dhn46 thôi. Tôi phân tích chắc các bạn không đọc.
Tôi nghĩ là ở VN ở đâu đó có Thôn "Tiến Lên", và đâu đó có Xã "Tiến Lên". Và lúc đó code dùng InStr sẽ tìm được vd. "Tiến Lên" nếu nó nằm trên "Chiến Thắng", và vòng lặp kết thúc. Nhưng không có nghĩa là Xã "Tiến Lên" đã chắc đúng với dữ liệu cụ thể.
--------------
Bạn hãy thử với dữ liệu này:
1. Ở sheet "yêu cầu" chỉ có dòng 2 = Công ty TNHH abc - Tiến Lên - Chiến Thắng
Các dòng khác xóa hết cho gọn.
2. Ở sheet "Danh mục thôn xã" thêm 2 dòng, tức
dòng 2 = Tiến Lên (thôn) + Tiến Lên (xã)
dòng 3 = Thành Công (thôn) + Chiến Thắng (xã)
Bây giờ bạn thử code của mình xem. Đảm bảo ra kết quả: Thôn = Tiến Lên, Xã = Tiến Lên
 
Cái này thì cũng như code của dhn46 thôi. Tôi phân tích chắc các bạn không đọc.
Tôi nghĩ là ở VN ở đâu đó có Thôn "Tiến Lên", và đâu đó có Xã "Tiến Lên". Và lúc đó code dùng InStr sẽ tìm được vd. "Tiến Lên" nếu nó nằm trên "Chiến Thắng", và vòng lặp kết thúc. Nhưng không có nghĩa là Xã "Tiến Lên" đã chắc đúng với dữ liệu cụ thể.
--------------
Bạn hãy thử với dữ liệu này:
1. Ở sheet "yêu cầu" chỉ có dòng 2 = Công ty TNHH abc - Tiến Lên - Chiến Thắng
Các dòng khác xóa hết cho gọn.
2. Ở sheet "Danh mục thôn xã" thêm 2 dòng, tức
dòng 2 = Tiến Lên (thôn) + Tiến Lên (xã)
dòng 3 = Thành Công (thôn) + Chiến Thắng (xã)
Bây giờ bạn thử code của mình xem. Đảm bảo ra kết quả: Thôn = Tiến Lên, Xã = Tiến Lên

Em có đọc phân tích của anh nên mới đầu hàng bài này vì cơ hội hoàn chỉnh code cho bài này đối với em là không tưởng rồi
Bởi vậy em mới nói là nếu đúng như anh siwtom phân tích thì khó có code nào đúng nổi mà
 
Lần chỉnh sửa cuối:
Em có đọc phân tích của anh nên mới đầu hàng bài này vì cơ hội hoàn chỉnh code cho bài này đối với em là không tưởng rồi
Bởi vậy em mới nói là nếu đúng như anh siwtom phân tích thì khó có code nào đúng nổi mà

Tôi nghĩ bài #50 của bạn, tức dùng RegExp + Find, là cũng được rồi. Chỉ cần sửa lại chút ít. Tức phải tách được Thôn để Find, và tách được Xã để Find.
Tất nhiên tôi không tham gia cho tới khi chủ đề tài miêu tả dữ liệu (Xã ở cuối, sau nó không có gì cả? Thôn ở ngay trước Xã?)
 
Web KT
Back
Top Bottom