Sắp xếp chuỗi các kí tự kèm theo số theo thứ tự tăng dần sau mỗi dấu phẩy.

Liên hệ QC

th7

Thành viên thường trực
Tham gia
3/3/15
Bài viết
215
Được thích
52
Giới tính
Nam
Chào các Bạn trong diễn đàn,
Mình có vấn đề cần các Bạn hỗ trợ như dưới.

Thực tế dữ liệuMong muốn
R53,R92,R72R53,R72,R92
C96,C18,C20C18,C20,C96
R68,R13,R69,R12,R14,R15R12,R13,R14,R15,R68,R69
QR107,QR26QR26,QR107
Các cụm chữ và số sắp xếp lộn xộn, không theo thứ tự sau mỗi dấy phẩy.Các cụm chữ và số được sắp xếp theo thứ tự tăng dần của số đếm sau mỗi dấu phẩy

Các bạn xem qua hỗ trợ mình với nha,
Cảm ơn!
 

File đính kèm

  • Sắp xếp chuối tăng dần sau dấu phẩy.xlsx
    9.1 KB · Đọc: 16
Chào các Bạn trong diễn đàn,
Mình có vấn đề cần các Bạn hỗ trợ như dưới.

Thực tế dữ liệuMong muốn
R53,R92,R72R53,R72,R92
C96,C18,C20C18,C20,C96
R68,R13,R69,R12,R14,R15R12,R13,R14,R15,R68,R69
QR107,QR26QR26,QR107
Các cụm chữ và số sắp xếp lộn xộn, không theo thứ tự sau mỗi dấy phẩy.Các cụm chữ và số được sắp xếp theo thứ tự tăng dần của số đếm sau mỗi dấu phẩy

Các bạn xem qua hỗ trợ mình với nha,
Cảm ơn!
Một cách dùng power pivot
 

File đính kèm

  • Sắp xếp chuối tăng dần sau dấu phẩy.xlsx
    109 KB · Đọc: 19
Upvote 0
Em chào Anh ndu96081631,
Dữ liệu dạng đan xen tên khác nhau, thực sự là bên em chạy cũng gần 3000 chương trình, nhưng mới chỉ gặp được khoảng 2 hoặc 3 chương trình có trường hợp trên thôi ạ, còn lại là tên theo quy luật, một kí tự đại diện cho tên linh kiện.
Em có đính kèm một file BOM và các file .txt xuất sau khi làm chương trình để tham khảo ạ.
Còn Code của Anh huuthang_bd, lúc em để vô kiểm tra, thấy không chạy được, nên cũng chưa biết lý do, Cảm ơn Anh chia sẻ thông tin.
Dùng ArrayList, Sort Số và chuỗi ngăn cách bằng dấu ","
Mã:
Function Sort_Str_Num(ByVal iStr As String, Optional MaxLen& = 20) As String
  'MaxLen: so ky tu lon nhat cua chuoi Sort
  Dim S, sList As Object, tmp$, i&, j&

  If iStr <> Empty Then
    Set sList = CreateObject("System.Collections.ArrayList")
    S = Split(iStr, ",")
    For i = 0 To UBound(S)
      tmp = S(i) & "0"
      For j = 1 To Len(tmp)
        If IsNumeric(Mid(tmp, j, 1)) Then
          tmp = Mid(tmp, 1, j - 1) & Space(MaxLen - Len(tmp) + 1) & Mid(tmp, j, Len(tmp) - j)
          sList.Add tmp
          Exit For
        End If
      Next j
    Next i
    sList.Sort
    Sort_Str_Num = Replace(Join(sList.ToArray, ","), " ", "")
    Set sList = Nothing
  End If
End Function
Thêm lệnh Sort trong file
Mã:
Sub Main()
  Dim aSheets(), Res(), Dic As Object
  Dim FilesToOpen$, shName$
  Dim i&, N&, k&
  Dim Chk As Boolean
 
  Chk = Application.FileDialog(msoFileDialogFilePicker).Show
  If Not Chk Then Exit Sub
  aSheets = Array("Line SMT1", "Line SMT2", "Line SMT3", "Line SMT2-3") ' Declare line name
  Set Dic = CreateObject("scripting.dictionary")
 
 
  With Application.FileDialog(msoFileDialogFilePicker).SelectedItems
    For N = 1 To .Count
      FilesToOpen = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(N)
      Call CreatRes(Res, Dic, shName, k, FilesToOpen)
      For i = 1 To k
        If Res(i, 3) <> Empty Then Res(i, 3) = Sort_Str_Num(Res(i, 3))
      Next i
      For i = 0 To 3 ' Rule for sheets
        If aSheets(i) = "Line " & shName Then
          With Sheets(aSheets(i))
            .UsedRange.ClearContents
            .Range("C2").Resize(k).NumberFormat = "@"
            .Range("B2").Resize(k, 7) = Res
          End With
        End If
      Next i
      Dic.RemoveAll
    Next N
  End With
End Sub

Function Sort_Str_Num(ByVal iStr As String, Optional MaxLen& = 20) As String
  'MaxLen: so ky tu lon nhat cua chuoi Sort
  Dim S, sList As Object, tmp$, i&, j&

  If iStr <> Empty Then
    Set sList = CreateObject("System.Collections.ArrayList")
    S = Split(iStr, ",")
    For i = 0 To UBound(S)
      tmp = S(i) & "0"
      For j = 1 To Len(tmp)
        If IsNumeric(Mid(tmp, j, 1)) Then
          tmp = Mid(tmp, 1, j - 1) & Space(MaxLen - Len(tmp) + 1) & Mid(tmp, j, Len(tmp) - j)
          sList.Add tmp
          Exit For
        End If
      Next j
    Next i
    sList.Sort
    Sort_Str_Num = Replace(Join(sList.ToArray, ","), " ", "")
    Set sList = Nothing
  End If
End Function

Private Sub CreatRes(Res, Dic, shName, k, ByVal FilesToOpen As String)
  Dim fso As Object, TextSource As Object
  Dim S, tArr, Sign(), iCol()
  Dim str$, tmp$, iKey$, prName$
  Dim i&, fR&, fR2&, eR&, N&
 
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set TextSource = fso.OpenTextFile(FilesToOpen, 1, False, -2)
  tArr = Split(TextSource.ReadAll, vbCrLf)
 
  ReDim Res(1 To UBound(tArr), 1 To 8)
  ReDim sArr(1 To UBound(tArr), 1 To 2)
  For i = LBound(tArr) To UBound(tArr)
    str = tArr(i)
    If InStr(str, "Program Name") Then
      prName = Replace((Split(Split(str, "=")(1), ".")(0)), " ", "")
    ElseIf InStr(str, "Line Name") Then
      S = Split(str, "=")
      shName = Replace(S(UBound(S)), " ", "")
      prName = prName
      fR = i + 1: Exit For
    End If
  Next i
 
  Sign = Array("Feeder Position", "Component Name", "Comment", " Type", "Component pitch", "Lane")
  ReDim iCol(LBound(Sign) To UBound(Sign))
  For i = fR To UBound(tArr)
    str = tArr(i)
    If InStr(str, Sign(0)) Then
      eR = i - 1
      For N = LBound(Sign) To UBound(Sign)
        iCol(N) = InStr(str, Sign(N))
      Next N
      fR2 = i: Exit For
    End If
  Next i
  k = 0
  For i = fR2 To UBound(tArr)
    str = tArr(i)
    If InStr(str, Sign(0)) Then
      k = k + 1: m = m + 1: ik = k
        For N = i - 2 To i - 1
            If InStr(tArr(N), "Machine") Then
            Res(k, 1) = "Line Name " & shName & " / " & Application.Trim(tArr(N)) & " / Program Name: " & prName
            Res(k, 4) = "Simulate time(s)"
            Res(k, 6) = "No. of comp.ts"
        Exit For
            End If
       Next N
    ElseIf Mid(Application.Trim(str), 2, 1) = "-" Then
      k = k + 1
      Res(k, 1) = Application.Trim(Mid(str, iCol(0), iCol(1) - iCol(0)))
      iKey = Application.Trim(Mid(str, iCol(1), iCol(2) - iCol(1)))
      Dic.Item(iKey) = Array(k, ik)
      S = Split(iKey, " ")
      Res(k, 2) = S(1): Res(k, 4) = S(0)
      tmp = Application.Trim(Mid(str, iCol(3), iCol(4) - iCol(3)))
      Res(k, 5) = Mid(tmp, InStr(1, tmp, " ") + 1, Len(tmp))
      Res(k, 6) = Split(Application.Trim(Mid(str, iCol(4), iCol(5) - iCol(4))), " ")(0)
    End If
  Next i
 
  Sign = Array("Placement ID", "X", "Component Name", "Centering")
  ReDim iCol(LBound(Sign) To UBound(Sign))
  For i = fR To eR
    str = tArr(i)
    If InStr(str, Sign(0)) Then
      For N = LBound(Sign) To UBound(Sign)
        iCol(N) = InStr(str, Sign(N))
      Next N
      fR = i + 1: Exit For
    End If
  Next i
  k = k + 1
  Res(k, 6) = "Total placements"
  For i = fR To UBound(tArr)
    str = tArr(i)
    iKey = Application.Trim(Mid(str, iCol(2), iCol(3) - iCol(2)))
    S = Dic.Item(iKey)
    If TypeName(S) = "Variant()" Then
      If Res(S(0), 3) = Empty Then
        Res(S(0), 3) = Application.Trim(Mid(str, iCol(0), iCol(1) - iCol(0)))
      Else
        Res(S(0), 3) = Res(S(0), 3) & "," & Application.Trim(Mid(str, iCol(0), iCol(1) - iCol(0)))
      End If
      Res(S(0), 7) = Res(S(0), 7) + 1
      Res(S(1), 7) = Res(S(1), 7) + 1
      Res(k, 7) = Res(k, 7) + 1
    End If
  Next i
  Set fso = Nothing: Set TextSource = Nothing
End Sub
 

File đính kèm

  • FSS_SMD_CLICK_Rev05_11300A.xlsm
    55.8 KB · Đọc: 9
Upvote 0
@thehoang7
Thủ tục SortAny #9 sai đoạn dưới
t = Replace(t, " ", "") sửa thành t = Replace(t, " ", " ")

------------------
JavaScript:
Function SortAny(ByVal Text As String) As String
  Dim A(), B(), i&, L&, S$, E$, F&, M&
  SortAny = Text: L = Len(Text)
  For i = 1 To L
    S = Mid(Text, i, 1)
    If S Like "[A-z]" Then E = E & S Else If S Like "#" Then F = F * 10 + CInt(S) Else GoTo E
    If i = L And E <> "" And F > 0 Then
E:    If F > M Then M = F: ReDim Preserve A(M)
      A(F) = E & CStr(F): E = "": F = 0
    End If
  Next
  SortAny = Replace(Application.Trim(Join(A, " ")), " ", ",")
End Function
Em cám ơn Anh HeSanbi nha,
Code của Anh Ngắn thiệt.
Bài đã được tự động gộp:

Dùng ArrayList, Sort Số và chuỗi ngăn cách bằng dấu ","
Mã:
Function Sort_Str_Num(ByVal iStr As String, Optional MaxLen& = 20) As String
  'MaxLen: so ky tu lon nhat cua chuoi Sort
  Dim S, sList As Object, tmp$, i&, j&

  If iStr <> Empty Then
    Set sList = CreateObject("System.Collections.ArrayList")
    S = Split(iStr, ",")
    For i = 0 To UBound(S)
      tmp = S(i) & "0"
      For j = 1 To Len(tmp)
        If IsNumeric(Mid(tmp, j, 1)) Then
          tmp = Mid(tmp, 1, j - 1) & Space(MaxLen - Len(tmp) + 1) & Mid(tmp, j, Len(tmp) - j)
          sList.Add tmp
          Exit For
        End If
      Next j
    Next i
    sList.Sort
    Sort_Str_Num = Replace(Join(sList.ToArray, ","), " ", "")
    Set sList = Nothing
  End If
End Function
Thêm lệnh Sort trong file
Mã:
Sub Main()
  Dim aSheets(), Res(), Dic As Object
  Dim FilesToOpen$, shName$
  Dim i&, N&, k&
  Dim Chk As Boolean

  Chk = Application.FileDialog(msoFileDialogFilePicker).Show
  If Not Chk Then Exit Sub
  aSheets = Array("Line SMT1", "Line SMT2", "Line SMT3", "Line SMT2-3") ' Declare line name
  Set Dic = CreateObject("scripting.dictionary")


  With Application.FileDialog(msoFileDialogFilePicker).SelectedItems
    For N = 1 To .Count
      FilesToOpen = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(N)
      Call CreatRes(Res, Dic, shName, k, FilesToOpen)
      For i = 1 To k
        If Res(i, 3) <> Empty Then Res(i, 3) = Sort_Str_Num(Res(i, 3))
      Next i
      For i = 0 To 3 ' Rule for sheets
        If aSheets(i) = "Line " & shName Then
          With Sheets(aSheets(i))
            .UsedRange.ClearContents
            .Range("C2").Resize(k).NumberFormat = "@"
            .Range("B2").Resize(k, 7) = Res
          End With
        End If
      Next i
      Dic.RemoveAll
    Next N
  End With
End Sub

Function Sort_Str_Num(ByVal iStr As String, Optional MaxLen& = 20) As String
  'MaxLen: so ky tu lon nhat cua chuoi Sort
  Dim S, sList As Object, tmp$, i&, j&

  If iStr <> Empty Then
    Set sList = CreateObject("System.Collections.ArrayList")
    S = Split(iStr, ",")
    For i = 0 To UBound(S)
      tmp = S(i) & "0"
      For j = 1 To Len(tmp)
        If IsNumeric(Mid(tmp, j, 1)) Then
          tmp = Mid(tmp, 1, j - 1) & Space(MaxLen - Len(tmp) + 1) & Mid(tmp, j, Len(tmp) - j)
          sList.Add tmp
          Exit For
        End If
      Next j
    Next i
    sList.Sort
    Sort_Str_Num = Replace(Join(sList.ToArray, ","), " ", "")
    Set sList = Nothing
  End If
End Function

Private Sub CreatRes(Res, Dic, shName, k, ByVal FilesToOpen As String)
  Dim fso As Object, TextSource As Object
  Dim S, tArr, Sign(), iCol()
  Dim str$, tmp$, iKey$, prName$
  Dim i&, fR&, fR2&, eR&, N&

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set TextSource = fso.OpenTextFile(FilesToOpen, 1, False, -2)
  tArr = Split(TextSource.ReadAll, vbCrLf)

  ReDim Res(1 To UBound(tArr), 1 To 8)
  ReDim sArr(1 To UBound(tArr), 1 To 2)
  For i = LBound(tArr) To UBound(tArr)
    str = tArr(i)
    If InStr(str, "Program Name") Then
      prName = Replace((Split(Split(str, "=")(1), ".")(0)), " ", "")
    ElseIf InStr(str, "Line Name") Then
      S = Split(str, "=")
      shName = Replace(S(UBound(S)), " ", "")
      prName = prName
      fR = i + 1: Exit For
    End If
  Next i

  Sign = Array("Feeder Position", "Component Name", "Comment", " Type", "Component pitch", "Lane")
  ReDim iCol(LBound(Sign) To UBound(Sign))
  For i = fR To UBound(tArr)
    str = tArr(i)
    If InStr(str, Sign(0)) Then
      eR = i - 1
      For N = LBound(Sign) To UBound(Sign)
        iCol(N) = InStr(str, Sign(N))
      Next N
      fR2 = i: Exit For
    End If
  Next i
  k = 0
  For i = fR2 To UBound(tArr)
    str = tArr(i)
    If InStr(str, Sign(0)) Then
      k = k + 1: m = m + 1: ik = k
        For N = i - 2 To i - 1
            If InStr(tArr(N), "Machine") Then
            Res(k, 1) = "Line Name " & shName & " / " & Application.Trim(tArr(N)) & " / Program Name: " & prName
            Res(k, 4) = "Simulate time(s)"
            Res(k, 6) = "No. of comp.ts"
        Exit For
            End If
       Next N
    ElseIf Mid(Application.Trim(str), 2, 1) = "-" Then
      k = k + 1
      Res(k, 1) = Application.Trim(Mid(str, iCol(0), iCol(1) - iCol(0)))
      iKey = Application.Trim(Mid(str, iCol(1), iCol(2) - iCol(1)))
      Dic.Item(iKey) = Array(k, ik)
      S = Split(iKey, " ")
      Res(k, 2) = S(1): Res(k, 4) = S(0)
      tmp = Application.Trim(Mid(str, iCol(3), iCol(4) - iCol(3)))
      Res(k, 5) = Mid(tmp, InStr(1, tmp, " ") + 1, Len(tmp))
      Res(k, 6) = Split(Application.Trim(Mid(str, iCol(4), iCol(5) - iCol(4))), " ")(0)
    End If
  Next i

  Sign = Array("Placement ID", "X", "Component Name", "Centering")
  ReDim iCol(LBound(Sign) To UBound(Sign))
  For i = fR To eR
    str = tArr(i)
    If InStr(str, Sign(0)) Then
      For N = LBound(Sign) To UBound(Sign)
        iCol(N) = InStr(str, Sign(N))
      Next N
      fR = i + 1: Exit For
    End If
  Next i
  k = k + 1
  Res(k, 6) = "Total placements"
  For i = fR To UBound(tArr)
    str = tArr(i)
    iKey = Application.Trim(Mid(str, iCol(2), iCol(3) - iCol(2)))
    S = Dic.Item(iKey)
    If TypeName(S) = "Variant()" Then
      If Res(S(0), 3) = Empty Then
        Res(S(0), 3) = Application.Trim(Mid(str, iCol(0), iCol(1) - iCol(0)))
      Else
        Res(S(0), 3) = Res(S(0), 3) & "," & Application.Trim(Mid(str, iCol(0), iCol(1) - iCol(0)))
      End If
      Res(S(0), 7) = Res(S(0), 7) + 1
      Res(S(1), 7) = Res(S(1), 7) + 1
      Res(k, 7) = Res(k, 7) + 1
    End If
  Next i
  Set fso = Nothing: Set TextSource = Nothing
End Sub
Em chào Anh HieuCD,
Rất cảm ơn Anh đã bổ xung Code cho Tập tin.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom