Xử lý chuỗi chẵn, lẻ

Liên hệ QC

tuansk88

Thành viên mới
Tham gia
9/4/20
Bài viết
4
Được thích
0
Em chào các bác!
E gặp bài toàn như này mong các bác giúp đỡ.
Chả là e có 1 dữ liệu gồm các số chẵn, lẻ G3:G18; em cần sắp xếp vào 1 bảng với mong muốn như sau: các số liền sau cùng loại (cùng chẵn hoặc cùng lẻ) với số liền trước thì để cùng 1 cột; nếu khác loại thì điền sang cột bên cạnh; cứ như vậy cho đến hết (như K1:Q8).
Chân thành cảm ơn các bác,
Rất mong được giao lưu, học hỏi các bác tại diễn đàn.
 

File đính kèm

  • Book1.xlsx
    10.3 KB · Đọc: 35
Em chào các bác!
E gặp bài toàn như này mong các bác giúp đỡ.
Chả là e có 1 dữ liệu gồm các số chẵn, lẻ G3:G18; em cần sắp xếp vào 1 bảng với mong muốn như sau: các số liền sau cùng loại (cùng chẵn hoặc cùng lẻ) với số liền trước thì để cùng 1 cột; nếu khác loại thì điền sang cột bên cạnh; cứ như vậy cho đến hết (như K1:Q8).
Chân thành cảm ơn các bác,
Rất mong được giao lưu, học hỏi các bác tại diễn đàn.
Bài này mà dùng công thức chắc "khó nhai".
Thử với VBA xem sao:
PHP:
Public Sub s_Gpe()
Dim sArr(), dArr(), I As Long, Col As Long, K As Long, R As Long, Tmp As Variant
    sArr = Range("G3", Range("G3").End(xlDown)).Value
    R = UBound(sArr)
ReDim dArr(1 To 6, 1 To R)
For I = 1 To R
    If sArr(I, 1) <> Tmp Then
        Tmp = sArr(I, 1)
        Col = Col + 1
        K = 1
    Else
        K = K + 1
        If K = 7 Then
            K = 1
            Col = Col + 1
        End If
    End If
    dArr(K, Col) = Tmp
Next I
Range("K3").Resize(6, Col) = dArr
End Sub
 
Của bạn là 0 và 1 chứ đâu phải chẵn lẻ. Cần xác định có phải chỉ 0 và 1.
 
Của bạn là 0 và 1 chứ đâu phải chẵn lẻ. Cần xác định có phải chỉ 0 và 1.
mình ví dụ là như vậy cho dễ thôi bạn, với cả chẵn hay lẻ cũng quy về 0 và 1 được mà
Bài đã được tự động gộp:

Bài này mà dùng công thức chắc "khó nhai".
Thử với VBA xem sao:
PHP:
Public Sub s_Gpe()
Dim sArr(), dArr(), I As Long, Col As Long, K As Long, R As Long, Tmp As Variant
    sArr = Range("G3", Range("G3").End(xlDown)).Value
    R = UBound(sArr)
ReDim dArr(1 To 6, 1 To R)
For I = 1 To R
    If sArr(I, 1) <> Tmp Then
        Tmp = sArr(I, 1)
        Col = Col + 1
        K = 1
    Else
        K = K + 1
        If K = 7 Then
            K = 1
            Col = Col + 1
        End If
    End If
    dArr(K, Col) = Tmp
Next I
Range("K3").Resize(6, Col) = dArr
End Sub
cảm ơn bác Ba Tê. e chưa dùng VBA
 
mình ví dụ là như vậy cho dễ thôi bạn, với cả chẵn hay lẻ cũng quy về 0 và 1 được mà
Ví dụ hoàn toàn chả dễ hiểu. Đối với bạn quy về 0 và 1 được, nhưng thuật toán nó chưa chắc cho quy về như vậy, từ "được mà" của bạn quá chủ quan.
dãy 1356479 thì quy ra thành 3 dãy 135, 64, và 79 phải không?

0 và 1 thì rất đơn giản. Nhưng có những chữ số khác thì thuật toán thay đổi hoàn toàn.
 
Ví dụ hoàn toàn chả dễ hiểu. Đối với bạn quy về 0 và 1 được, nhưng thuật toán nó chưa chắc cho quy về như vậy, từ "được mà" của bạn quá chủ quan.
dãy 1356479 thì quy ra thành 3 dãy 135, 64, và 79 phải không?

0 và 1 thì rất đơn giản. Nhưng có những chữ số khác thì thuật toán thay đổi hoàn toàn.
Cảm ơn bạn.
dãy của mình có cả số 0 nên mình viết như vậy. Vi dụ 01356479 thì quy ra thành 4 dãy 0,135, 64, và 79
 
Em chào các bác!
E gặp bài toàn như này mong các bác giúp đỡ.
Chả là e có 1 dữ liệu gồm các số chẵn, lẻ G3:G18; em cần sắp xếp vào 1 bảng với mong muốn như sau: các số liền sau cùng loại (cùng chẵn hoặc cùng lẻ) với số liền trước thì để cùng 1 cột; nếu khác loại thì điền sang cột bên cạnh; cứ như vậy cho đến hết (như K1:Q8).
Chân thành cảm ơn các bác,
Rất mong được giao lưu, học hỏi các bác tại diễn đàn.
Tạo cột phụ
Mã:
H3 =IF(ROWS($1:1)=1,1,IF(MOD(G3+G2,2),MAX($H$2:H2)+1,IF(COUNTIF($H$2:H2,H2)=6,1)+H2))
Mã:
K3 =IF(ROWS($1:1)<=COUNTIF($H$3:$H$19,COLUMNS($A:A)),INDEX($G$2:$G$19,MATCH(COLUMNS($A:A),$H$3:$H$19,0)+ROWS($1:1),),"")
 

File đính kèm

  • Book1 (6).xlsx
    11.1 KB · Đọc: 12
Nếu chỉ 0 và 1 thì thuật toán là đổi 0 thành dấu cách rồi split ra thành nhiều dãy 1's
Tương tự vậy cho 1, split được nhiều dãy 0's.
Xong chép chúng xuống, xen kẽ. Hết.

Nhưng nếu có cả các số khác thì bắt buộc phải dùng thuật toán duyệt tất cả.

dongCuoi = ... ' code lấy dòng cuói ở đây
a = Application.Tranpose(Range("G3:G" & dongCuoi).Value)
dongCuoi = UBound(a)
Redim b(1 To dongCuoi, 1 To dongCuoi)
prev = IIF(a(1) And 1, 0, 1) ' mặc định trị trước
For i = 1 To dongCuoi
If (a(i) And 1) <> prev Then ' khác loại nhau
bCot = bCot + 1
bDong = 0
End If
bDong = bDong + 1
b(bDong, bCot) = a(i)
prev = a(i) And 1
If bDongMx < bDong Then bDongMx = bDong
Next i
Range("K3").Resize(bDongMx, bCot) = b
 
Tạo cột phụ
Mã:
H3 =IF(ROWS($1:1)=1,1,IF(MOD(G3+G2,2),MAX($H$2:H2)+1,IF(COUNTIF($H$2:H2,H2)=6,1)+H2))
Mã:
K3 =IF(ROWS($1:1)<=COUNTIF($H$3:$H$19,COLUMNS($A:A)),INDEX($G$2:$G$19,MATCH(COLUMNS($A:A),$H$3:$H$19,0)+ROWS($1:1),),"")
Thật tuyệt vời. Cảm ơn bác rất nhiều
 
Em chào các bác!
E gặp bài toàn như này mong các bác giúp đỡ.
Chả là e có 1 dữ liệu gồm các số chẵn, lẻ G3:G18; em cần sắp xếp vào 1 bảng với mong muốn như sau: các số liền sau cùng loại (cùng chẵn hoặc cùng lẻ) với số liền trước thì để cùng 1 cột; nếu khác loại thì điền sang cột bên cạnh; cứ như vậy cho đến hết (như K1:Q8).
Chân thành cảm ơn các bác,
Rất mong được giao lưu, học hỏi các bác tại diễn đàn.
Không cần cột phụ.
Mã:
K3=IF(OR(AND(ROW(A1)>1,SUM(OFFSET($G$2,COUNT($J$3:J$8,K$2:K2),,2))=1),COUNT($J$3:J$8,K$2:K2)>=COUNT($G$3:$G$19)),"",OFFSET($G$2,COUNT($J$3:J$8,K$2:K2)+1,))
 
Web KT
Back
Top Bottom