lọc số và ký tự trong cùng một chuỗi? (1 người xem)

  • Thread starter Thread starter LikeIt
  • Ngày gửi Ngày gửi
Liên hệ QC

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

LikeIt

Thành viên tiêu biểu
Tham gia
16/6/06
Bài viết
415
Được thích
254
Nghề nghiệp
Others
Gửi các anh chị,

Liên quan đến chủ đề trích lọc dữ liệu, em có đọc một số bài trên GPE nhưng chưa thấy có cách lọc cả số và ký tự, em có một file đính kèm trong đó có mô tả hàng hóa, hiện em đang cần lọc cả số và chữ như trong cột C file đính kèm, mong các anh chị chỉ giáo. tks / NHT
 

File đính kèm

Em cho hỏi, có phải tổng công trong file có 3 loại đơn vị tính ko? Là g, s va ml ???
ANH TUẤN
 
Loc số thì anh có, cả số và dvtính thì không. Tuy nhiên có thể tách dvtính ra và lookup theo 1 DS có sẵn, hoặc DS tự tạo bằng Remove Duplicate trong Excel2007, em đang xài 2007 mà.
Xem file, hàm tự tạo CtoN1st(chuỗi, dấu thập phân)
 

File đính kèm

ptm0412 đã viết:
Loc số thì anh có, cả số và dvtính thì không. Tuy nhiên có thể tách dvtính ra và lookup theo 1 DS có sẵn, hoặc DS tự tạo bằng Remove Duplicate trong Excel2007, em đang xài 2007 mà.
Xem file, hàm tự tạo CtoN1st(chuỗi, dấu thập phân)

Đã làm VBA thì cho ra thành 1 hàm luôn bác ạ, nó sẽ tách ra số và đơn vị tính luôn.

Để biết đâu là đơn vị tính thì ta sẽ có một bảng danh mục đơn vị tính (chứ không phải là danh mục sản phẩm), các ký tự liền kề với số nếu có mặt trong bảng danh mục đơn vị tính sẽ được lấy ra.

Thân!
 
To MrOKBAB:
Mình tính viết 1 hàm có thể dùng chung cho nhiều người và nhiều kiểu dữ liệu, nhưng chưa xong nên đánh số 1st, có thể mình cải tiến 2nd đọc số thứ nhì trong chuỗi
thí dụ: "JOHNY WALKER 650ML X 24BOTTLES" mình sẽ tách riêng số 650 và 24.
Đa số người dùng sẽ còn muốn tính toán trên 2 số này, nếu kèm dvtính thì không tính toán được.
Tuy nhiên trong trường hợp cụ thể này, nếu Hương Thơm cần thì mình tách thêm dvtính cũng được, cải tiến theo gợi ý của bạn. Hẹn tối nay.
Thanks
 
Lần chỉnh sửa cuối:
Thêm hàm

Y hẹn một nửa.
- Đã có CtoN2nd tách số thứ nhì 24.
- CtoNUnit tách cả số kèm đơn vị tính đã có nhưng còn lỗi: nếu số nguyên (400ML) thì đúng, nhưng số thập phân (6.5 ML) thì sai: 6.05ML

nhờ MrOKeBab coi hộ chỗ này:

PHP:
 Code:
Kqtp = CtoNUnit(Mystr, Dautp)
' Kqtp đang có giá trị " 5ML" '
Sotp = Val(Kqtp) * 10 ^ (-Len(Str(Val(Kqtp))))
' Val(Kqtp) có giá trị 5 '
[left]' nhưng len(str(val(Kqtp))) lại có giá trị 2 ' [/left]


Trừ len(str(val(Kqtp))) cho 1 thì được rồi nhưng sợ không phải là đúng cho mọi trường hợp, trừ khi mình biết chắc lý do.​
 

File đính kèm

Lần chỉnh sửa cuối:
Đã có hướng giải quyết, nhưng là kết hợp 2 hàm CtoN1st và CtoNUnit. Được 2 em hoàn chỉnh.
- 1 cái sửa hàm hôm qua, cho Kqtp là số khỏi str(val()), len(Kqtp) bằng đúng giá trị mong muốn
- 1 cái ngắn gọi CtoN1st từ đầu, lấy số, thêm dvt

File kèm theo định dạng 2003 theo tình hình số đông chưa có 2007. Cám ơn Minhlev quan tâm và nhắc nhở.
 

File đính kèm

Lần chỉnh sửa cuối:
ptm0412 đã viết:
Đã có hướng giải quyết, nhưng là kết hợp 2 hàm CtoN1st và CtoNUnit. Được 2 em hoàn chỉnh.
- 1 cái sửa hàm hôm qua, cho Kqtp là số khỏi str(val()), len(Kqtp) bằng đúng giá trị mong muốn
- 1 cái ngắn gọi CtoN1st từ đầu, lấy số, thêm dvt

File kèm theo định dạng 2003 theo tình hình số đông chưa có 2007. Cám ơn Minhlev quan tâm và nhắc nhở.
Em mạo muội góp vui xíu:
- Xét lần lượt các ký tự của chuỗi
- Lấy tất cả các số gần nhau
- Xét xem các ký tự phía sau số có phải là ĐVT giống như trong Danh Sách hay không. Nếu đúng thì lấy (thoát), còn nếu không thì xét tiếp.

--> Số và đơn vị tính. Số và đơn vị tính cách nhau 1 khoảng trắng để phục vụ cho việc bóc tách sau này.

PHP:
Function CVE(Chuoi As Range, DS As Range) As String
    On Error Resume Next
    Application.Volatile (False)
    If Len(Chuoi) < 2 Then Exit Function
    Dim i As Integer, i1 As Integer
    Dim Kytu As String, Kytu1 As String, TempDV As String
    For i = 1 To Len(Chuoi)
        Kytu = Mid$(Chuoi, i, 1)
        If IsNumeric(Kytu) = True Then
            For i1 = i + 1 To Len(Chuoi)
            Kytu1 = Mid$(Chuoi, i1, 1)
                If IsNumeric(Kytu1) = False And Kytu1 <> "." And Kytu1 <> "," Then
                    TempDV = TempDV & Mid$(Chuoi, i1, 1)
                    If WorksheetFunction.CountIf(DS, Trim(TempDV)) > 0 Then GoTo TimThay
                End If
            Next
        End If
    Next
    Exit Function
TimThay:
    CVE = Trim(Mid$(Chuoi, i, i1 - i + 1))
    CVE = Left$(CVE, Len(CVE) - Len(Trim(TempDV))) & " " & Trim(TempDV)
End Function

Mong được góp ý!!

Thân!
 

File đính kèm

Cám ơn MrBab,
Code của bạn áp dụng thủ thụât rất hay, để mình giải thích xem đúng không nha:
- áp dụng 2 vòng lặp for lồng nhau
- khi đạt 1 mục tiêu cụ thể, chặn đứng vòng lặp ngoài, chạy vòng lặp trong.
- Khi đạt mục tiêu của vòng lặp trong, đi thẳng ra ngoài 2 cả vòng lặp.

Mục đích là sử dụng giá trị 2 biến i và i1 của 2 vòng lặp (tại thời điểm bị dừng) cho việc tính kết quả.

Ngâm cứu nửa tiếng mới hiểu lờ mờ thủ thuật này đấy.
--> Số và đơn vị tính. Số và đơn vị tính cách nhau 1 khoảng trắng để phục vụ cho việc bóc tách sau này.
Bóc tách ra chưa chắc có thể tính toán được: Giả sử số thập phân trong Excel quy định là phẩy, mà chuỗi tách ra có dấu chấm.

Còn hàm của mình dài hơn do mình có chủ định khác:
- Tách từng chuỗi số ra khỏi 1 chuỗi phức tạp gồm từ 2 nhóm số trở lên, có cả dấu thập phân cả 2 kiểu phẩy và chấm, kèm cả dấu trừ nếu âm.
- tách không kèm đơn vị tính nhằm mục đích tính toán cho các kết quả.
- ở bài trước mình tách được 2 chuỗi số, nay mình thực hiện được với chuỗi bất kỳ với bao nhiêu nhóm số cũng được.
- thủ thuật là đệ quy, 1 lần hoặc nhiều lần.

Mình đã làm 1 hàm duy nhất, tách chuỗi phức tạp thành nhiều nhóm số.
Trong file kèm theo mình thử với chuỗi gồm 5 nhóm số như chuỗi:
"400mlX24bottle And450mlX20bottle And2100mlDeGoDen"
kết quả là: 400 | 24 | 450 | 20 | 2100

Nhưng hiện giờ mới đúng cho số nguyên âm và dương, chưa đúng cho số thập phân. Nhờ MrOkeBab và các cao thủ góp ý xem sai chỗ nào.

Còn câu hỏi bài trước mình ngẫm thấy val("5ML") = 5 nhưng len(str(val("5ML"))) = 2 là không biết tại sao có phải quy luật không, muốn cho chắc thì len(trim(str(val("5ML")))) sẽ bằng 1.
 

File đính kèm

Lần chỉnh sửa cuối:
ptm0412 đã viết:
Cám ơn MrBab,
Code của bạn áp dụng thủ thụât rất hay, để mình giải thích xem đúng không nha:
- áp dụng 2 vòng lặp for lồng nhau
- khi đạt 1 mục tiêu cụ thể, chặn đứng vòng lặp ngoài, chạy vòng lặp trong.
- Khi đạt mục tiêu của vòng lặp trong, đi thẳng ra ngoài 2 cả vòng lặp.

Mục đích là sử dụng giá trị 2 biến i và i1 của 2 vòng lặp (tại thời điểm bị dừng) cho việc tính kết quả.

Ngâm cứu nửa tiếng mới hiểu lờ mờ thủ thuật này đấy.

Bóc tách ra chưa chắc có thể tính toán được: Giả sử số thập phân trong Excel quy định là phẩy, mà chuỗi tách ra có dấu chấm.

Còn hàm của mình dài hơn do mình có chủ định khác:
- Tách từng chuỗi số ra khỏi 1 chuỗi phức tạp gồm từ 2 nhóm số trở lên, có cả dấu thập phân cả 2 kiểu phẩy và chấm, kèm cả dấu trừ nếu âm.
- tách không kèm đơn vị tính nhằm mục đích tính toán cho các kết quả.
- ở bài trước mình tách được 2 chuỗi số, nay mình thực hiện được với chuỗi bất kỳ với bao nhiêu nhóm số cũng được.
- thủ thuật là đệ quy, 1 lần hoặc nhiều lần.

Mình đã làm 1 hàm duy nhất, tách chuỗi phức tạp thành nhiều nhóm số.
Trong file kèm theo mình thử với chuỗi gồm 5 nhóm số như chuỗi:
"400mlX24bottle And450mlX20bottle And2100mlDeGoDen"
kết quả là: 400 | 24 | 450 | 20 | 2100

Nhưng hiện giờ mới đúng cho số nguyên âm và dương, chưa đúng cho số thập phân. Nhờ MrOkeBab và các cao thủ góp ý xem sai chỗ nào.

Còn câu hỏi bài trước mình ngẫm thấy val("5ML") = 5 nhưng len(str(val("5ML"))) = 2 là không biết tại sao có phải quy luật không, muốn cho chắc thì len(trim(str(val("5ML")))) sẽ bằng 1.

Bác thân!

Việc biến ký tự "." hoặc "," thành dấu thập phân thì không khó , chỉ cần nhờ
PHP:
Application.ThousandsSeparator
là ta biết được dấu thập phân là cái gì để biến đổi các ký tự trên thành dấu đó trong TH đã tìm được chuỗi số như ý.

Việc bóc tách là cần thiết, vì vậy em cho có dấu cách giữa số và đơn vị tính để sau này muốn bóc tách thì ta có thể dùng các hàm đơn giản để bóc tách (vì có quy luật cụ thể)

VD của em chỉ là VD để giải quyết câu hỏi của bạn H.Thơm thôi, còn trong TH nhiều như của bác thì lại thêm mấy vòng lặp nữa thôi ạ, không thoát nữa mà duyệt đến hết chuỗi luôn.
Còn các vấn đề khác thì em sẽ nghiên cứu.

Cảm ơn bác nhiều!
Thân!
 
Đã làm xong CtoNPlus(chuỗi, dấu TP, Stt chuỗi số) dùng tách chuỗi phức tạp có nhiều nhóm số (bất kỳ).
Thí dụ: chuỗi:
"650mlX24bottle And50mlX120Smallbottle And1.000mlX12VaseDeGoden"
gồm 6 nhóm số, sẽ tách ra thành:
650 | 24 | 50 | 120 | 1000 | 12
hàm có thể đọc số thập phân định dạng phẩy hoặc chấm, có hoặc không có dấu phân cách hàng ngàn, đọc số âm định dạng -xxx
Đọc số thập phân, cho dấu thập phân vào tham số thứ 2.
Đọc số thứ mấy trong chuỗi, cho số thứ tự nhóm số vào tham số thứ 3.

Đố MrOkeBab xem đã sửa những gì từ file CtoNPlusPtm1.xls!
 

File đính kèm

Công thức của bác ptm0412 thật là hay. Tuy nhiên theo em, khi tính toán trong bảng tính, bác nên sử dụng 1 công thức CtoNPlus(chuỗi, dấu TP, Stt chuỗi số) thôi (kể cả tìm dãy số đầu tiên). Để thực hiện được như vậy thì trong đoạn code viết cho Function CtoNPlus cần chỉnh lại một chút ở đoạn sau:
PHP:
If sttchuoi = 1 Then
CtoNPlus = so1
thành
PHP:
If sttchuoi = 1 Then
soN = so1
Hoặc đưa dòng code: CtoNPlus = soN lên trước dòng End If cuối cùng của Function CtoNPlus
 
Chính xác là như vầy:
PHP:
Function CtoNPlus(Mystr As String, Optional Dautp As String, Optional sttchuoi As Byte) As Double
Newstr = ""
so1 = CtoN1st(Mystr, Dautp)
If sttchuoi = 1 Then
CtoNPlus = so1
Else
For i = 2 To sttchuoi
If Len(Newstr) < 2 Then Exit For
CtoNPlus = CtoN1st(Newstr, Dautp)
Next i
End If
Newstr = ""
End Function

Hàm phải chạy 1 lần cho chuỗi gốc MyStr để có được NewStr =Right(MyStr, ...)
Các lần sau chạy cho NewStr, mỗi lần chạy, NewStr thay đổi.

Mình đã sửa như vậy trong sở làm, nhưng không chép về, nên phải làm lại ở nhà cho phần chính bị lỗi, phần này không bị lỗi nên quên.
Tuy nhiên theo em, khi tính toán trong bảng tính, bác nên sử dụng 1 công thức CtoNPlus(chuỗi, dấu TP, Stt chuỗi số) thôi (kể cả tìm dãy số đầu tiên).
Mình chỉ dùng 1 hàm đấy chứ?
Chuỗi 1 = B1 = CtoNPlus(A1;",";1)
Chuỗi 2 = C1 = CtoNPlus(A1;",";2)
. . .
Chuỗi n = Celln1 = CtoNPlus(A1;",";n)
 
Lần chỉnh sửa cuối:
Theo em, cái đoạn code của Function CtoN1st mới là cái khó còn code của Function CtoNPlus chỉ là cái ứng dụng phía sau mà thôi. Tuy nhiên, mạn phép bác ptm0412, em xin được chỉnh lại code của Function CtoNPlus như sau:
PHP:
Function CtoNPlus(Mystr As String, SttChuoi As Byte, Optional Dautp As String) As Double
Newstr = Mystr
For i = 1 To SttChuoi
    If Len(Newstr) < 2 Then
        CtoNPlus = 0
        Exit For
    Else:    CtoNPlus = CtoN1st(Newstr, Dautp)
    End If
Next i
Newstr = ""
End Function
Lúc này công thức có dạng là:
CtoNPlus(chuỗi, Stt chuỗi số, dấu TP)
Nhờ bác ptm0412 và các bác trong diễn đàn kiểm tra lại xem có gì sai sót không???
 
Đúng rồi minhlev ạ.
- Đưa tham số sttchuoi ra trước bỏ được lựa chọn optional, để sau bác Bill không cho.
- Newstr = Mystr hay đấy, rút gọn được hàm.
- Hàm CtoN1st chưa phải là tối ưu, mình chỉ làm được có thế. Tuy nhiên dù gì mình cũng mò ra được 1 thủ thuật hay, là gọi 1 hàm hoặc thủ tục (procedure) ra thực thi nhiều lần.
- Học thêm bác Bab thủ thuật dừng For lấy giá trị biến lặp.
 
Ừ thì cứ làm, làm để học hỏi chứ. Còn tác giả thì . . .
Cũng như cái file tinh.xls của bạn mới làm đấy, nó ở 3 topic khác nhau, mình cũng tham gia vào 2 cái, trả lời, hỏi thêm, giải thích, rồi biến mất. Topic thứ 3 vì bạn làm rồi nên thôi.
Mà dữ liệu đưa lên mỗi lần 1 khác nhau, yêu cầu khác nhau.
Với lại mình có nói dùng hàm Sumproduct vào là bị chậm, tác giả không nghe thì mình chịu thua.
Bài này là spam đây.
 
Lần chỉnh sửa cuối:
Mình cần đơn giản hơn nè, muốn tách từ 400ml => 400 thôi thì tách sao? làm mãi chẳng được. Tks,
 
Mình cần đơn giản hơn nè, muốn tách từ 400ml => 400 thôi thì tách sao? làm mãi chẳng được. Tks,

Bạn nên gửi file hay mô tả tất cả tất cả các trường hợp khác để các Cao thủ giúp một cách tổng thể nhất (nếu phát sinh số liệu/trường hợp khác...)
Còn bạn chỉ muốn 400ml => 400 thì chỉ cần =LEFT(A1,3) - cho 400ml tại Ô A1.
 
Mình tham gia hàm ngắn hơn và cho phép tuỳ chọn lọc lấy số hay ký tự abc.


PHP:
Function Num(ch As String, Kieu As Byte) As Variant
For i = 1 To Len(ch)
If IsNumeric(Mid(ch, i, 1)) = IIf(Kieu = 1, True, False) Then Num = Num & Mid(ch, i, 1)
Next
If Kieu = 1 Then Num = Val(Num)
End Function

Cú pháp: = Num(Chuoi,Kieu)
Kieu=1 thì lấy số.
Kieu=0 lấy chữ.
 

File đính kèm

Mình dùng mấy hàm tách số ra khỏi chuỗi của bạn thì được rồi. Nhưng khi tách số thập phân thì bị vướng VD: Xuất kho 12,05 lít dầu thì nó cho kết quả là 12,5 chứ không phải là 12,05. Bạn có cách nào khấc phục giúp mình với.
 
Nhìn mọi người bàn luận về vòng lặp và viết công thức trong VBA mà e thèm quá..ôi cái đầu e nó không tải nổi +-+-+-++-+-+-+. Nếu làm được hoàn toàn bằng hàm Excel mà không cần viết code thì hay quá
 
Lọc số trên mỗi dòng khác nhau.

BIOBABY 724, 50G, COM, 1X1
BIOBABY 724, 100G, COM, 1X1
BIOLACTYL 724, , BOT, 1X14
BIOLACTYL 724, , V NANG, 2X15
BIOTOP (HANKOOK) 724, , V NANG, 10X10
BIPHERAN HANYOUNG 724, 75MG, V NANG, 10X10
BISCAN-G 724, , V NANG, 10X12
BOLINAN 724, 2GR, V NEN, 2X20
LIVERHEL (BORAM) 724, , V NANG, 12X5
BUSCOPAN 724, 10MG, V NEN, 5X10
CARBOGAST 724, , V NEN, 2X15
CARBOSYLANE 724, , V NANG, 8X12

Ví dụ mình có dữ liệu như trên, mình muốn lọc số 724 ra và, mỗi dòng số 724 nằm vị trí không giống nhau. Làm cách nào để lọc số đó ra.
Xin giúp đỡ.
 
BIOBABY 724, 50G, COM, 1X1
BIOBABY 724, 100G, COM, 1X1
BIOLACTYL 724, , BOT, 1X14
BIOLACTYL 724, , V NANG, 2X15
BIOTOP (HANKOOK) 724, , V NANG, 10X10
BIPHERAN HANYOUNG 724, 75MG, V NANG, 10X10
BISCAN-G 724, , V NANG, 10X12
BOLINAN 724, 2GR, V NEN, 2X20
LIVERHEL (BORAM) 724, , V NANG, 12X5
BUSCOPAN 724, 10MG, V NEN, 5X10
CARBOGAST 724, , V NEN, 2X15
CARBOSYLANE 724, , V NANG, 8X12

Ví dụ mình có dữ liệu như trên, mình muốn lọc số 724 ra và, mỗi dòng số 724 nằm vị trí không giống nhau. Làm cách nào để lọc số đó ra.
Xin giúp đỡ.
Đưa file giống thật lên đi, muốn lấy số nào phải có quy luật chứ (ví dụ tất cả con số trước dấu phẩy đầu tiên) chứ nếu theo ví dụ của bạn thì cứ gõ 724 là xong.
 
BIOBABY 724, 50G, COM, 1X1
BIOBABY 724, 100G, COM, 1X1
BIOLACTYL 724, , BOT, 1X14
BIOLACTYL 724, , V NANG, 2X15
BIOTOP (HANKOOK) 724, , V NANG, 10X10
BIPHERAN HANYOUNG 724, 75MG, V NANG, 10X10
BISCAN-G 724, , V NANG, 10X12
BOLINAN 724, 2GR, V NEN, 2X20
LIVERHEL (BORAM) 724, , V NANG, 12X5
BUSCOPAN 724, 10MG, V NEN, 5X10
CARBOGAST 724, , V NEN, 2X15
CARBOSYLANE 724, , V NANG, 8X12

Ví dụ mình có dữ liệu như trên, mình muốn lọc số 724 ra và, mỗi dòng số 724 nằm vị trí không giống nhau. Làm cách nào để lọc số đó ra.
Xin giúp đỡ.

Như bạn miêu tả thì bạn muốn lấy 3 ký tự đứng trước dấu "," đầu tiên phải không ? Nếu đúng vậy thì bạn dùng công thức này:

=RIGHT(LEFT(A1,FIND(",",A1)-1),3)

Với A1 là ô chứa dữ liệu.
 
Đưa file giống thật lên đi, muốn lấy số nào phải có quy luật chứ (ví dụ tất cả con số trước dấu phẩy đầu tiên) chứ nếu theo ví dụ của bạn thì cứ gõ 724 là xong.

Mình đã up lên, số 724 không theo thứ tự nhất định. Nằm ở nhiều vị trí khác nhau. Có những dòng không chứa số 724, quan trọng là mình muốn lọc ra nhưng bó tay rồi.
 

File đính kèm

Mình đã up lên, số 724 không theo thứ tự nhất định. Nằm ở nhiều vị trí khác nhau. Có những dòng không chứa số 724, quan trọng là mình muốn lọc ra nhưng bó tay rồi.
Tức là dòng nào có số 724 thì lấy, không có thì thôi, đúng không?
Nếu đúng vậy thì đây là bài toán tìm sự tồn tại của 1 chuổi nhỏ trong chuổi lớn ---> Có thể dùng COUNTIF để kiểm tra
Ví dụ: =COUNTIF(A2,"*724*")
Còn nếu bạn muốn TRÍCH LỌC SỐ nào đó thì bắt buộc phải có 1 quy luật đi kèm
 

File đính kèm

Tức là dòng nào có số 724 thì lấy, không có thì thôi, đúng không?
Nếu đúng vậy thì đây là bài toán tìm sự tồn tại của 1 chuổi nhỏ trong chuổi lớn ---> Có thể dùng COUNTIF để kiểm tra
Ví dụ: =COUNTIF(A2,"*724*")
Còn nếu bạn muốn TRÍCH LỌC SỐ nào đó thì bắt buộc phải có 1 quy luật đi kèm

Nếu dùng công thức: =RIGHT(LEFT(A1,FIND(",",A1)-1),3) của bạn mhung12005 thì mình có thể lọc được 2 mã 724 và 1 mã khác bất kỳ cùng một lúc.
Còn công thức =COUNTIF(A2,"*724*") của bạn ndu96081631 thì mình chỉ lọc được 1 mã 724 thôi. Nếu lọc từ 2 mã trở lên thì thế nào?
 
XIN TRỢ GIÚP TỪ GPE
Tôi có dãy kí tự Ở CELL(A1) LÀ: "H19ST...;Q18LM...;..." Bây giờ tôi muốn ở các cell(b1) là: H19S, ở CELL(B2) LÀ H19T;...;(B4)làQ18L;(B5)là:Q18M...
Rất mong nhận được sự giúp đỡ
 
XIN TRỢ GIÚP TỪ GPE
Tôi có dãy kí tự Ở CELL(A1) LÀ: "H19ST...;Q18LM...;..." Bây giờ tôi muốn ở các cell(b1) là: H19S, ở CELL(B2) LÀ H19T;...;(B4)làQ18L;(B5)là:Q18M...
Rất mong nhận được sự giúp đỡ

Hãy miêu tả dữ liệu vì ví dụ có thể do ngẫu nhiên mà gây hiểu lầm cho người khác. Tôi cho ví dụ
Bạn liệt kê dữ liệu và tôi thấy là "mỗi cụm" gồm 1 chữ cái (phải thế hay do ngẫu nhiên?) và sau đó là số có 2 chữ số (phải thế hay do ngẫu nhiên? Số chữ số tùy ý?), tiếp theo là chuỗi chữ cái (do ngẫu nhiên hay có thể vd. H19STUV1X để rồi tách ra: H19S, H19T, H19U, H19V, H191, H19X???). Sau ";" là chữ cái của mỗi cụm hay có thể có dấu cách?
Những gì bạn không nói thì mãi mãi chỉ nằm trong đầu bạn. Người khác có thể đoán, mà đã là trò đoán thì bao giờ cũng có xác xuất sai. Cho dù lớn hay nhỏ nhưng chắc chắn > 0.
 
Xin trợ giúp

NHỜ ANH EM GPE GIÚP ĐỠ
Chuổi kí tự là có qui luật
"H19STAB;Q18LM...;ANH7CDR...;... Muốn TÁCH CHO vào các ô có kết quả lần lượt là H19S, H19T, H19A, Q18L, Q18M,..., ANH7C,ANH7D,ANH7R, ...Số lượng chữ cái sau mỗi chữ số là bất kì. PHẦN KÍ TỰ MÀU ĐỎ GIỮ NGUYÊN, NẾU HẾT SỐ CHỮ CÁI SAU NÓ THÌ CHUYỂN SANG PHẦN KÍ TỰ MÀU ĐỎ TIẾP THEO.
CẢM ƠN MỌI NGƯỜI

 
Lần chỉnh sửa cuối:
NHỜ ANH EM GPE GIÚP ĐỠ
Chuổi kí tự là có qui luật
"H19STAB;Q18LM...;ANH7CDR...;... Muốn TÁCH CHO vào các ô có kết quả lần lượt là H19S, H19T, H19A, Q18L, Q18M,..., ANH7C,ANH7D,ANH7R, ...Số lượng chữ cái sau mỗi chữ số là bất kì. PHẦN KÍ TỰ MÀU ĐỎ GIỮ NGUYÊN, NẾU HẾT SỐ CHỮ CÁI SAU NÓ THÌ CHUYỂN SANG PHẦN KÍ TỰ MÀU ĐỎ TIẾP THEO.
CẢM ƠN MỌI NGƯỜI

Bạn thử xem file này có đúng như ý bạn không nhé
Không biết cột B của bạn dữ liệu nhập trực tiếp hay cho phép Copy & dán 1 hoặc nhiều cell cùng lúc nữa
Thôi kệ, có gì chưa đúng thì sửa sau vậy
Thân
 

File đính kèm

Xếp các chuổi giống nhau vào cùng một cột có điều kiện

Đầu tiên xin chân thành cảm ơn concogia (100% như ý rồi đúng là gội rồi mới cạo) và Nhờ anh em GPE giúp đỡ lần nữa "XẾP CÁC CHUỔI CÓ MÃ SỐ GIỐNG NHAU VÀO CÙNG MỘT CỘT CÓ ĐIỀU KIỆN" theo mô tả trong file sau đây.
trân trọng cảm ơn
 
Lần chỉnh sửa cuối:
Đầu tiên xin chân thành cảm ơn concogia (100% như ý rồi đúng là gội rồi mới cạo) và Nhờ anh em GPE giúp đỡ lần nữa "XẾP CÁC CHUỔI CÓ MÃ SỐ GIỐNG NHAU VÀO CÙNG MỘT CỘT CÓ ĐIỀU KIỆN" theo mô tả trong file sau đây.
trân trọng cảm ơn
Thử trong file này xem nhé
Chọn sheet "DICH" xem kết quả
Thân
 

File đính kèm

Cảm ơn bạn concogia, xin bạn thêm vài điều kiện như file kèm sau.
cảm ơn nhiều
 
Cảm ơn bạn concogia, xin bạn thêm vài điều kiện như file kèm sau.
cảm ơn nhiều
Những Mã ở kết quả là mình biết trước hay tìm được Mã nào gán Mã đó ??? Trong bài mình cứ tìm được Mã nào thì gán vào kết quả Mã đó
Sao bạn không đưa các kiểu dữ liệu lên một lần thôi nhỉ ???
Chọn sheet "DICH" xem kết quả
Thân
 

File đính kèm

Chào bác, chúc bác sức khỏe và nhờ bác giúp file có các kiểu dữ liệu mô tả như file sau
Cảm ơn bác!
 
Chào bác, chúc bác sức khỏe và nhờ bác giúp file có các kiểu dữ liệu mô tả như file sau
Cảm ơn bác!
Bác......nào ???
Má ơi, nhỏ lớn mới thấy cái dữ liệu gì đâu......thấy mà phát ớn
Híc, viết xong hổng biết trúng trật nhưng nhìn lại cũng chẳng biết mình viết cái gì nữa
Nhập vào cột B xong bạn kiểm tra giúp nhé, trúng thì tốt, trật thì ........nhờ Thầy ndu viết giúp nhé, mình muốn "tèo" rồi
Phải Híc 3 cái mới đủ, uống mấy lon về viết xong cái code này.......tỉnh luôn. Phí của "giời" thật
Híc, híc, híc :''":''":''"
 

File đính kèm

Chào bác, chúc bác sức khỏe và nhờ bác giúp file có các kiểu dữ liệu mô tả như file sau
Cảm ơn bác!

Bạn có thói quen là không miêu tả dữ liệu nên tôi thử đoán. Nếu đúng thì tốt, không đúng thì tôi kết thúc ở đây.
Đoán: các cụm từ được phân cách bởi dấu ";". Mỗi cụm từ gồm có: một số chữ cái và tiếp sau là "_", sau nữa là một số tự nhiên nào đó, tiếp theo là một loạt các cụm con (ít nhất là 1) - mỗi cụm con gồm 1 chữ cái (phải là 1 hay hay vd. ngẫu nhiên nó thế?) và sau nó là n chữ số với n ≥ 0. Cuối cùng là một số tự nhiên ở trong ngoặc.
Nếu đúng thế thì code cho sheet "mô tả"
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim objRegExp As Object, match_coll As Object, chuoi, Arr
Dim k As Long, n As Long, m As Long, index As Long, prefix As String, so_lap As Long, match_count As Long, so_text As String
    If Not Intersect(Target, Range("B3:B10000")) Is Nothing Then
        ReDim Arr(1 To 1)
        chuoi = Split(Target, ";")
        Set objRegExp = CreateObject("vbscript.regexp")
        With objRegExp
            .Global = True
            .IgnoreCase = True
            .Pattern = ".+_\d+|[A-Z]\d*|\(\d+"
        End With
        For k = LBound(chuoi) To UBound(chuoi)
            Set match_coll = objRegExp.Execute(chuoi(k))
            prefix = match_coll.Item(0)
            match_count = match_coll.Count
            so_text = match_coll.Item(match_count - 1)
            so_text = Right(so_text, Len(so_text) - 1)
            so_lap = CLng(so_text) \ (match_count - 2)
            ReDim Preserve Arr(1 To UBound(Arr) + CLng(so_text))
            For n = 1 To match_count - 2
                For m = 1 To so_lap
                    Arr(index + (n - 1) * so_lap + m) = prefix & match_coll.Item(n)
                Next m
            Next n
            index = index + CLng(so_text)
        Next k
        ReDim Preserve Arr(1 To UBound(Arr) - 1)
        Target.Offset(, 1).Resize(, 254).ClearContents
        Target.Offset(, 1).Resize(, UBound(Arr)) = Arr
    End If
End Sub
 
}}}}} Viết xong CODE này thì bạn bè thành viên trên GPE cám ơn bác rối rít thui, kiểu dữ liệu này rất có lợi cho nhiều người dùng; Xong vụ này chắc Microsof nghiên cứu trả lương cho bác thui. Cảm ơn, chúc sức khỏe và ngương mộ cogia.
coconvqgiap

Cảm ơn siwtomCODE này, Đúng là kiểu dữ liệu hơi rối, đây là một kiểu du lieu lien quan tới công việc rất nhiều người cần, họ đang chờ. Cảm ơn, chúc sức khỏe siwtom

vqgiap

Chào thầy ndu96081631, kính chúc Thầy sức khỏe, bình an, hạnh phúc. Qua giới thiệu của bác concogia nên tôi mạnh dạn xưng hô... và nhờ thầy giúp đỡ cho kiểu dữ liệu trong file kèm sau
Cảm ơn thầy nhìu
 
Chỉnh sửa lần cuối bởi điều hành viên:
Anh ơi , khi ta dung cú pháp này : thì chuỗi 1234abcd sẽ thành 1234, nhưng nếu có thêm số 0 nữa nghĩa là : 01234abcd thì nó ko lấy cả số 0, vẫn 1234. Anh giúp em với ^^ em muốn lọc thành 01234
 
Chỉnh sửa lần cuối bởi điều hành viên:

Đây là bài "tách số ra khỏi chuỗi" nhưng thực ra là tách giá trị của số ra khỏi chuỗi. Vd : chuối 1234abcd ra là 1234, tôi cũng cần dùng code này nhưng muốn tách "các ký tự số" ra chứ ko phải giá trị. VD: chuỗi 01234abcd ~> tôi muốn : 01234 chứ ko phải như code này là 1234. Các anh chị giúp dùm. Cảm ơn

 
Đây là bài "tách số ra khỏi chuỗi" nhưng thực ra là tách giá trị của số ra khỏi chuỗi. Vd : chuối 1234abcd ra là 1234, tôi cũng cần dùng code này nhưng muốn tách "các ký tự số" ra chứ ko phải giá trị. VD: chuỗi 01234abcd ~> tôi muốn : 01234 chứ ko phải như code này là 1234. Các anh chị giúp dùm. Cảm ơn

Bạn đưa cái code bạn đang dùng hoặc đưa tất cả kiểu dữ liệu của bạn & kết quả bạn muốn có lên đi chứ như thế này biết gì đâu mà giúp bạn
Thân
 
Mã:
Private Sub Worksheet_Activate()    Dim Vung As Range, i As Long, A As Long, d As Object, Cll As Range, Ma As String, k As Long, kK As Long
    Set Vung = Sheets("Data1").UsedRange
    Set d = CreateObject("scripting.dictionary")
    Sheets("LOC").UsedRange.Offset(1).ClearContents
    For Each Cll In Vung.Offset(2)
        If Cll <> "" Then
            A = InStr(Cll, "-")
            For i = 1 To A
                If IsNumeric(Mid(Cll, i, 1)) Or Mid(Cll, i, 1) = "(" Then
                    Ma = Mid(Cll, i, A - i)
                    If Not d.Exists(Ma) Then
                        kK = kK + 1
                        d.Add Ma, kK
                        Sheets("LOC").[A1].Offset(1, kK - 1) = Ma
                        Cells(50000, kK).End(xlUp)(2) = Cll
                        Exit For
                    Else
                        k = d.Item(Ma)
                        Cells(50000, k).End(xlUp)(2) = Cll
                        Exit For
                    End If
                End If
            Next i
        End If
    Next Cll
End Sub
Chào bạn, nhờ bạn giúp tôi như thế này nhé: Nếu tôi nhập sai dữ liệu so với yêu cầu của code này thì nó hiện bảng thông báo "Nhập sai mẫu, xem ví dụ tại Ô G3"
Sai khác dấu ";" và "_"
cảm ơn bạn
 
Lần chỉnh sửa cuối:
Chào bạn, nhờ bạn giúp tôi như thế này nhé: Nếu tôi nhập sai dữ liệu so với yêu cầu của code này thì nó hiện bảng thông báo "Nhập sai mẫu, xem ví dụ tại Ô G3"
Sai khác dấu ";" và "_"
cảm ơn bạn

Bạn hãy:

1. Miêu tả thật kỹ dữ liệu của mình. Mẫu miêu tả để bạn bắt chước: xem bài #40.
2. Gửi tập tin với vài dữ liệu lên.

Có được như thế mới tới khâu "xét đơn yêu cầu". Xét có nghĩa là chấp nhận đơn mà cũng có thể không. Nói cách khác 2 yêu cầu trên chỉ là đk cần chứ không là đk đủ.
 
Thử trong file này xem nhé
Chọn sheet "DICH" xem kết quả
Thân
Chào sư phụ, nhờ sư phụ giúp tôi như thế này nhé: Nếu tôi nhập sai dữ liệu so với yêu cầu của code này thì nó hiện bảng thông báo "Nhập sai mẫu, xem ví dụ tại Ô G3"
Sai khác dấu ";" và "_"
cảm ơn bạn
 

File đính kèm

Có cao thủ nào giúp em vụ này với, em cảm ơn
 
Bác......nào ???
Má ơi, nhỏ lớn mới thấy cái dữ liệu gì đâu......thấy mà phát ớn
Híc, viết xong hổng biết trúng trật nhưng nhìn lại cũng chẳng biết mình viết cái gì nữa
Nhập vào cột B xong bạn kiểm tra giúp nhé, trúng thì tốt, trật thì ........nhờ Thầy ndu viết giúp nhé, mình muốn "tèo" rồi
Phải Híc 3 cái mới đủ, uống mấy lon về viết xong cái code này.......tỉnh luôn. Phí của "giời" thật
Híc, híc, híc :''":''":''"
Sư phụ ơi giúp em một chút ở #48 vớí, em cảm ơn
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom