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!
Nếu so sánh QR107 và QR26 có thể bạn cho rằng QR107 lớn hơn QR26 nhưng Excel nó không "nghĩ" vậy. Excel sẽ cho rằng QR107 nhỏ hơn QR26. Vậy tai sao bạn không theo luật của Excel? Thay vì QR26 bạn sửa thành QR026 thì có vấn đề gì không?
 
Upvote 0
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!
Bạn thử.
Mã:
Function xapxep(ByVal dk As String) As String
         Dim s As String, i As Long, t As String, arr, so, s1, j As Long
         s = dk
         For i = 1 To Len(s)
             If IsNumeric(Mid(s, i, 1)) = False Then
                t = t & Mid(s, i, 1)
             Else
                Exit For
             End If
        Next i
        s = Replace(s, t, "")
        arr = Split("," & s, ",")
        For i = 1 To UBound(arr)
            For j = UBound(arr) To i + 1 Step -1
                If CLng(arr(j)) < CLng(arr(j - 1)) Then
                   so = arr(j)
                   arr(j) = arr(j - 1)
                   arr(j - 1) = so
                End If
            Next j
       Next i
       For i = 1 To UBound(arr)
           s1 = s1 & "," & t & arr(i)
       Next i
           xapxep = Right(s1, Len(s1) - 1)
End Function
Mã:
=xapxep(B3)
 

File đính kèm

  • Sắp xếp chuối tăng dần sau dấu phẩy.xlsm
    16.8 KB · Đọc: 12
Upvote 0
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!
Bạn thử hàm này
Mã:
Function SortStr(ByVal sStr As String, Optional ByVal sSep As String = ",")
With CreateObject("MSScriptControl.ScriptControl")
    .Language = "JavaScript"
    SortStr = Mid(.Eval( _
        "('" & sSep & sStr & "').replace(/[A-z]/g,'').split('" & sSep & "').sort(function(x,y){return (x-y)}).join('" & sSep & "'+('" & sStr & "').replace(/\d.*$/g,''))" _
    ), Len(sSep) + 1)
End With
End Function
 
Upvote 0
Nếu so sánh QR107 và QR26 có thể bạn cho rằng QR107 lớn hơn QR26 nhưng Excel nó không "nghĩ" vậy. Excel sẽ cho rằng QR107 nhỏ hơn QR26. Vậy tai sao bạn không theo luật của Excel? Thay vì QR26 bạn sửa thành QR026 thì có vấn đề gì không?
Em chào Anh ndu96081631,
Thực ra vấn đề này nó hơi dài một xíu, em trình bày ở dưới ạ.
Em có làm chương trình cho máy gắn linh kiện SMD, để làm được chương trình thì cần có một file gọi là BOM, trong file này thì có cột mô tả các vị trí linh kiện, R, C, QR, ... các vị trí này thì có BOM thì sắp theo thứ tự, có BOM thì không sắp xếp theo thứ tự,
Để làm được chương trình đổ lên cho máy chạy thì bên em có phần mềm chuyên làm chương trình, sau khi làm xong thì phần mềm sẽ xuất ra một dạng file .txt hoăc .csv,,, em phải dùng một VBA code nữa đổ gom lại thành một file với nhưng yêu cầu riêng, sau khi gom lại bằng VBA code thì các chuỗi tăng liên tục.
Do là chương trình để chạy nên yêu cầu, không được thêm bớt, sửa tên vị trí,
Bước làm chương trình cuối cùng là phải kiểm tra một số thông tin trong file được xuất ra từ phần mềm với file BOM nguyên thủy, xem có sai, thiếu sót gì không,
Có một số file BOM thì các vị trí được sắp theo thứ tự tăng dần, có file thì không, phần mềm xuất ra file thì luôn sắp xếp tăng dần,
Nếu tự sửa thành số như Anh nói thì lại không được, do quy định.
lâu nay, có một số trường hợp mặc dù, các chuỗi đảo nhau, nhưng vẫn đầy đủ thì không sao (đầy đủ số lượng vị trí), bên em chủ quan, không kiểm tra kĩ, cứ nghĩ là chỉ đảo vị trí, nhưng vừa rồi, có trường hợp, bị thiếu vị trí, không kiểm tra kĩ, em muốn chuyển về giống nhau để phần mềm so sánh cho chính xác và trực quan,
1601358667734.png
Cái file BOM check này, nếu giống nhau thì sẽ thông báo không có lỗi, nếu chỉ cần có sự khác biệt là sẽ hiện lên như hình em có đính kèm.


Trở lại với vấn đề, nếu Excel nó không "nghĩ" như vậy thì em sẽ hoặc kiểm tra bằng mắt từng cái một, hoặc dùng VBA code, lúc này, em vừa thấy có bạn "snow25" có gửi,
Em cảm ơn Anh rất nhiều.
Bài đã được tự động gộp:

Function xapxep(ByVal dk As String) As String Dim s As String, i As Long, t As String, arr, so, s1, j As Long s = dk For i = 1 To Len(s) If IsNumeric(Mid(s, i, 1)) = False Then t = t & Mid(s, i, 1) Else Exit For End If Next i s = Replace(s, t, "") arr = Split("," & s, ",") For i = 1 To UBound(arr) For j = UBound(arr) To i + 1 Step -1 If CLng(arr(j)) < CLng(arr(j - 1)) Then so = arr(j) arr(j) = arr(j - 1) arr(j - 1) = so End If Next j Next i For i = 1 To UBound(arr) s1 = s1 & "," & t & arr(i) Next i xapxep = Right(s1, Len(s1) - 1) End Function
Chào bạn snow25 nha, VBA code của bạn chạy ok rồi,
Cảm ơn bạn nha.
 
Lần chỉnh sửa cuối:
Upvote 0
Em chào Anh ndu96081631,
Thực ra vấn đề này nó hơi dài một xíu, em trình bày ở dưới ạ.
Em có làm chương trình cho máy gắn linh kiện SMD, để làm được chương trình thì cần có một file gọi là BOM, trong file này thì có cột mô tả các vị trí linh kiện, R, C, QR, ... các vị trí này thì có BOM thì sắp theo thứ tự, có BOM thì không sắp xếp theo thứ tự,
Để làm được chương trình đổ lên cho máy chạy thì bên em có phần mềm chuyên làm chương trình, sau khi làm xong thì phần mềm sẽ xuất ra một dạng file .txt hoăc .csv,,, em phải dùng một VBA code nữa đổ gom lại thành một file với nhưng yêu cầu riêng, sau khi gom lại bằng VBA code thì các chuỗi tăng liên tục.
Do là chương trình để chạy nên yêu cầu, không được thêm bớt, sửa tên vị trí,
Bước làm chương trình cuối cùng là phải kiểm tra một số thông tin trong file được xuất ra từ phần mềm với file BOM nguyên thủy, xem có sai, thiếu sót gì không,
Có một số file BOM thì các vị trí được sắp theo thứ tự tăng dần, có file thì không, phần mềm xuất ra file thì luôn sắp xếp tăng dần,
Nếu tự sửa thành số như Anh nói thì lại không được, do quy định.
lâu nay, có một số trường hợp mặc dù, các chuỗi đảo nhau, nhưng vẫn đầy đủ thì không sao (đầy đủ số lượng vị trí), bên em chủ quan, không kiểm tra kĩ, cứ nghĩ là chỉ đảo vị trí, nhưng vừa rồi, có trường hợp, bị thiếu vị trí, không kiểm tra kĩ, em muốn chuyển về giống nhau để phần mềm so sánh cho chính xác và trực quan,
View attachment 246351
Cái file BOM check này, nếu giống nhau thì sẽ thông báo không có lỗi, nếu chỉ cần có sự khác biệt là sẽ hiện lên như hình em có đính kèm.


Trở lại với vấn đề, nếu Excel nó không "nghĩ" như vậy thì em sẽ hoặc kiểm tra bằng mắt từng cái một, hoặc dùng VBA code, lúc này, em vừa thấy có bạn "snow25" có gửi,
Em cảm ơn Anh rất nhiều.
Bài đã được tự động gộp:


Chào bạn snow25 nha, VBA code của bạn chạy ok rồi,
Cảm ơn bạn nha.
Hỏi lại lần nữa liên quan đến dữ liệu: Có bao giờ dữ liệu có dạng vầy không R53,C92,R72? Vừa có R lại vừa có C (hoặc nói chung là không cùng "bản chất")
--------------------------------------
Bạn thử hàm này
Mã:
Function SortStr(ByVal sStr As String, Optional ByVal sSep As String = ",")
With CreateObject("MSScriptControl.ScriptControl")
    .Language = "JavaScript"
    SortStr = Mid(.Eval( _
        "('" & sSep & sStr & "').replace(/[A-z]/g,'').split('" & sSep & "').sort(function(x,y){return (x-y)}).join('" & sSep & "'+('" & sStr & "').replace(/\d.*$/g,''))" _
    ), Len(sSep) + 1)
End With
End Function
Đoán là code này không chạy được trên Office 64 bit
 
Lần chỉnh sửa cuối:
Upvote 0
Em chào Anh ndu96081631,
Thực ra vấn đề này nó hơi dài một xíu, em trình bày ở dưới ạ.
Em có làm chương trình cho máy gắn linh kiện SMD, để làm được chương trình thì cần có một file gọi là BOM, trong file này thì có cột mô tả các vị trí linh kiện, R, C, QR, ... các vị trí này thì có BOM thì sắp theo thứ tự, có BOM thì không sắp xếp theo thứ tự,
Để làm được chương trình đổ lên cho máy chạy thì bên em có phần mềm chuyên làm chương trình, sau khi làm xong thì phần mềm sẽ xuất ra một dạng file .txt hoăc .csv,,, em phải dùng một VBA code nữa đổ gom lại thành một file với nhưng yêu cầu riêng, sau khi gom lại bằng VBA code thì các chuỗi tăng liên tục.
Do là chương trình để chạy nên yêu cầu, không được thêm bớt, sửa tên vị trí,
Bước làm chương trình cuối cùng là phải kiểm tra một số thông tin trong file được xuất ra từ phần mềm với file BOM nguyên thủy, xem có sai, thiếu sót gì không,
Có một số file BOM thì các vị trí được sắp theo thứ tự tăng dần, có file thì không, phần mềm xuất ra file thì luôn sắp xếp tăng dần,
Nếu tự sửa thành số như Anh nói thì lại không được, do quy định.
lâu nay, có một số trường hợp mặc dù, các chuỗi đảo nhau, nhưng vẫn đầy đủ thì không sao (đầy đủ số lượng vị trí), bên em chủ quan, không kiểm tra kĩ, cứ nghĩ là chỉ đảo vị trí, nhưng vừa rồi, có trường hợp, bị thiếu vị trí, không kiểm tra kĩ, em muốn chuyển về giống nhau để phần mềm so sánh cho chính xác và trực quan,
View attachment 246351
Cái file BOM check này, nếu giống nhau thì sẽ thông báo không có lỗi, nếu chỉ cần có sự khác biệt là sẽ hiện lên như hình em có đính kèm.


Trở lại với vấn đề, nếu Excel nó không "nghĩ" như vậy thì em sẽ hoặc kiểm tra bằng mắt từng cái một, hoặc dùng VBA code, lúc này, em vừa thấy có bạn "snow25" có gửi,
Em cảm ơn Anh rất nhiều.
Bài đã được tự động gộp:


Chào bạn snow25 nha, VBA code của bạn chạy ok rồi,
Cảm ơn bạn nha.
Sao bạn không tạo Function so sánh 2 chuỗi, nếu khác sẽ trã về giá trị khác
 
Upvote 0
@thehoang7
Bạn tham khảo thêm:

-----------------------
PHP:
Private Sub SortAny_test()
  Debug.Print SortAny("R6,R2,T5")
End Sub

Function SortAny(ByVal Text As String) As String
  Dim A(), B(), i&, j&, L&, t$, 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
    ElseIf S Like "#" Then
      E = E & S: F = F * 10 + CInt(S)
    Else
      GoTo E
    End If
    If i = L And E <> "" And F > 0 Then
E:    j = j + 1
      If F > M Then M = F: ReDim Preserve A(M)
      A(F) = E
      E = "": F = 0
    End If
  Next
  t = Trim(Join(A, " "))
  While t Like "*  *"
    t = Replace(t, "  ", "")
  Wend
  SortAny = Replace(t, " ", ",")
End Function

Private Sub SortAny2_test()
  Debug.Print SortAny2("R6,R2,T5")
End Sub

Function SortAny2(ByVal Text As String, Optional ByVal Descending As Boolean) As String
  Dim RE As Object, MS As Object, A(), B(), i&, j&, L&, t
  Set RE = VBA.CreateObject("VBScript.RegExp")
  SortAny2 = Text
  With RE
    .Global = True
    .pattern = "([A-z]*)(\d+)"
    Set MS = .Execute(Text)
    If MS.Count > 1 Then
      L = MS.Count - 1
      ReDim A(L): ReDim B(L)
      For i = 0 To L
        A(i) = MS(i).SubMatches(1): B(i) = MS(i)
      Next
      For i = 0 To L
        For j = i + 1 To L
          If (Descending And A(i) < A(j)) Or (Not Descending And A(i) > A(j)) Then
            t = A(i): A(i) = A(j): A(j) = t
            t = B(i): B(i) = B(j): B(j) = t
          End If
        Next
      Next
      SortAny2 = Join(B, ",")
    End If
  End With
  Set RE = Nothing
End Function

Private Sub SortAny3_test()
  Debug.Print SortAny3("R6,R2,T5")
End Sub

Function SortAny3(ByVal Text As String, Optional ByVal Descending As Boolean) As String
  Dim A(), B(), i&, j&, L&, t, S$, E$, F$
  SortAny3 = Text
  L = Len(Text)
  For i = 1 To L
    S = Mid(Text, i, 1)
    If S Like "[A-z]" Then
      E = E & S
    ElseIf S Like "#" Then
      E = E & S: F = F & S
    Else
      GoTo E
    End If
    If i = L And E <> "" And F <> "" Then
E:    j = j + 1
      ReDim Preserve A(1 To j): A(j) = F
      ReDim Preserve B(1 To j): B(j) = E
      E = "": F = ""
    End If
  Next
  If j > 1 Then
    L = j
    For i = 1 To L
      For j = i + 1 To L
        If (Descending And A(i) < A(j)) Or (Not Descending And A(i) > A(j)) Then
          t = A(i): A(i) = A(j): A(j) = t
          t = B(i): B(i) = B(j): B(j) = t
        End If
      Next
    Next
    SortAny3 = Join(B, ",")
  End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
@thehoang7
Bạn tham khảo thêm:

-----------------------
PHP:
Private Sub SortAny_test()
  Debug.Print SortAny("R6,R2,T5")
End Sub

Function SortAny(ByVal Text As String) As String
  Dim A(), B(), i&, j&, L&, t$, 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
    ElseIf S Like "#" Then
      E = E & S: F = F * 10 + CInt(S)
    Else
      GoTo E
    End If
    If i = L And E <> "" And F > 0 Then
E:    j = j + 1
      If F > M Then M = F: ReDim Preserve A(M)
      A(F) = E
      E = "": F = 0
    End If
  Next
  t = Trim(Join(A, " "))
  While t Like "*  *"
    t = Replace(t, "  ", "")
  Wend
  SortAny = Replace(t, " ", ",")
End Function

Private Sub SortAny2_test()
  Debug.Print SortAny2("R6,R2,T5")
End Sub

Function SortAny2(ByVal Text As String, Optional ByVal Descending As Boolean) As String
  Dim RE As Object, MS As Object, A(), B(), i&, j&, L&, t
  Set RE = VBA.CreateObject("VBScript.RegExp")
  SortAny2 = Text
  With RE
    .Global = True
    .pattern = "([A-z]*)(\d+)"
    Set MS = .Execute(Text)
    If MS.Count > 1 Then
      L = MS.Count - 1
      ReDim A(L): ReDim B(L)
      For i = 0 To L
        A(i) = MS(i).SubMatches(1): B(i) = MS(i)
      Next
      For i = 0 To L
        For j = i + 1 To L
          If (Descending And A(i) < A(j)) Or (Not Descending And A(i) > A(j)) Then
            t = A(i): A(i) = A(j): A(j) = t
            t = B(i): B(i) = B(j): B(j) = t
          End If
        Next
      Next
      SortAny2 = Join(B, ",")
    End If
  End With
  Set RE = Nothing
End Function

Private Sub SortAny3_test()
  Debug.Print SortAny3("R6,R2,T5")
End Sub

Function SortAny3(ByVal Text As String, Optional ByVal Descending As Boolean) As String
  Dim A(), B(), i&, j&, L&, t, S$, E$, F$
  SortAny3 = Text
  L = Len(Text)
  For i = 1 To L
    S = Mid(Text, i, 1)
    If S Like "[A-z]" Then
      E = E & S
    ElseIf S Like "#" Then
      E = E & S: F = F & S
    Else
      GoTo E
    End If
    If i = L And E <> "" And F <> "" Then
E:    j = j + 1
      ReDim Preserve A(1 To j): A(j) = F
      ReDim Preserve B(1 To j): B(j) = E
      E = "": F = ""
    End If
  Next
  If j > 1 Then
    L = j
    For i = 1 To L
      For j = i + 1 To L
        If (Descending And A(i) < A(j)) Or (Not Descending And A(i) > A(j)) Then
          t = A(i): A(i) = A(j): A(j) = t
          t = B(i): B(i) = B(j): B(j) = t
        End If
      Next
    Next
    SortAny3 = Join(B, ",")
  End If
End Function
Rút gọn code được không bạn
 
Upvote 0
Rút gọn code được không bạn
Không biết ý Bác HieuCD phải rút gọn như thế nào?

----------------------
JavaScript:
Private Sub SortAny5_test()
  Debug.Print SortAny5("R6,R2,T5,A1")
End Sub

Function SortAny5(ByVal Text As String) As String
  Dim R As Object, S As Object, A(), i&, M&, t&
  Set R = VBA.CreateObject("VBScript.RegExp")
  SortAny5 = Text
  With R
    .Global = 1
    .pattern = "([A-z]*)(\d+)"
    Set S = .Execute(Text)
    If S.Count > 1 Then
      For i = 0 To S.Count - 1
        t = S(i).SubMatches(1)
        If t > M Then M = t: ReDim Preserve A(M)
        A(t) = S(i)
      Next
      .pattern = " +"
      SortAny5 = .Replace(Trim(Join(A, " ")), ",")
    End If
  End With
  Set R = Nothing
  Set S = Nothing
End Function


JavaScript:
Function sortAny6(text$, Optional ByVal delimiter$ = ",", Optional ByVal Descending As Boolean)
  Static o As Object
  If o Is Nothing Then
    Set o = VBA.CreateObject("htmlfile")
    With o.parentWindow
      .execScript "function SortByNumberOfString(text, delimiter, descending){" & _
                  "    var s = text.split(delimiter);" & _
                  "    var t;" & _
                  "    var c = function (a, b) {" & _
                  "         if (!descending==0) {t=a; a=b;b=t}" & _
                  "         return (Number(a.match(/(\d+)/g)[0]) - Number((b.match(/(\d+)/g)[0])));" & _
                  "     };" & _
                  "    return s.sort(c).join(delimiter);" & _
                  "}", "javaScript"
    End With
  End If
  sortAny6 = o.parentWindow.SortByNumberOfString(text, delimiter, CInt(Descending))
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Không biết ý Bác HieuCD phải rút gọn như thế nào?

----------------------
JavaScript:
Private Sub SortAny5_test()
  Debug.Print SortAny5("R6,R2,T5,A1")
End Sub

Function SortAny5(ByVal Text As String) As String
  Dim R As Object, S As Object, A(), i&, M&, t&
  Set R = VBA.CreateObject("VBScript.RegExp")
  SortAny5 = Text
  With R
    .Global = 1
    .pattern = "([A-z]*)(\d+)"
    Set S = .Execute(Text)
    If S.Count > 1 Then
      For i = 0 To S.Count - 1
        t = S(i).SubMatches(1)
        If t > M Then M = t: ReDim Preserve A(M)
        A(t) = S(i)
      Next
      .pattern = " +"
      SortAny5 = .Replace(Trim(Join(A, " ")), ",")
    End If
  End With
  Set R = Nothing
  Set S = Nothing
End Function


JavaScript:
Function sortAny6(text$, Optional ByVal delimiter$ = ",", Optional ByVal Descending As Boolean)
  Static o As Object
  If o Is Nothing Then
    Set o = VBA.CreateObject("htmlfile")
    With o.parentWindow
      .execScript "function SortByNumberOfString(text, delimiter, descending){" & _
                  "    var s = text.split(delimiter);" & _
                  "    var t;" & _
                  "    var c = function (a, b) {" & _
                  "         if (!descending==0) {t=a; a=b;b=t}" & _
                  "         return (Number(a.match(/(\d+)/g)[0]) - Number((b.match(/(\d+)/g)[0])));" & _
                  "     };" & _
                  "    return s.sort(c).join(delimiter);" & _
                  "}", "javaScript"
    End With
  End If
  sortAny6 = o.parentWindow.SortByNumberOfString(text, delimiter, CInt(Descending))
End Function

Tuyệt vời, Code của bạn mới lạ và rất hay
Các Function còn lại rút gọn thêm một tí là hoàn hảo :)
 
Upvote 0
Bạn thử hàm này
Mã:
Function SortStr(ByVal sStr As String, Optional ByVal sSep As String = ",")
With CreateObject("MSScriptControl.ScriptControl")
    .Language = "JavaScript"
    SortStr = Mid(.Eval( _
        "('" & sSep & sStr & "').replace(/[A-z]/g,'').split('" & sSep & "').sort(function(x,y){return (x-y)}).join('" & sSep & "'+('" & sStr & "').replace(/\d.*$/g,''))" _
    ), Len(sSep) + 1)
End With
End Function
Em chao Anh huuthang_bd,
Đúng thật là Code trên em không sử dụng được, Anh ndu96081631 có chia sẻ là không sử dụng được trên Windows 64bits ạ,
Em cảm ơn Anh.
 
Upvote 0
Hỏi lại lần nữa liên quan đến dữ liệu: Có bao giờ dữ liệu có dạng vầy không R53,C92,R72? Vừa có R lại vừa có C (hoặc nói chung là không cùng "bản chất")
--------------------------------------

Đoán là code này không chạy được trên Office 64 bit
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.
 

File đính kèm

  • Refer.zip
    323.8 KB · Đọc: 11
Upvote 0
Vậy là sau hơn chục bài thì mình cũng chịu lắng nghe. Lý ra mình nên gửi sớm hơn nhé.

1601517125615.png
 
  • Yêu thích
Reactions: th7
Upvote 0
Sao bạn không tạo Function so sánh 2 chuỗi, nếu khác sẽ trã về giá trị khác
Em chào Anh HieuCD,
Lại được Anh ghé thăm, hihi
Em vừu thấy Anh DeSanbi có chia sẻ, và Anh có bình luận, em kiểm tra học hỏi ạ.
Cảm ơn Anh.
Bài đã được tự động gộp:

Vậy là sau hơn chục bài thì mình cũng chịu lắng nghe. Lý ra mình nên gửi sớm hơn nhé.

View attachment 246481
Em chào Anh befaint,
Em cảm ơn Anh.
Bài đã được tự động gộp:

Không biết ý Bác HieuCD phải rút gọn như thế nào?

----------------------
JavaScript:
Private Sub SortAny5_test()
  Debug.Print SortAny5("R6,R2,T5,A1")
End Sub

Function SortAny5(ByVal Text As String) As String
  Dim R As Object, S As Object, A(), i&, M&, t&
  Set R = VBA.CreateObject("VBScript.RegExp")
  SortAny5 = Text
  With R
    .Global = 1
    .pattern = "([A-z]*)(\d+)"
    Set S = .Execute(Text)
    If S.Count > 1 Then
      For i = 0 To S.Count - 1
        t = S(i).SubMatches(1)
        If t > M Then M = t: ReDim Preserve A(M)
        A(t) = S(i)
      Next
      .pattern = " +"
      SortAny5 = .Replace(Trim(Join(A, " ")), ",")
    End If
  End With
  Set R = Nothing
  Set S = Nothing
End Function


JavaScript:
Function sortAny6(text$, Optional ByVal delimiter$ = ",", Optional ByVal Descending As Boolean)
  Static o As Object
  If o Is Nothing Then
    Set o = VBA.CreateObject("htmlfile")
    With o.parentWindow
      .execScript "function SortByNumberOfString(text, delimiter, descending){" & _
                  "    var s = text.split(delimiter);" & _
                  "    var t;" & _
                  "    var c = function (a, b) {" & _
                  "         if (!descending==0) {t=a; a=b;b=t}" & _
                  "         return (Number(a.match(/(\d+)/g)[0]) - Number((b.match(/(\d+)/g)[0])));" & _
                  "     };" & _
                  "    return s.sort(c).join(delimiter);" & _
                  "}", "javaScript"
    End With
  End If
  sortAny6 = o.parentWindow.SortByNumberOfString(text, delimiter, CInt(Descending))
End Function
Em chào Anh HeSanbi,
Em cảm ơn Code của Anh nha.
 
Lần chỉnh sửa cuối:
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.
Em có đính kèm thêm cái file "Check BOM & FSS" File này dùng để kiểm tra như em có nói ở bài trên rồi Anh ạ.
Do còn bị hạn chế, có thể là tầm nhìn sự hiểu biết về Excel nên để làm một chương trình chạy hoàn chỉnh trên dây chuyền bên em vẫn còn làm theo nhiều bước quá.
Nhưng vướng ở đâu, gỡ ở đó, em Cảm ơn các Anh trong diễn đàn.
 

File đính kèm

  • Check BOM & FSS.xlsb
    70.5 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
 
Lần chỉnh sửa cuối:
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
  S = Trim(Join(A, " "))
  While S Like "*  *": S = Replace(S, "  ", " "): Wend
  SortAny = Replace(S, " ", ",")
End Function
Hay quá! dùng chỉ số của Array thành việc sort munber! => o cờ óc hờ óc hóc nặng học thôi....
 
Upvote 0
Mình làm thử bằng Power query, copy cột cần sắp xếp vào sheet cuối rồi chọn refresh all sẽ ra kết quả.
 

File đính kèm

  • FSS_SMD_CLICK_Rev05_11300A.xlsx
    48.1 KB · Đọc: 13
Upvote 0
Web KT

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

Back
Top Bottom