Tách dữ liệu 1 cột thành 2 theo điều kiện

Liên hệ QC

duyhieu222

Thành viên mới
Tham gia
19/11/11
Bài viết
19
Được thích
3
E chào các anh chị,
Em đang có 1 file cần chia dự liệu của 1 cột thành 2 theo nội dung khác nhau.
Em đã tìm trên diễn đàn mà chưa thấy bài nào tương tự, nhờ các a chị giúp em với ạ.
Em cần chia dữ liệu từ cột A nhập vào bằng máy scan, thành dữ liệu cột C&D gồm tên và vị trí.
E chỉ cần dùng hàm thôi ạ, chứ VBA e chưa biết gì ạ.
E cám ơn.

SCANTÊNVỊ TRÍ
0505444405054444A.03
0505444805054448A.03
0505450705054507A.03
0505458105054581A.03
0505458205054582A.03
0509044105090441A.03
A.0305090587A.05
0509058705090599A.05
0509059905161381A.05
0516138105078919A.06
A.0505130720A.06
0507891905171773A.06
0513072005248508A.16
0517177305254921A.18
A.0605257037A.18
0524850898196833A.20
A.16
05254921
05257037
A.18
98196833
A.20
 

File đính kèm

  • SCAN.xlsx
    8.9 KB · Đọc: 15
E chào các anh chị,
Em đang có 1 file cần chia dự liệu của 1 cột thành 2 theo nội dung khác nhau.
Em đã tìm trên diễn đàn mà chưa thấy bài nào tương tự, nhờ các a chị giúp em với ạ.
Em cần chia dữ liệu từ cột A nhập vào bằng máy scan, thành dữ liệu cột C&D gồm tên và vị trí.
E chỉ cần dùng hàm thôi ạ, chứ VBA e chưa biết gì ạ.
E cám ơn.

SCANTÊNVỊ TRÍ
0505444405054444A.03
0505444805054448A.03
0505450705054507A.03
0505458105054581A.03
0505458205054582A.03
0509044105090441A.03
A.0305090587A.05
0509058705090599A.05
0509059905161381A.05
0516138105078919A.06
A.0505130720A.06
0507891905171773A.06
0513072005248508A.16
0517177305254921A.18
A.0605257037A.18
0524850898196833A.20
A.16
05254921
05257037
A.18
98196833
A.20
Thử:
Mã:
C2=IFERROR(T(INDEX($A$2:$A$100,MATCH(,INDEX(COUNTIF($F$1:$F1,$A$2:$A$100)+(LEFT($A$2:$A$100)="A"),),))),"")
D2=OFFSET($A1,MATCH("A*",OFFSET($A$1,MATCH(F2,$A$2:$A$100,),):$A$100,)+COUNTIF($A$1:OFFSET($A$1,MATCH(F2,$A$2:$A$100,),),"A*"),)
Enter, fill xuống.

Thân
 

File đính kèm

  • SCAN.xlsx
    11 KB · Đọc: 26
Anh em mình đang "chơi" game "lành mạnh" mà anh. :)

Chúc anh ngày vui.
/-*+//-*+//-*+/
Híc! Nhìn hoa mắt!
Tôi cũng thử với VBA (Không Dic) nó cũng hoa mắt luôn:
PHP:
Public Sub DiecLuon()
Dim sArr(), I As Long, K As Long, R As Long, ViTri As String
    sArr = Range("A2", Range("A1000000").End(xlUp)).Value
    R = UBound(sArr)
ReDim dArr(1 To R, 1 To 2)
'=============================='
For I = R To 1 Step -1
    If Len(sArr(I, 1)) < 8 Then
        ViTri = sArr(I, 1)
    Else
        sArr(I, 1) = sArr(I, 1) & "#" & ViTri
    End If
Next I
'=============================='
For I = 1 To R
    If InStr(sArr(I, 1), "#") Then
        K = K + 1
        dArr(K, 1) = Split(sArr(I, 1), "#")(0)
        dArr(K, 2) = Split(sArr(I, 1), "#")(1)
    End If
Next I
'=============================='
Range("I2").Resize(K, 2) = dArr
End Sub
 
Quá tuyệt vời.
Thanks a anh đã hỗ trợ.
 
Bài nào của người viết nào bạn nên "trích dẫn" rồi mới "Quá tuyệt vời".
Bạn nên trích dẫn bài #2.
E chỉ cần dùng hàm thôi ạ, chứ VBA e chưa biết gì ạ.
Bài #5 của tôi không "dính" gì với yêu cầu từ bài #1 của bạn, tôi cũng hiểu là "Quá tuyệt vời" luôn hay sao.
 
Thử:
Mã:
C2=IFERROR(T(INDEX($A$2:$A$100,MATCH(,INDEX(COUNTIF($F$1:$F1,$A$2:$A$100)+(LEFT($A$2:$A$100)="A"),),))),"")
D2=OFFSET($A1,MATCH("A*",OFFSET($A$1,MATCH(F2,$A$2:$A$100,),):$A$100,)+COUNTIF($A$1:OFFSET($A$1,MATCH(F2,$A$2:$A$100,),),"A*"),)
Enter, fill xuống.

Thân
Thêm cách cộng khoảng cách
G2=OFFSET($A$1,MATCH("A*",OFFSET($A$2:$A$100,MATCH(F2,$A$2:$A$100,),),)+MATCH(F2,$A$2:$A$100,0),)
 

File đính kèm

  • SCAN.xlsx
    10.6 KB · Đọc: 11
Thử:
Mã:
C2=IFERROR(T(INDEX($A$2:$A$100,MATCH(,INDEX(COUNTIF($F$1:$F1,$A$2:$A$100)+(LEFT($A$2:$A$100)="A"),),))),"")
D2=OFFSET($A1,MATCH("A*",OFFSET($A$1,MATCH(F2,$A$2:$A$100,),):$A$100,)+COUNTIF($A$1:OFFSET($A$1,MATCH(F2,$A$2:$A$100,),),"A*"),)
Enter, fill xuống.

Thân
Em ko hiểu lắm về hàm Match ở ô C2. Anh có thể giải thích giúp được không? Hàm này không có đối số đầu và cuối thì trả về kết quả như nào?
 
Em ko hiểu lắm về hàm Match ở ô C2. Anh có thể giải thích giúp được không? Hàm này không có đối số đầu và cuối thì trả về kết quả như nào?
Nếu không có giá trị tìm, hoặc đối số sau cùng thì nó tự ngầm hiểu là 0, tức:
MATCH( __ , INDEX(COUNTIF($F$1:$F1,$A$2:$A$100)+(LEFT($A$2:$A$100)="A") , __ )
hoàn toàn giống với:
MATCH( 0 , INDEX(COUNTIF($F$1:$F1,$A$2:$A$100)+(LEFT($A$2:$A$100)="A"), 0 )

Thân
 
Bài nào của người viết nào bạn nên "trích dẫn" rồi mới "Quá tuyệt vời".
Bạn nên trích dẫn bài #2.

Bài #5 của tôi không "dính" gì với yêu cầu từ bài #1 của bạn, tôi cũng hiểu là "Quá tuyệt vời" luôn hay sao.
Dạ vâng anh,
Lần sau em sẽ rút kinh nghiệm ^^
Nhưng mặc dù không hiểu VBA, vẫn thực sự cám ơn anh đã giúp đỡ ạ.
 
Thử:
Mã:
C2=IFERROR(T(INDEX($A$2:$A$100,MATCH(,INDEX(COUNTIF($F$1:$F1,$A$2:$A$100)+(LEFT($A$2:$A$100)="A"),),))),"")
D2=OFFSET($A1,MATCH("A*",OFFSET($A$1,MATCH(F2,$A$2:$A$100,),):$A$100,)+COUNTIF($A$1:OFFSET($A$1,MATCH(F2,$A$2:$A$100,),),"A*"),)
Enter, fill xuống.

Thân
Thêm 1 cách khác tìm TÊN
Mã:
=OFFSET($A$1,AGGREGATE(15,6,ROW($H$1:$H$100)/(LEFT($A$2:$A$100)<>"A"),ROW(L1)),)
tham khảo file đính kèm
 

File đính kèm

  • SCAN.xlsm
    17.4 KB · Đọc: 7
Híc! Nhìn hoa mắt!
Tôi cũng thử với VBA (Không Dic) nó cũng hoa mắt luôn:
PHP:
Public Sub DiecLuon()
Dim sArr(), I As Long, K As Long, R As Long, ViTri As String
    sArr = Range("A2", Range("A1000000").End(xlUp)).Value
    R = UBound(sArr)
ReDim dArr(1 To R, 1 To 2)
'=============================='
For I = R To 1 Step -1
    If Len(sArr(I, 1)) < 8 Then
        ViTri = sArr(I, 1)
    Else
        sArr(I, 1) = sArr(I, 1) & "#" & ViTri
    End If
Next I
'=============================='
For I = 1 To R
    If InStr(sArr(I, 1), "#") Then
        K = K + 1
        dArr(K, 1) = Split(sArr(I, 1), "#")(0)
        dArr(K, 2) = Split(sArr(I, 1), "#")(1)
    End If
Next I
'=============================='
Range("I2").Resize(K, 2) = dArr
End Sub
Nếu bạn cần đọc ngược để ghi vị trí thì cứ việc ghi ngược. Sau khi ghi xong thì lộn ngược mảng lại.
Ví dụ bạn có mảng dA(K, 2) : K là số dòng, cột 1 là tên và cột 2 là vị trí.
' code lộn ngược mảng
dau = 1
duoi = K
Do While dau < duoi
tmp1 = dA(dau, 1)
tmp2 = dA(dau, 2)
dA(dau, 1) = dA(duoi, 1)
dA(dau, 2) = dA(duoi, 2)
dA(duoi, 1) = tmp1
dA(duoi, 2) = tmp2
dau = dau + 1
duoi = duoi - 1
Loop
Code dài dòng nhưng rất rõ rệt.

Cách khác, đọc xuôi, ghi tên xuôi và ghi vị trí ngược:

For i = 1 to UBound(sA)
If sA(i, 1) Like "A*" Then ' vị trí
For i2 = K To 1 Step -1 ' ghi vị trí ngược lại
If dA(K, 2) <> "" Then Exit For ' gặp vị trí cũ, không cần ghi nữa
dA(K, 2) = sA(i, 1)
Next i2
Else ' tên
K = K + 1
dA(K, 1) = sA(i, 1)
dA(K, 2) = ""
End If
Nextii
 
Web KT
Back
Top Bottom