tự động tách số ra khỏi chuỗi

Liên hệ QC

Cu Tồ

Tìm đến kiến thức! ꧁༺ Cu Tồ ༻꧂
Tham gia
6/5/20
Bài viết
735
Được thích
347
Chào anh chị trong diễn đàn!
em có vấn đề mong các anh chị giúp đỡ,trong bảng tính của e có một cột chứa mã hàng.em muốn tách số mã hàng ra khỏi chuỗi đó, mã hàng có quy luật là nằm sau chữ zd ạ, ví dụ : " mã hàng zd5028342394823 số địa chỉ 123123" .em muốn lúc chạy code cột mã hàng sẽ chỉ còn mã hàng là số 5028342394823 ,xóa các ký tự còn lại hoặc cho sang cột khác cũng được,vì dữ liệu 3 nghìn dòng trở lên nên e muốn anh chị giúp việt code ạ.em cảm ơn nhiều ạ.
 
Chào anh chị trong diễn đàn!
em có vấn đề mong các anh chị giúp đỡ,trong bảng tính của e có một cột chứa mã hàng.em muốn tách số mã hàng ra khỏi chuỗi đó, mã hàng có quy luật là nằm sau chữ zd ạ, ví dụ : " mã hàng zd5028342394823 số địa chỉ 123123" .em muốn lúc chạy code cột mã hàng sẽ chỉ còn mã hàng là số 5028342394823 ,xóa các ký tự còn lại hoặc cho sang cột khác cũng được,vì dữ liệu 3 nghìn dòng trở lên nên e muốn anh chị giúp việt code ạ.em cảm ơn nhiều ạ.
Thử code dưới đây.
Số liệu nhập tại cột A, sheet1, bắt đầu từ A1. Kết quả ghi tại cột C
Mã:
Option Explicit

Sub tachmahang()
Dim sArr
Dim res() As String
Dim i, j, k
sArr = Sheet1.Range("A1").CurrentRegion
k = UBound(sArr)
ReDim res(1 To k, 1 To 1)
With CreateObject("VBscript.RegExp")
    .Pattern = "\d+"
    For i = 1 To k
        If .test(sArr(i, 1)) Then
            res(i, 1) = .Execute(sArr(i, 1))(0)
        End If
    Next i
    Sheet1.Range("C1").Resize(k, 1) = res
End With
End Sub
 
Upvote 0
Thử code dưới đây.
Số liệu nhập tại cột A, sheet1, bắt đầu từ A1. Kết quả ghi tại cột C
Mã:
Option Explicit

Sub tachmahang()
Dim sArr
Dim res() As String
Dim i, j, k
sArr = Sheet1.Range("A1").CurrentRegion
k = UBound(sArr)
ReDim res(1 To k, 1 To 1)
With CreateObject("VBscript.RegExp")
    .Pattern = "\d+"
    For i = 1 To k
        If .test(sArr(i, 1)) Then
            res(i, 1) = .Execute(sArr(i, 1))(0)
        End If
    Next i
    Sheet1.Range("C1").Resize(k, 1) = res
End With
End Sub
cảm ơn bác nhiệt tình giúp đỡ à,e đã thử code và chạy đúng ạ.nhưng bác có thể chỉ cho e các tùy biến code một tí được không ạ,code của bác là dò đến chỗ có số là lấy,nhưng nếu như trước dãy mã hàng có những số khác ví dụ như là "nhà 02 mã hàng 453895735034 địa chỉ 034" chẳng hạn,nếu như muốn cố định quy tắc lấy mã hàng là sau chữ "mã hàng" lấy hết dãy số thì có được không ạ? kết quả sẽ là 453895735034 ạ
 
Upvote 0
cảm ơn bác nhiệt tình giúp đỡ à,e đã thử code và chạy đúng ạ.nhưng bác có thể chỉ cho e các tùy biến code một tí được không ạ,code của bác là dò đến chỗ có số là lấy,nhưng nếu như trước dãy mã hàng có những số khác ví dụ như là "nhà 02 mã hàng 453895735034 địa chỉ 034" chẳng hạn,nếu như muốn cố định quy tắc lấy mã hàng là sau chữ "mã hàng" lấy hết dãy số thì có được không ạ? kết quả sẽ là 453895735034 ạ
Bạn lập 1 file mẫu gửi lên, chắc là sẽ giải quyết được thôi.
 
Upvote 0
đây là file mẫu ạ mong bác giúp đỡ ạ
Bạn chạy code dưới đây
Mã:
Option Explicit

Sub tachmahang()
Dim sArr
Dim res() As String
Dim i, j, k
sArr = Sheet1.Range("I1:I8")
k = UBound(sArr)
ReDim res(1 To k, 1 To 1)
With CreateObject("VBscript.RegExp")
    .Pattern = "\d{12}"
    For i = 1 To k
        If .test(sArr(i, 1)) Then
            res(i, 1) = .Execute(sArr(i, 1))(0)
        End If
    Next i
    Sheet1.Range("K1").Resize(k, 1) = res
End With
End Sub
 
Upvote 0
Bạn chạy code dưới đây
Mã:
Option Explicit

Sub tachmahang()
Dim sArr
Dim res() As String
Dim i, j, k
sArr = Sheet1.Range("I1:I8")
k = UBound(sArr)
ReDim res(1 To k, 1 To 1)
With CreateObject("VBscript.RegExp")
    .Pattern = "\d{12}"
    For i = 1 To k
        If .test(sArr(i, 1)) Then
            res(i, 1) = .Execute(sArr(i, 1))(0)
        End If
    Next i
    Sheet1.Range("K1").Resize(k, 1) = res
End With
End Sub
chạy tốt luôn bác ạ,code này là đếm chuỗi số 12 số là lấy hả bác?
Bài đã được tự động gộp:

cảm ơn bác rất nhiều ạ
 
Lần chỉnh sửa cuối:
Upvote 0
chạy tốt luôn bác ạ,code này là đếm chuỗi số 12 số là lấy hả bác?
Bài đã được tự động gộp:

cảm ơn bác rất nhiều ạ
Đúng vậy bạn.
code này chỉ phù hợp với mẫu có duy nhất 1 chuỗi số 12 ký tự. Nếu có nhiều hơn 1 chuỗi 12 số, nó sẽ trả về kết quả là chuỗi đầu tiên
 
Upvote 0
Cái này làm đúng theo tinh thần Regex thì phải dùng "mã hàng " làm mốc dòm ngược (lookbehind).
Nhưng rất tiếc VBScript regex không hổ trợ dòm ngược.
Vì v ậy, phải dùng thủ thuật match đôi
pattern = "(mã hàng )(\d+)" ' (chỉnh ã và à theo đúng unicode)
Sau kni test, trích lấy cái được captured text thứ hai. (cái captured text thứ nhất là "mã hàng "
Hoặc dùng
pattern = "mã hàng \d+"
và sau đó cắt bỏ "mã hàng"
 
Upvote 0
Đúng vậy bạn.
code này chỉ phù hợp với mẫu có duy nhất 1 chuỗi số 12 ký tự. Nếu có nhiều hơn 1 chuỗi 12 số, nó sẽ trả về kết quả là chuỗi đầu tiên
vâng ạ,e cũng hiểu mang máng thế nhưng trình độ e còn kém qua
Bài đã được tự động gộp:

Cái này làm đúng theo tinh thần Regex thì phải dùng "mã hàng " làm mốc dòm ngược (lookbehind).
Nhưng rất tiếc VBScript regex không hổ trợ dòm ngược.
Vì v ậy, phải dùng thủ thuật match đôi
pattern = "(mã hàng )(\d+)" ' (chỉnh ã và à theo đúng unicode)
Sau kni test, trích lấy cái được captured text thứ hai. (cái captured text thứ nhất là "mã hàng "
Hoặc dùng
pattern = "mã hàng \d+"
và sau đó cắt bỏ "mã hàng"
cảm ơn bác gọp ạ,theo như bác thì nếu như mã hàng là chứ không dấu hoặc chuỗi ký tự khác unicode như là tiếng anh hoặc tiếng hoa thì sẽ dùng được cách mà bác nói ạ?
 
Upvote 0
Web KT

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

Back
Top Bottom