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

Liên hệ QC

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

khanhnth02

Thành viên thường trực
Tham gia
5/8/07
Bài viết
338
Được thích
36
tối có dữ liệu F08-029/02
tôi chỉ muốn tách dữ liệu như thế nào để không muốn lấy số"/02" ở đắng sau ấy. lưu ý là F08-029 luôn thay đổi và có thể nhiều ký tự hoặc ngắn ký tự hơn vì thế tôi không dùng được hàm left hoặc right. vậy dùng hàm gì vậy mọi người ,chân thành cảm ơn
 
tối có dữ liệu F08-029/02
tôi chỉ muốn tách dữ liệu như thế nào để không muốn lấy số"/02" ở đắng sau ấy. lưu ý là F08-029 luôn thay đổi và có thể nhiều ký tự hoặc ngắn ký tự hơn vì thế tôi không dùng được hàm left hoặc right. vậy dùng hàm gì vậy mọi người ,chân thành cảm ơn

Như vậy bạn muốn cắt bỏ những ký tự sau dấu"/" ?
 
tối có dữ liệu F08-029/02
tôi chỉ muốn tách dữ liệu như thế nào để không muốn lấy số"/02" ở đắng sau ấy. lưu ý là F08-029 luôn thay đổi và có thể nhiều ký tự hoặc ngắn ký tự hơn vì thế tôi không dùng được hàm left hoặc right. vậy dùng hàm gì vậy mọi người ,chân thành cảm ơn
Đưa hết các dạng dữ liệu muốn cắt lên đây để mọi người dễ hình dung.
Hình như bạn mới muốn ghép nó vào cơ mà?
http://www.giaiphapexcel.com/forum/...kết-hợp-tháng-với-mã-hàng&p=420184#post420184
 
tối có dữ liệu F08-029/02
tôi chỉ muốn tách dữ liệu như thế nào để không muốn lấy số"/02" ở đắng sau ấy. lưu ý là F08-029 luôn thay đổi và có thể nhiều ký tự hoặc ngắn ký tự hơn vì thế tôi không dùng được hàm left hoặc right. vậy dùng hàm gì vậy mọi người ,chân thành cảm ơn

Bạn thử cái này xem sao:

=LEFT(A1,LEN(A1)-(LEN(A1)-FIND("/",A1)+1))

hoặc:

=TRIM(LEFT(SUBSTITUTE(A1,"/",REPT(" ",255)),100))

với A1 là ô chứa dữ liệu.
 
đúng là tôi muốn ghép vào, giờ muốn tách ra để phục vụ công việc. chân thành cảm ơn mọi người , chúc vui vẻ và thành công nhé
 
các anh/chị giúp e bài này với.

Trong đó có câu: thống kê mẫu tin có xuất xứ từ Anh và nhật. Có nghĩa la tính tổng các mẫu tin xuất xứ từ Anh và Nhật đó các anh/chị ạ. Vui lòng giúp em với nha.Em đang cần gấp ạ. Em cảm on nhiều ạ!
 

File đính kèm

Trong đó có câu: thống kê mẫu tin có xuất xứ từ Anh và nhật. Có nghĩa la tính tổng các mẫu tin xuất xứ từ Anh và Nhật đó các anh/chị ạ. Vui lòng giúp em với nha.Em đang cần gấp ạ. Em cảm on nhiều ạ!

Cthức tại F26
PHP:
=COUNTIF($D3:$D22;"Anh")+COUNTIF($D$3:$D$22;"Nhật")
----------
Lưu ý trong cthức dấu ngăn cách của tôi là ";"
Sau này bạn mở đềtài mới, đừng xen ngang vào topic của người khác
 
Trong đó có câu: thống kê mẫu tin có xuất xứ từ Anh và nhật. Có nghĩa la tính tổng các mẫu tin xuất xứ từ Anh và Nhật đó các anh/chị ạ. Vui lòng giúp em với nha.Em đang cần gấp ạ. Em cảm on nhiều ạ!
Bạn chen ngang vào Topic của người khác mà nội dung chẳng liên quan gì đến nội dung Topic, Bài chắc sẽ bị xoá.
Bạn tạo Topic khác để hỏi vấn đề của mình đi, nhớ tiêu đề rõ ràng một chút,
các anh/chị giúp e bài này với.

tiêu đề này không rõ ràng, giúp cái gì trong bài này? Không đưa câu "Em đang cần gấp ạ." vào bài viết vì nó không có tác dụng gì mà lại có ý "hối thúc" người khác
Lưu ý khi gửi bài:
- Bài viết không dấu Tiếng Việt sẽ bị xóa
- Đặt tựa đề theo sát nội dung câu hỏi/ trả lời. Các bài viết có tựa đề chung chung như
Help me, cứu cứu, cứu em, gấp gấp,... sẽ bị xoá
- Giải thích/ mô tả câu hỏi càng chi tiết càng tốt
- Nên gửi thêm tập tin Excel kèm chú thích về câu hỏi nếu có
 
F08-029/02, bạn lấy số 02 hay lấy cả /02 ? Giả sử ô chứa dữ liệu là A1 nhé:

Chết rồi, bỏ phần 02 đọc nhầm thành lấy phần 02 :|.

Bạn thử cái này xem sao:

=LEFT(A1,LEN(A1)-(LEN(A1)-FIND("/",A1)+1))

Như vậy gọn và dễ hiểu hơn nè bạn:

 
Em sẽ rút kinh nghiệm ạ! Em cảm ơn anh nhiều.
 
ý em muốn tách lấy phần giá trị trước dấu "/". theo như công thức trên thì lấy ở phía sau rồi
 
tôi cũng làm rồi bạn ơi, nhưng như từ đầu tôi đã nói. trước dấu "/" có thể thay đổi nhiều hay ít. ví dụ nếu là F08-02951/02 thì hàm trên không thực hiện được
 
tôi cũng làm rồi bạn ơi, nhưng như từ đầu tôi đã nói. trước dấu "/" có thể thay đổi nhiều hay ít. ví dụ nếu là F08-02951/02 thì hàm trên không thực hiện được

Sao lại không được ? Công thức của mình làm được mà ?
Bạn cần lấy dữ liệu trước dấu "/" thì mình viết một công thức tìm dấu "/" trong ô rồi lấy phần trước nó, có phải làm đếm số ký tự từ trái qua đâu ?
Nó chỉ lỗi không làm được khi trong ô bạn chứa 2 ký tự "/".
 
Sao tối thấy không ai dùng chức năng text columns có sẵn trong excel rồi nhỉ?
 
Sao tối thấy không ai dùng chức năng text columns có sẵn trong excel rồi nhỉ?
Chơi cái Text to Columns thuận lợi khi bạn sử dụng hết các cột sau khi tách, còn chỉ sử dụng 1 cột thì lại phải xóa các cột không sử dụng thì ......làm công thức cho gọn
Híc
 
nếu Cột A không có dấu "/" (vd: F08-0293) thì cống thức trong cột B sẽ báo lỗi.tôi muốn sẽ cho ra đùng giá trị như vậy. vậy dùng thêm hàm gì ?
 
tôi có ví dụ: Ô A1: 123+456
A2: 50+70
tôi muốn cộng hai ô này trước dấu "+" và sau dấu cộng "+" thì dùng hàm gì
chẳng hạn kết quả tại ô B1 và B2 là: 123+50=173 và 456+70 = 526
 
Lần chỉnh sửa cuối:
nếu cột a không có dấu "/" (vd: F08-0293) thì cống thức trong cột b sẽ báo lỗi.tôi muốn sẽ cho ra đùng giá trị như vậy. Vậy dùng thêm hàm gì ?
Nếu A1=f08-02951/02 hoặc = F08-0293 thử dùng công thức này xem
PHP:
C1=IF(COUNTIF(A1;"*/*");LEFT(A1;FIND("/";A1)-1);A1)
Chú ý dấu ; hay , là tuỳ máy mỗi người.
 
tôi có ví dụ: Ô A1: 123+456
A2: 50+70
tôi muốn cộng hai ô này trước dấu "+" và sau dấu cộng "+" thì dùng hàm gì
chẳng hạn kết quả tại ô B1 và B2 là: 123+50=173 và 456+70 = 526
 
tôi có ví dụ: Ô A1: 123+456
A2: 50+70
tôi muốn cộng hai ô này trước dấu "+" và sau dấu cộng "+" thì dùng hàm gì
chẳng hạn kết quả tại ô B1 và B2 là: 123+50=173 và 456+70 = 526
Công thức ở [B1]:
=REPLACE(A1,FIND("+",A1),LEN(A1),"")+REPLACE(A2,FIND("+",A2),LEN(A2),"")
Ở [B2]:
=REPLACE(A1,1,FIND("+",A1),"")+REPLACE(A2,1,FIND("+",A2),"")
Với dạng bài này bạn nên đưa tất cả kiểu dữ liệu lên để dễ làm
Thân
 

File đính kèm

tôi có ví dụ: Ô A1: 123+456
A2: 50+70
tôi muốn cộng hai ô này trước dấu "+" và sau dấu cộng "+" thì dùng hàm gì
chẳng hạn kết quả tại ô B1 và B2 là: 123+50=173 và 456+70 = 526
Đã có rất nhiều bài bên trên hướng dẫn bạn dùng Left(), Right(), Find() chẳng lẽ bạn không vận dụng được gì sao?
Ví dụ A1= 123+456; Bạn tự gõ thử =Left(A1,Find("+",A1)-1) xem nó ra cái gì rồi tìm cách giải quyết
Cố lên chứ.
 
dùng hàm sum như thế nào cho những dấu "?" trông file?

thành thật xin lỗi vì quá gấp nên đã đưa ra những câu hỏi khiến mọi người trên diễn đàn khó hiểu.ý tôi muốn có một hàm giống như trong file dưới đây cho những dấu hỏi "?' . dữ liệu tôi còn rất nhiều cột và hàng nên cần một hàm sum tổng hợp để cho ra kết quả.
cảm ơn mọi người đã quan tâm
 

File đính kèm

thành thật xin lỗi vì quá gấp nên đã đưa ra những câu hỏi khiến mọi người trên diễn đàn khó hiểu.ý tôi muốn có một hàm giống như trong file dưới đây cho những dấu hỏi "?' . dữ liệu tôi còn rất nhiều cột và hàng nên cần một hàm sum tổng hợp để cho ra kết quả.
cảm ơn mọi người đã quan tâm

Mình cũng đoán ý bạn làm vầy thôi, chẳng biết có đúng ý không. Bạn test lại xem.
 

File đính kèm

mình cũng đã dùng hàm này nhưng không ra vì thiếu dấu "--"phía trước. mình muốn biết 2 dấu này có ý nghĩa gì vậy. chân thành cảm ơn nhé!
 
mình cũng đã dùng hàm này nhưng không ra vì thiếu dấu "--"phía trước. mình muốn biết 2 dấu này có ý nghĩa gì vậy. chân thành cảm ơn nhé!
2 dấu - được đặt phía trước một chuỗi số (có thể đặt trước một công thức mà kết quả của công thức này là một chuỗi số)để biến nó trở thành một số thực sự, có thể tính toán, so sánh.
Ví dụ: Công thức LEFT("123ABC",3) cho kết quả là chuỗi số "123". Khi đó, công thức --LEFT("123ABC",3) cho ra số 123 (một trăm hai mươi ba).
Ngoài cách thêm 2 dấu - phía trước, chúng ta còn có thể lấy kết quả (chuỗi số) này *1, /1, ^1, +0, -0 cũng được.
Chẳng hạn công thức LEFT("123ABC",3)*1 cũng sẽ cho ra số 123.
 
ham sumproduct

vui lòng giúp thêm phần này, tôi đã kết hợp các công thức từ đầu bài đến giờ mà cũng chưa ra. nếu ô A không có dữ liệu hoặc dữ liệu như ví dụ trong file thì dùng công thức như thế nào. cảm ơn
 

File đính kèm

Bạn dùng công thức mảng nhé
=SUM(IF(ISERROR(--LEFT(A2:A5,FIND("+",A2:A5)-1)),0,--LEFT(A2:A5,FIND("+",A2:A5)-1)))
kết thúc bằng Ctrl + Shift + Enter
Nếu bài viết hữu ích thì nhớ thanks nha
 
Lần chỉnh sửa cuối:
nhưng trường hợp ô A2: 5+6, A3:4 ,A4: 1+2 thì không cho ra kết quả đúng (tôi muốn kết quả 5+4+1=10)
dùng hàm gì để cộng tất cả các dãy số trên vậy? (kêt quả là:18)
 
Lần chỉnh sửa cuối:
nhưng trường hợp ô A2: 5+6, A3:4 ,A4: 1+2 thì không cho ra kết quả đúng (tôi muốn kết quả 5+4+1=10)
dùng hàm gì để cộng tất cả các dãy số trên vậy? (kêt quả là:18)
Dùng Hàm tự tạo thử xem, Có kiểm tra bằng hàm Excel bằng các cột phụ.
 

File đính kèm

nhưng trường hợp ô A2: 5+6, A3:4 ,A4: 1+2 thì không cho ra kết quả đúng (tôi muốn kết quả 5+4+1=10)
dùng hàm gì để cộng tất cả các dãy số trên vậy? (kêt quả là:18)

Mã:
Function MySum(ByVal Arr, Optional ByVal pos As Integer = 0) As Long
     Dim objRegExp As Object
     Dim objMatch As Object
     Dim tmpArr, r As Long, c As Long, baonhieu As Long
                  
    Set objRegExp = VBA.CreateObject("VBScript.RegExp")
    With objRegExp
        .Global = True
        If pos = 0 Then
            .Pattern = "^\d+|\d+$"
        ElseIf pos = 1 Then
            .Pattern = "^\d+"
        Else
            .Pattern = "\+\d+$"
        End If
        If IsArray(Arr) Then
            tmpArr = Arr
            For r = 1 To UBound(tmpArr)
                For c = 1 To UBound(tmpArr, 2)
                    For Each objMatch In .Execute(tmpArr(r, c))
                        baonhieu = baonhieu + objMatch.Value
                    Next objMatch
                Next c
            Next r
        Else
            For Each objMatch In .Execute(Arr)
                baonhieu = baonhieu + objMatch.Value
            Next objMatch
        End If
    End With
     
     MySum = baonhieu
     Set objRegExp = Nothing
     Set objMatch = Nothing
End Function

View attachment 86443

Tham số thứ nhất: 1 ô hoặc vùng.
Tham số thứ 2: Nếu tổng các số thì truyền 0 (mặc định), nếu tổng các số thứ nhất thì pos = 1, nếu tổng các số thứ hai thì pos <> 0, 1, vd. pos = 2
vd. =MySum(A2:B6) --> tổng các số (thứ 1 và 2) trong vùng A2:B6
 

File đính kèm

bạn dùng hàm sum theo mảng là được

thành thật xin lỗi vì quá gấp nên đã đưa ra những câu hỏi khiến mọi người trên diễn đàn khó hiểu.ý tôi muốn có một hàm giống như trong file dưới đây cho những dấu hỏi "?' . dữ liệu tôi còn rất nhiều cột và hàng nên cần một hàm sum tổng hợp để cho ra kết quả.
cảm ơn mọi người đã quan tâm
Lưu ý, mình dùng công thức mảng nên sau khi edit công thức bạn nhấn tổ hợp ctr+shift+Enter nhé.
Kết quả: Giải quyết được yêu cầu cụ thể của bạn
Nhược điểm: khi thêm dòng dữ liệu mới, công thức sum không tự động mở rộng vùng tính toán (cụ thể là vùng A2:A5 như trong file ví dụ)
 

File đính kèm

bây giờ tôi muốn dùng hàm sumproduct tai ô B10 lại cho kết qua sai. tôi muốn cho ra tổng số tiền từng mặt hàng tương ứng với từng D.Giá thì sao?
 

File đính kèm

hàm sumproduct

bây giờ tôi muốn dùng hàm sumproduct tai ô B10 lại cho kết qua sai. tôi muốn cho ra tổng số tiền từng mặt hàng tương ứng với từng D.Giá thì sao?
 

File đính kèm

File đính kèm

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!
 

File đính kèm

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!
Bạn dùng Text to column chưa?
 
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

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

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

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

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

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

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ã?)
 
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ã?)


He he.
"Tức phải tách được Thôn để Find, và tách được Xã để Find"
Nói thì dễ nhưng khi nhìn kỹ dữ liệu thì không hề đơn giản.
----------------
Tôi đã xem qua dữ liệu thì đúng là nó lung tung quá. Lúc thì Xã ở cuối nhưng cũng có lúc không ở cuối. Vd. "Đoàn Kết,Xã Hải Lựu,Sông Lô" thì "Sông Lô" chả là Thôn mà cũng chả là Xã. Lúc thì dữ liệu có 2 cụm từ theo thứ tự Thôn - Xã, lúc thì có 3 cụm từ theo thứ tự "Chả là gì cả - Thôn - Xã", lúc thì là "Thôn - Xã - Chả là gì cả".
Lúc là "xyz", lúc là "Xã xyz", lúc thì "TT xyz", lúc khác lại là "Thị Trấn xyz". Liệu trong dữ liệu thực còn có từ nào khác không?
Như vậy thì ta đã biết là Xã không nhất thiết đứng cuối, nhưng liệu có thể chắc chắn là trong mọi dòng dữ liệu ta luôn có Xã đứng liền sau Thôn không? Hoặc luôn có Thôn đứng liền sau Xã không? Hay trong dữ liệu thực có lúc Xã đứng trước Thôn và có lúc Thôn đứng trước Xã? Vì trong trường hợp cuối này thì dữ liệu là "lung tung" được nâng lên lũy thừa n (lung_tung)

Để bàn về cách giải thì phải có 2 thông tin:

1. Xã có đứng liền sau Thôn hay không? Hoặc Thôn có đứng liền sau Xã hay không?
2. Nếu Thôn và Xã đứng liền kề thì những ký tự nào phân cách chúng? Chỉ "-" hoặc "," hay còn những ký tự khác nữa (ngoài dấu cách)?
 
Lần chỉnh sửa cuối:
giả sử A1=F08-029/02
B1 BẠN =REPLACE(A1,8,15,C1)
TRONG ĐÓ C1 LÀ Ô TRẮNG(LẤY C1 HOẶC Ô TRẮNG BẤT KỲ)
 

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

Back
Top Bottom