Nhờ giúp công thức điều kiện tách chuỗi !!!

Liên hệ QC

nguyenanhdung8111982

Thành viên hoạt động
Tham gia
1/11/19
Bài viết
120
Được thích
33
Giới tính
Nam
Em có cột A(Building), và các cột kết quả mong muốn: B(Address) ,C(To_KhuPho),D(streetname),E(ward),F(District)ưuDữwith condition:
với điều kiện là ngăn cách dấu , " Khu Phố", "Tổ ,Khu Phố "=>cột C.
"Đường","Quốc Lộ"=>cột D.
"Phường"=>Cột E.
"Thành Phố","Quận","Huyện" Cột F.

BuildingAddressTo_khuPhoStreetnameWardDistrict
85/18A, Khu Phố 8, Đường Số 38, Phường Hiệp Bình Chánh, Thành Phố Thủ Đức85/18AKhu Phố 8Đường Số 38Phường Hiệp Bình ChánhThành Phố Thủ Đức
386, Đường Võ Văn Ngân, Phường Bình Thọ, Thành Phố Thủ Đức386Đường Võ Văn NgânPhường Bình ThọThành Phố Thủ Đức
82/40/2B, Khu Phố 6, Thành Phố Thủ Đức82/40/2BKhu Phố 6Thành Phố Thủ Đức
18A, Đường Số 41, Khu Phố 7, Thành Phố Thủ Đức18AKhu Phố 7Đường Số 41Thành Phố Thủ Đức
01, Đường Song Hành Hà Nội, Khu Phố 6, PhườngTrường Thọ, Thành Phố Thủ Đức01Đường Song Hành Hà NộiPhườngTrường ThọThành Phố Thủ Đức
Tổ 9 Khu Phố 6Tổ 9 Khu Phố 6
32, Đường 5, Khu Phố 5, Phường Hiệp Bình Chánh, Thành Phố Thủ Đức32Đường 5Phường Hiệp Bình ChánhThành Phố Thủ Đức
14, Khu Phố 3, Quận 1, Tổ 314Tổ 3 Khu Phố 3Quận 1
33/2, Đường Số 11, Huyện Bình Chánh, Khu Phố 3, Tổ 133/2Tổ 1 Khu Phố 3Đường Số 11Huyện Bình Chánh
177/1/7, Đường Lũy Bán Bích, Tổ 38, Khu phố 3177/1/7Tổ 38 Khu Phố 3Đường Lũy Bán Bích
109, Đường Ỷ LAN, Tổ 4, Khu Phố 1109Tổ 4 Khu Phố 1Đường Ỷ LAN

em có thấy có code vba split như dưới. Nhờ anh chị viết giùm công thức điều kiện VBA để tách như mong muốn.
Mã:
Sub splitText()
'splits Text active cell using ALT+44 char as separator
Dim splitVals As Variant, totalVals As Long, i As Long, Lr As Long, R As Long, J As Long
'Find Lastrow at Column A (have Dat with in)
R = Selection.Row
J = Selection.Column
Lr = R + Selection.Rows.Count - 1
For i = R To Lr
'Range(ActiveCell, ActiveCell.End(xlDown)).Select
splitVals = Split(Cells(i, J).Value, Chr(44))
totalVals = UBound(splitVals)
Range(Cells(i, J + 1), Cells(i, J + 1 + totalVals)).Value = splitVals
Next i
End Sub
Cám ơn!!!
 

File đính kèm

  • test.xlsx
    11.3 KB · Đọc: 5
Tiếng Tây ở đâu lạ vậy?
Cột đầu đúng phải là Address. Cột thứ nhì đáng lẽ là Unit/Street Number
 
Cần phải có một danh sách dịch các từ tương đương. Ví dụ: Đường tương đương với Hương Lộ, Quốc Lộ; Quận tương đương với Huyện,...
Nói cách khác, Đường, Quốc lộ, Hương Lộ là cách nhận định tên đường. Quận, Huyện là cách nhận định District.

Tuy nhiên, làm thế nào để biết "Thành Phố Thủ Đức" là District, trong khi "Thành Phố HCM" không phải thì tôi chịu thua.
 
Cần phải có một danh sách dịch các từ tương đương. Ví dụ: Đường tương đương với Hương Lộ, Quốc Lộ; Quận tương đương với Huyện,...
Nói cách khác, Đường, Quốc lộ, Hương Lộ là cách nhận định tên đường. Quận, Huyện là cách nhận định District.

Tuy nhiên, làm thế nào để biết "Thành Phố Thủ Đức" là District, trong khi "Thành Phố HCM" không phải thì tôi chịu thua.
Nó chỉ có duy nhất Thành phố thủ đức nằm trong quận huyện thôi anh, còn lại đều là quận, huyện. không có tên tỉnh thành phố trong này như: Thành Phố Hồ Chí Minh, Thành Phố Đà Nẵng v.v...
 
Em có cột A(Building), và các cột kết quả mong muốn: B(Address) ,C(To_KhuPho),D(streetname),E(ward),F(District)ưuDữwith condition:
với điều kiện là ngăn cách dấu , " Khu Phố", "Tổ ,Khu Phố "=>cột C.
"Đường","Quốc Lộ"=>cột D.
"Phường"=>Cột E.
"Thành Phố","Quận","Huyện" Cột F.

BuildingAddressTo_khuPhoStreetnameWardDistrict
85/18A, Khu Phố 8, Đường Số 38, Phường Hiệp Bình Chánh, Thành Phố Thủ Đức85/18AKhu Phố 8Đường Số 38Phường Hiệp Bình ChánhThành Phố Thủ Đức
386, Đường Võ Văn Ngân, Phường Bình Thọ, Thành Phố Thủ Đức386Đường Võ Văn NgânPhường Bình ThọThành Phố Thủ Đức
82/40/2B, Khu Phố 6, Thành Phố Thủ Đức82/40/2BKhu Phố 6Thành Phố Thủ Đức
18A, Đường Số 41, Khu Phố 7, Thành Phố Thủ Đức18AKhu Phố 7Đường Số 41Thành Phố Thủ Đức
01, Đường Song Hành Hà Nội, Khu Phố 6, PhườngTrường Thọ, Thành Phố Thủ Đức01Đường Song Hành Hà NộiPhườngTrường ThọThành Phố Thủ Đức
Tổ 9 Khu Phố 6Tổ 9 Khu Phố 6
32, Đường 5, Khu Phố 5, Phường Hiệp Bình Chánh, Thành Phố Thủ Đức32Đường 5Phường Hiệp Bình ChánhThành Phố Thủ Đức
14, Khu Phố 3, Quận 1, Tổ 314Tổ 3 Khu Phố 3Quận 1
33/2, Đường Số 11, Huyện Bình Chánh, Khu Phố 3, Tổ 133/2Tổ 1 Khu Phố 3Đường Số 11Huyện Bình Chánh
177/1/7, Đường Lũy Bán Bích, Tổ 38, Khu phố 3177/1/7Tổ 38 Khu Phố 3Đường Lũy Bán Bích
109, Đường Ỷ LAN, Tổ 4, Khu Phố 1109Tổ 4 Khu Phố 1Đường Ỷ LAN

em có thấy có code vba split như dưới. Nhờ anh chị viết giùm công thức điều kiện VBA để tách như mong muốn.
Mã:
Sub splitText()
'splits Text active cell using ALT+44 char as separator
Dim splitVals As Variant, totalVals As Long, i As Long, Lr As Long, R As Long, J As Long
'Find Lastrow at Column A (have Dat with in)
R = Selection.Row
J = Selection.Column
Lr = R + Selection.Rows.Count - 1
For i = R To Lr
'Range(ActiveCell, ActiveCell.End(xlDown)).Select
splitVals = Split(Cells(i, J).Value, Chr(44))
totalVals = UBound(splitVals)
Range(Cells(i, J + 1), Cells(i, J + 1 + totalVals)).Value = splitVals
Next i
End Sub
Cám ơn!!!
nếu vẫn quan tâm, thì hãy thử một lần xem.
Dùng một bảng tra (vùng P2:Q12) để tìm số cột.
Mã:
Sub Tach()
Dim i&, j&, Lr&, t&, k&, R&, C&, D&
Dim Arr(), KQ, Temp
With Sheets("Sheet2")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
Arr = .Range("A2:A" & Lr).Value
DDANH = .Range("P2:Q12").Value
R = UBound(Arr): D = UBound(DDANH)
ReDim KQ(1 To R, 1 To 6)
For i = 1 To R
    Temp = Split(Arr(i, 1), ",")
    C = UBound(Temp)
    For j = 0 To C
        If IsNumeric(Left(Temp(j), 1)) Then KQ(i, 1) = Temp(j)
            If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j)
                For k = 3 To D
                    If k < 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, 2) = KQ(i, 2) & Temp(j)
                    If k = 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(5, 1)) & "*") Then KQ(i, 3) = Temp(j)
                    If k > 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, DDANH(k, 2)) = Temp(j)
                Next k
   Next j
Next i
.Range("H2").Resize(R, 6) = KQ
End With
End Sub
Hãy thêm dữ liệu (có cả xã , thôn, xóm, huyện quận, tỉnh thành) nữa nhé.
 

File đính kèm

  • testTACH.xlsm
    21.1 KB · Đọc: 9
nếu vẫn quan tâm, thì hãy thử một lần xem.
Dùng một bảng tra (vùng P2:Q12) để tìm số cột.
Mã:
Sub Tach()
Dim i&, j&, Lr&, t&, k&, R&, C&, D&
Dim Arr(), KQ, Temp
With Sheets("Sheet2")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
Arr = .Range("A2:A" & Lr).Value
DDANH = .Range("P2:Q12").Value
R = UBound(Arr): D = UBound(DDANH)
ReDim KQ(1 To R, 1 To 6)
For i = 1 To R
    Temp = Split(Arr(i, 1), ",")
    C = UBound(Temp)
    For j = 0 To C
        If IsNumeric(Left(Temp(j), 1)) Then KQ(i, 1) = Temp(j)
            If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j)
                For k = 3 To D
                    If k < 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, 2) = KQ(i, 2) & Temp(j)
                    If k = 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(5, 1)) & "*") Then KQ(i, 3) = Temp(j)
                    If k > 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, DDANH(k, 2)) = Temp(j)
                Next k
   Next j
Next i
.Range("H2").Resize(R, 6) = KQ
End With
End Sub
Hãy thêm dữ liệu (có cả xã , thôn, xóm, huyện quận, tỉnh thành) nữa nhé.
Cám ơn bạn nhiều!!! Tuyệt vời!!!
 
Mình thấy những dòng có khu phố nó bị mất khu phố
View attachment 268496
Bạn thay lại dòng code này trong Sub Tach của modul 1
If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j)
For k = 3 To D
If k < 5.....
........
Thành
If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j)
For k = 2 To D
If k < 5.....
.....
(số 3 thành số 2)
Xin lỗi tôi nhầm, không test kỹ.
 
Ai nhập dữ liệu địa chỉ kiểu: Tổ, khu phố sau quận huyện, thành phố vậy bạn?

.
nhập không đúng nên mới cần làm lại cho đúng định dạng, mà file nhiều cái nó lộn xộn lắm.
Bài đã được tự động gộp:

Bạn thay lại dòng code này trong Sub Tach của modul 1
If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j)
For k = 3 To D
If k < 5.....
........
Thành
If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j)
For k = 2 To D
If k < 5.....
.....
(số 3 thành số 2)
Xin lỗi tôi nhầm, không test kỹ.
Cám ơn bạn nhiều!!!
 
nhập không đúng nên mới cần làm lại cho đúng định dạng, mà file nhiều cái nó lộn xộn lắm.
Bài đã được tự động gộp:


Cám ơn bạn nhiều!!!

Bạn thay lại dòng code này trong Sub Tach của modul 1
If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j)
For k = 3 To D
If k < 5.....
........
Thành
If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j)
For k = 2 To D
If k < 5.....
.....
(số 3 thành số 2)
Xin lỗi tôi nhầm, không test kỹ.
Bạn ơi cho mình hỏi thêm xíu mình có thể đảo những dòng có chữ Khu Phố đứng trước ra sau chữ Tổ được không. Ví dụ dòng mình to khung đỏ. Khu phố 3 tổ 3 đảo thành Tổ 3 Khu Phố 3
1635657014585.png

Cám ơn bạn!!!
 
Lần chỉnh sửa cuối:
Bạn ơi cho mình hỏi thêm xíu mình có thể đảo những dòng có chữ Khu Phố đứng trước ra sau chữ Tổ được không. Ví dụ dòng mình to khung đỏ. Khu phố 3 tổ 3 đảo thành Tổ 3 Khu Phố 3
View attachment 268506

Cám ơn bạn!!!
Bạn sửa lại code 1 tý nữa. Từ giờ bạn có thể đánh lộn xộn, Tỉnh, huyện, Đường, khu, thôn, xóm, tổ... thì code vẫn sắp đúng cho bạn.
Mã:
Sub Tach()
Dim i&, j&, Lr&, t&, k&, R&, C&, D&
Dim Arr(), KQ, Temp
With Sheets("Sheet2")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
Arr = .Range("A2:A" & Lr).Value
DDANH = .Range("P2:Q12").Value
R = UBound(Arr): D = UBound(DDANH)
ReDim KQ(1 To R, 1 To 6)
For i = 1 To R
    Temp = Split(Arr(i, 1), ",")
    C = UBound(Temp)
    For j = 0 To C
        If IsNumeric(Left(Temp(j), 1)) Then KQ(i, 1) = Temp(j)
            If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j) & KQ(i, 2)
                For k = 2 To D
                    If k < 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, 2) = KQ(i, 2) & Temp(j)
                    If k = 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(5, 1)) & "*") Then KQ(i, 3) = Temp(j)
                    If k > 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, DDANH(k, 2)) = Temp(j)
                Next k
   Next j
Next i
.Range("H2").Resize(R, 6) = KQ
End With
End Sub
 

File đính kèm

  • testTACH.xlsm
    21.3 KB · Đọc: 6
Bạn sửa lại code 1 tý nữa. Từ giờ bạn có thể đánh lộn xộn, Tỉnh, huyện, Đường, khu, thôn, xóm, tổ... thì code vẫn sắp đúng cho bạn.
Mã:
Sub Tach()
Dim i&, j&, Lr&, t&, k&, R&, C&, D&
Dim Arr(), KQ, Temp
With Sheets("Sheet2")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
Arr = .Range("A2:A" & Lr).Value
DDANH = .Range("P2:Q12").Value
R = UBound(Arr): D = UBound(DDANH)
ReDim KQ(1 To R, 1 To 6)
For i = 1 To R
    Temp = Split(Arr(i, 1), ",")
    C = UBound(Temp)
    For j = 0 To C
        If IsNumeric(Left(Temp(j), 1)) Then KQ(i, 1) = Temp(j)
            If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j) & KQ(i, 2)
                For k = 2 To D
                    If k < 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, 2) = KQ(i, 2) & Temp(j)
                    If k = 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(5, 1)) & "*") Then KQ(i, 3) = Temp(j)
                    If k > 5 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, DDANH(k, 2)) = Temp(j)
                Next k
   Next j
Next i
.Range("H2").Resize(R, 6) = KQ
End With
End Sub
Cám ơn bạn, mình có thêm định nghĩa thêm ấp cùng cấp với thôn, xóm nhưng khi chạy nó lại nhảy qua cột Đường. Mình gởi file bạn xem giùm.
1635662934670.png
 

File đính kèm

  • Test_Tach.xlsm
    20.6 KB · Đọc: 5
Cám ơn bạn, mình có thêm định nghĩa thêm ấp cùng cấp với thôn, xóm nhưng khi chạy nó lại nhảy qua cột Đường. Mình gởi file bạn xem giùm.
View attachment 268517
Bạn sửa lại code
Mã:
Sub Tach4()
Dim i&, j&, Lr&, t&, k&, R&, C&, D&
Dim Arr(), KQ, Temp
With Sheets("Sheet1")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
Arr = .Range("A2:A" & Lr).Value
DDANH = .Range("I2:J17").Value
R = UBound(Arr): D = UBound(DDANH)
ReDim KQ(1 To R, 1 To 6)
For i = 1 To R
    Temp = Split(Arr(i, 1), ",")
    C = UBound(Temp)
    For j = 0 To C
        If IsNumeric(Left(Temp(j), 1)) Then KQ(i, 1) = Temp(j)
            If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j) & KQ(i, 2)
                For k = 2 To D
                    If k < 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, 2) = KQ(i, 2) & Temp(j)
                    If k = 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(6, 1)) & "*") Then KQ(i, 3) = Temp(j)
                    If k > 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, DDANH(k, 2)) = Temp(j)
                Next k
   Next j
Next i
.Range("B2").Resize(R, 6) = KQ
End With
End Sub
 
Bạn sửa lại code
Mã:
Sub Tach4()
Dim i&, j&, Lr&, t&, k&, R&, C&, D&
Dim Arr(), KQ, Temp
With Sheets("Sheet1")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
Arr = .Range("A2:A" & Lr).Value
DDANH = .Range("I2:J17").Value
R = UBound(Arr): D = UBound(DDANH)
ReDim KQ(1 To R, 1 To 6)
For i = 1 To R
    Temp = Split(Arr(i, 1), ",")
    C = UBound(Temp)
    For j = 0 To C
        If IsNumeric(Left(Temp(j), 1)) Then KQ(i, 1) = Temp(j)
            If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j) & KQ(i, 2)
                For k = 2 To D
                    If k < 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, 2) = KQ(i, 2) & Temp(j)
                    If k = 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(6, 1)) & "*") Then KQ(i, 3) = Temp(j)
                    If k > 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, DDANH(k, 2)) = Temp(j)
                Next k
   Next j
Next i
.Range("B2").Resize(R, 6) = KQ
End With
End Sub
Một lần nữa cám ơn bạn nhiều.
Mình bỏ điều kiện k=5 đi mình thấy nó chạy ra kết quả cũng đúng.
 
Bạn sửa lại code
Mã:
Sub Tach4()
Dim i&, j&, Lr&, t&, k&, R&, C&, D&
Dim Arr(), KQ, Temp
With Sheets("Sheet1")
Lr = .Cells(Rows.Count, 1).End(xlUp).Row
Arr = .Range("A2:A" & Lr).Value
DDANH = .Range("I2:J17").Value
R = UBound(Arr): D = UBound(DDANH)
ReDim KQ(1 To R, 1 To 6)
For i = 1 To R
    Temp = Split(Arr(i, 1), ",")
    C = UBound(Temp)
    For j = 0 To C
        If IsNumeric(Left(Temp(j), 1)) Then KQ(i, 1) = Temp(j)
            If UCase(Trim(Temp(j))) Like UCase((DDANH(1, 1)) & "*") Then KQ(i, 2) = Temp(j) & KQ(i, 2)
                For k = 2 To D
                    If k < 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, 2) = KQ(i, 2) & Temp(j)
                    If k = 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(6, 1)) & "*") Then KQ(i, 3) = Temp(j)
                    If k > 6 Then If UCase(Trim(Temp(j))) Like UCase((DDANH(k, 1)) & "*") Then KQ(i, DDANH(k, 2)) = Temp(j)
                Next k
   Next j
Next i
.Range("B2").Resize(R, 6) = KQ
End With
End Sub
Bạn ơi cho mình hỏi thêm xíu, trường hợp mà địa chỉ ký tự đầu là chuỗi mình thêm điều kiện gì để lấy nó vô cột địa chỉ ví dụ: A75, A10, TER 15 v.v...
 
Bạn ơi cho mình hỏi thêm xíu, trường hợp mà địa chỉ ký tự đầu là chuỗi mình thêm điều kiện gì để lấy nó vô cột địa chỉ ví dụ: A75, A10, TER 15 v.v...
Ý bạn nói là cái số nhà đó phải không ( như kiểu: A120/87bis, quận 1, phường XYZ, Phố GHIK, ...) chứ gì?
có lẽ phải thêm 1 if... then nữa, là sau khi xét IsNumeric(Left(....) mà không thỏa mãn, thì xét tiếp Isnumeric(Mid(Temp(j),2,1(hoặc 2, hoặc 3, hoặc ...)) nếu thỏa mãn thì Temp(j) ấy là số nhà và KQ(i,1)=Temp(j).
đại loại
If IsNumeric(Left(Temp(j),....) then
KQ(i,1)=Temp(j)
elseIf Isnumeric(Mid(Temp(j),1 (hoặc 2, hoặc 3, hoặc...),1(hoặc 2, hoặc 3, hoặc ...) then
KQ(i,1)=Temp(j)
....end if
......
Cái này nếu có nhiều trường hợp thì phải lựa chọn (hoặc 2, hoặc 3, hoặc ...)cho phù hợp.
Bạn hãy thử xem. thiêt nghĩ đây cũng là một lần thực hành thôi.
 
Web KT
Back
Top Bottom