Tách chuỗi bắt đầu từ chữ cái đầu tiên tìm thấy trong chuỗi (trong chuỗi có space)

Trạng thái
Không mở trả lời sau này.
Chào tuhocvba.net
Sau khi xem trên youtube về vba01 sử dụng for next
Mình có áp dụng vào 1 bài toán Tách chuỗi bắt đầu từ chữ cái đầu tiên tìm thấy trong chuỗi
Nhưng do trong chuỗi gốc có chứa khoảng trắng ở cả trước và sau chữ cái đầu tiên nên mình chưa ra được kết quả như ý
Mình gửi link file nhờ mọi người giúp đỡ
Xin cảm ơn
 

tuhocvba

Administrator
Thành viên BQT
Chào tuhocvba.net
Sau khi xem trên youtube về vba01 sử dụng for next
Mình có áp dụng vào 1 bài toán Tách chuỗi bắt đầu từ chữ cái đầu tiên tìm thấy trong chuỗi
Nhưng do trong chuỗi gốc có chứa khoảng trắng ở cả trước và sau chữ cái đầu tiên nên mình chưa ra được kết quả như ý
Mình gửi link file nhờ mọi người giúp đỡ
Xin cảm ơn
Chào bạn, để xóa space, bạn dùng lệnh replace.
Tuy nhiên, để không làm thay đổi nội dung vốn có của dữ liệu, mình khai báo thêm biến temp và xử lý trên temp.
Mã:
Sub Button1_Click()
Dim a, b As Integer
Dim lr As Long
Dim temp    As String   '27/5/2019 tuhocvba

With Sheets("sheet1")
lr = .Cells(.Rows.Count, "A").End(xlUp).Row
Range("B2:B" & lr).ClearContents
End With
For b = 2 To lr
For a = 1 To Len(Cells(b, 1))
    temp = Cells(b, 1).Value '27/5/2019 tuhocvba
    temp = Replace(temp, " ", "") '27/5/2019 tuhocvba: Loai bo space
    
    If Not IsNumeric(Mid(temp, a, 1)) Then   'tuhocvba: sua code 27/5/2019
    Cells(b, 2) = Mid(temp, a, 100) 'tuhocvba sua code 27/5/2019
    
    Exit For
    End If
Next a
Next b

End Sub
Kết quả:
Bạn cần đăng nhập để thấy hình ảnh
 
Chào bạn, để xóa space, bạn dùng lệnh replace.
Tuy nhiên, để không làm thay đổi nội dung vốn có của dữ liệu, mình khai báo thêm biến temp và xử lý trên temp.
Mã:
Sub Button1_Click()
Dim a, b As Integer
Dim lr As Long
Dim temp    As String   '27/5/2019 tuhocvba

With Sheets("sheet1")
lr = .Cells(.Rows.Count, "A").End(xlUp).Row
Range("B2:B" & lr).ClearContents
End With
For b = 2 To lr
For a = 1 To Len(Cells(b, 1))
    temp = Cells(b, 1).Value '27/5/2019 tuhocvba
    temp = Replace(temp, " ", "") '27/5/2019 tuhocvba: Loai bo space

    If Not IsNumeric(Mid(temp, a, 1)) Then   'tuhocvba: sua code 27/5/2019
    Cells(b, 2) = Mid(temp, a, 100) 'tuhocvba sua code 27/5/2019

    Exit For
    End If
Next a
Next b

End Sub
Kết quả:
Cảm ơn bạn. Mình sẽ nghiên cứu thêm cách này. Ngoài cách của bạn. Mình cũng tìm thêm được 1 cách khác
sửa
Mã:
If Not IsNumeric(Mid(Cells(b, 1), a, 1)) Then
thành
Mã:
If Not IsNumeric(Mid(Replace(Cells(b, 1), " ", 0), a, 1)) Then
vì đoạn này đặt trước thao tác trích xuất ký tự nên nó biến các space thành số 0 rồi tìm từ ký tự đầu tiên cho đến ký tự chữ cái thì nó cũng dừng lại
ví du: 1111 0000 90 4 19 NGUYEN HONG QUANG 05 06 1995 sẽ thành---->NGUYEN HONG QUANG 05 06 1995

Còn nếu thay thế toàn bộ các space kể từ ký tự chữ đầu tiên
thì sửa
Mã:
If Not IsNumeric (Mid(Cells(b, 1), a, 1)) Then
Cells(b, 2) = Mid(Cells(b, 1), a, 100)
bổ sung replace vào trước mid thành
Mã:
If Not IsNumeric(Mid(Replace(Cells(b, 1), " ", ""), a, 1)) Then
Cells(b, 3) = Mid(Replace(Cells(b, 1), " ", ""), a, 100)
ví dụ: 1111 0000 90 4 19 NGUYEN HONG QUANG 05 06 1995 sẽ thành---->NGUYENHONGQUANG05061995
 
Sửa lần cuối:

Euler

Administrator
Thành viên BQT
Mình cũng tìm thêm được 1 cách khác
Nói là cách khác nhưng mình thấy vẫn sử dụng các hàm: Mid (tách lấy ký tự hoặc chuỗi ký tự), Replace (đổi ký tự), Isnumeric(kiểm tra là số hay không).
Vì vậy bản chất thì tương tự nhau, không có gì mới, tốc độ cũng không có khác biệt nữa.
 

tuhocvba

Administrator
Thành viên BQT
Thật ra code trên vẫn còn chỗ để cải thiện, ví dụ :
Mã:
Mid(Cells(b, 1), a, 100)
Tại sao lại là 100? Nếu chuỗi có đội dài hơn 100 kể từ vị trí a thì sao? Cái này là người code thừa nhận chuỗi ký tự có đội dài không vượt quá 100, nên code như vậy. Thực tế cần phải tính độ dài chuỗi ký tự ấy bằng lệnh
Mã:
len(string1)
, bây giờ lấy từ vị trí a cho tới hết độ dài của string1 thì phải là:
Mã:
len(string1)-a + 1
Tức là code trên cần sửa là:
Mã:
Mid(Cells(b, 1), a, len(Cells(b, 1).text)-a + 1)
Hàm len lấy độ dài của một chuỗi ký tự.
 
Trạng thái
Không mở trả lời sau này.
Top