Hàm tách và nối các ký tự

  • Thread starter Hồng Phương
  • Ngày gửi
Trạng thái
Không mở trả lời sau này.
H

Hồng Phương

Guest
Em nhờ anh chị viết giúp hàm như trong hình ảnh
Em cảm ơn các anh chị!
Bạn cần đăng nhập để thấy đính kèm
 

giaiphapvba

Administrator
Thành viên BQT
Không biết như thế này đã đúng ý bạn chưa?
Mã:
'Input: Dien dan tu hoc vb;a
'Output:
Function tachkytuc(ByVal s As String) As String
    Dim i   As Integer
    Dim n   As Integer
    Dim tem As String
    Dim kq  As String 'Ket qua
    
    Const hs1   As String = "; "
    n = Len(s) 'Chieu dai chuoi ky tu s
    kq = ""
    If n = 0 Then Exit Function 'thoat khoi ham
    For i = 1 To n Step 1
        tem = Mid(s, i, 1) 'lay mot ky tu o vi tri i chieu dai la 1 trong s
        If InStr(1, hs1, tem) > 0 Then
             'Nếu ký tự là ; hoặc khoảng trống " " thì không lấy
        Else
            kq = kq & "," & tem 'Ket qua: ,D,i,e,n,d,a,n,t,u,h,o,c,v,b,a
        End If
    Next i
    tachkytuc = Right(kq, Len(kq) - 1)
End Function
Bạn cần đăng nhập để thấy đính kèm
 

vbano1

SMod
Thành viên BQT
Có vẻ như tác giả muốn làm việc với 3 cells.
Nếu thế thì thêm hàm này vào cùng với .
Mã:
Function main_tachkytu(ByVal s1 As String, ByVal s2 As String, ByVal s3 As String) As String
    main_tachkytu = tachkytuc(s1) & "," & tachkytuc(s2) & tachkytuc(s3)
End Function
Bạn cần đăng nhập để thấy đính kèm

Kết quả:
Bạn cần đăng nhập để thấy đính kèm
 
H

Hồng Phương

Guest
Em cảm ơn chị
Hàm không đúng và không chạy được chị
giaiphapvba
 

vbano1

SMod
Thành viên BQT
Bạn xem lại đã copy chính xác chưa. Mình chạy ầm ầm mà.
Mã:
'Input: Dien dan tu hoc vb;a
'Output:
Function tachkytuc(ByVal s As String) As String
    Dim i   As Integer
    Dim n   As Integer
    Dim tem As String
    Dim kq  As String 'Ket qua
    
    Const hs1   As String = "; "
    n = Len(s) 'Chieu dai chuoi ky tu s
    kq = ""
    If n = 0 Then Exit Function 'thoat khoi ham
    For i = 1 To n Step 1
        tem = Mid(s, i, 1) 'lay mot ky tu o vi tri i chieu dai la 1 trong s
        If InStr(1, hs1, tem) > 0 Then
        Else
            kq = kq & "," & tem 'Ket qua: ,D,i,e,n,d,a,n,t,u,h,o,c,v,b,a
        End If
    Next i
    tachkytuc = Right(kq, Len(kq) - 1)
End Function
Function main_tachkytu(ByVal s1 As String, ByVal s2 As String, ByVal s3 As String) As String
    main_tachkytu = tachkytuc(s1) & "," & tachkytuc(s2) & tachkytuc(s3)
End Function
Chạy hàm main_tachkytu ấy. Đâu vào là 3 cells.
 
H

Hồng Phương

Guest
vbano1

Chị oi, nếu chon từng cell thì công thức hoạt động được, nhưng chọn vùng thì lại không hoạt được
chị sửa lại giúp em là vừa chọn được vùng và chọn được ô liên tục chị nhé
 

giaiphapvba

Administrator
Thành viên BQT
Nếu chọn vùng liên tục thì đơn giản.
Bạn cần đăng nhập để thấy đính kèm

Mã:
'Input: Dien dan tu hoc vb;a
'Output: D,i,e,n,d,a,n,t,u,h,o,c,v,b,a
Function tachkytu(ByVal s As String) As String
    Dim i   As Integer
    Dim n   As Integer
    Dim tem As String
    Dim kq  As String 'Ket qua
    
    Const hs1   As String = "; "
    n = Len(s) 'Chieu dai chuoi ky tu s
    kq = ""
    If n = 0 Then Exit Function 'thoat khoi ham
    For i = 1 To n Step 1
        tem = Mid(s, i, 1) 'lay mot ky tu o vi tri i chieu dai la 1 trong s
        If InStr(1, hs1, tem) > 0 Then
        Else
            kq = kq & "," & tem 'Ket qua: ,D,i,e,n,d,a,n,t,u,h,o,c,v,b,a
        End If
    Next i
    tachkytu = Right(kq, Len(kq) - 1)
End Function
Function submain_tachkytu(ByVal r As Range) As String
    Dim arr As Variant
    Dim i As Integer
    Dim j As Integer
    Dim kq As String
    
    On Error Resume Next
    arr = r.Value
    For i = LBound(arr, 1) To UBound(arr, 1) Step 1
        For j = LBound(arr, 2) To UBound(arr, 2) Step 1
            kq = kq & "," & tachkytu(CStr(arr(i, j)))
        Next j
    Next i
    submain_tachkytu = Right(kq, Len(kq) - 1)
End Function
 

Euler

Administrator
Thành viên BQT
Tôi nhận thức rằng topic này đã được hỗ trợ đầy đủ. Vì vậy cho phép tôi khóa topic này tại đây.
Bạn cần đăng nhập để thấy đính kèm
 
H

Hồng Phương

Guest
Chị
giaiphapvba
Ý em muốn là vừa chọn vùng liên tục và vừa chọn vùng rời rạc cơ chị oi
em cảm ơn các anh chị
Chị sửa giúp em với chị nhé
 
H

Hồng Phương

Guest
Dạ đúng rồi chị vbano1
Chị giúp em với chị nhé
Em cảm ơn chị!
 

giaiphapvba

Administrator
Thành viên BQT
Như vậy ý bạn là như thế này có phải không?
Bạn cần đăng nhập để thấy hình ảnh

Tốt nhất bạn dùng hình ảnh minh họa cho dễ hiểu.
 
S

Snow24

Guest
@Hồng Phương Bạn thử.
Mã:
Function tach(ParamArray mang())
         Dim T, T1, s As String, i As Integer
         For Each T In mang
            For Each T1 In T
                If T1 <> Empty Then
                    T1 = Replace(T1, ";", "")
                    T1 = Replace(T1, " ", "")
                    For i = 1 To Len(T1)
                       s = s & "," & Mid(T1, i, 1)
                    Next i
                 End If
            Next
        Next
        tach = Right(s, Len(s) - 1)
End Function
 

vbano1

SMod
Thành viên BQT
Kết quả của @Snow24 không theo thứ tự ưu tiên mà tác giả nêu rồi.
Ưu tiên dòng trước, cột sau.
Như vậy kết quả mong muốn là Trung Quoc Lien Bang Xo Viet... rồi mới chạy tới Anh Phap.
Bạn cần đăng nhập để thấy đính kèm
 
S

Snow24

Guest
@vbano1 Cái này là do sắp xếp mình đưa vào thế nào nó sẽ sắp xếp như vậy nếu muốn Anh phap ở cuối thì mình có thể tách nó ra cho nó ở cuối hàm là được.Chứ không thể viết hàm tổng quát mà theo người dùng được.Do người dùng sắp xếp thôi.
 

vbano1

SMod
Thành viên BQT
@Snow24 :Theo nội dung đã xác nhận với tác giả topic, ở bài viết này
Mình chọn hai vùng Range và hỏi thứ tự ưu tiên. Thì câu trả lời được thể hiện ở đây, thứ tự ưu tiên như vậy là đúng.
 
H

Hồng Phương

Guest
Em cảm ơn anh @Snow24 (@Snow25) hàm đã đạt yêu cầu
Em xin cảm ơn toàn bộ các anh chị @vbano1 @giaiphapvba ............
Chúc các anh chị thành đạt
 

vbano1

SMod
Thành viên BQT
Ồ, vậy là nội dung bạn đã xác nhận với tôi là sai hả?
Theo như tôi hiểu, là bạn muốn ưu tiên hàng trước, cột sau. Vì vậy bài toán lúc này trở nên phức tạp đi rất nhiều, trong vô số các vùng range người dùng chọn, đan xen cột và dòng, phải xét duyệt dòng thấp -> dòng cao, cột thấp -> cột cao.
Bạn có nghĩ là lần sau bạn nên cải thiện lại trình bày để tránh việc người khác hiểu sai mục đích của bạn không?
 
H

Hồng Phương

Guest
Chị vbano1 oi
Ý của em là nếu chọn vùng nào trước thì sẽ lấy vùng đó trước sau đó thì sẽ lần lượt lấy các vùng chọn theo thứ tự. (Nếu như trong 1 vùng chọn mà có nhiều dòng và nhiều cột thì sẽ ưu tiên dòng trước chị à).
 

vbano1

SMod
Thành viên BQT
Tôi vừa đọc lại cả topic, không thấy chỗ nào chọn trước thì làm trước. Nếu rõ ràng yêu cầu ngay từ đầu như vậy, bài toán này mức độ khó là 0. Gõ code 2 phút. Tôi khá bực vì mất thời gian vô ích do hiểu sai mục đích của bạn.
 
Trạng thái
Không mở trả lời sau này.
Top