Chuyển đổi dữ liệu từ dòng sang cột (1 người xem)

Người dùng đang xem chủ đề này

huyendoan80

Thành viên mới
Tham gia
12/5/11
Bài viết
11
Được thích
0
Mình có 1 bảng dữ liệu, dữ liệu tương đối nhiều. Mình muốn chuyển dữ liệu của các dòng thành cột, có file đính kèm theo, nhờ các anh chị em giúp đỡ. Dùng lệnh copy-paste-transpose thì không thích hợp cho file dữ liệu này. Xin giúp đỡ. Cảm ơn nhiều.
 

File đính kèm

cột I và J: copy cột A và B dán vào và dùng Remove Duolicates
ô K3
=IFERROR(OFFSET($C$1,INDEX(LARGE(($I3&$J3=INDEX($A$1:$A$3100&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
copy cho L3 và N3
ô N3
=IFERROR(OFFSET($D$1,INDEX(LARGE(($I3&$J3=INDEX($A$1:$A$3100&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
Copy cho O3 và P3
copy cho các dòng còn lại
 

File đính kèm

Mình có 1 bảng dữ liệu, dữ liệu tương đối nhiều. Mình muốn chuyển dữ liệu của các dòng thành cột, có file đính kèm theo, nhờ các anh chị em giúp đỡ. Dùng lệnh copy-paste-transpose thì không thích hợp cho file dữ liệu này. Xin giúp đỡ. Cảm ơn nhiều.
Tờ 24, thửa 22 (các dòng 2379:2382) đang trùng lặp đấy nhé bạn. Nếu dữ liệu chỗ này mà nhập đúng thì cần phải thêm cột LD4 và DT4 nữa mới đủ chứa kết quả.
Bài này mà dùng hàm thì chắc ớn ăn lắm, ít nhất là tôi chịu thua. Thôi thì sẵn lâu ngày không dợt lại em "đít to" (Dictionary), nay luyện lại cho khỏi quên:
[GPECODE=vb]Sub ChuyenDuLieu()
Dim Dic As Object, i As Long, k As Long, n As Long, S As String, Tmp, Arr()

On Error Resume Next
n = Sheet1.[A65500].End(xlUp).Row - 2 'So dong du lieu
[I3:P3].Resize(n).Clear 'Xoa vung chua ket qua
Tmp = [A3:D3].Resize(n)
ReDim Arr(1 To n, 1 To 8)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To n
S = Tmp(i, 1) & "_" & Tmp(i, 2)
If Not Dic.Exists(S) Then
k = k + 1
Dic.Add S, 1 'Them Key (To_Thua)
Else
Dic.Item(S) = Dic.Item(S) + 1 'Them Item (LD, DT)
End If
Arr(k, 1) = Tmp(i, 1) 'To
Arr(k, 2) = Tmp(i, 2) 'Thua
Arr(k, Dic.Item(S) + 2) = Tmp(i, 3) 'LD
Arr(k, Dic.Item(S) + 5) = Tmp(i, 4) 'DT
Next
Sheet1.[I3:P3].Resize(k) = Arr 'Gan du lieu len sheet
End Sub[/GPECODE]
Nếu dữ liệu ở các dòng 2379:2382 bạn nhập sai và xóa bớt đi thì vùng chứa kết quả là đủ cột cần thiết, và bạn xóa dòng lệnh 4 ở trên đi (dòng lệnh On Error Resume Next)
Trong file, bạn nhấn nút Chuyển dữ liệu để chạy code.
Lưu ý: Code chỉ chạy đúng khi dữ liệu gốc đảm bảo rằng các lô đất cùng tờ, thửa được nhập liền nhau.
 

File đính kèm

Mình có 1 bảng dữ liệu, dữ liệu tương đối nhiều. Mình muốn chuyển dữ liệu của các dòng thành cột, có file đính kèm theo, nhờ các anh chị em giúp đỡ. Dùng lệnh copy-paste-transpose thì không thích hợp cho file dữ liệu này. Xin giúp đỡ. Cảm ơn nhiều.
Viết đại. Thấy code không được đẹp như bài trên, mà kết quả cũng không giống nữa cơ. (cái nào đúng thì bạn lấy cái đó xài, vì cũng không hiểu cho lắm).
 

File đính kèm

Lần chỉnh sửa cuối:
cột I và J: copy cột A và B dán vào và dùng Remove Duolicates
ô K3
=IFERROR(OFFSET($C$1,INDEX(LARGE(($I3&$J3=INDEX($A$1:$A$3100&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
copy cho L3 và N3
ô N3
=IFERROR(OFFSET($D$1,INDEX(LARGE(($I3&$J3=INDEX($A$1:$A$3100&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
Copy cho O3 và P3
copy cho các dòng còn lại
Dữ liệu của bạn chưa đúng
To 1 thua {3,4} thì LD1 là ODT, chứ không phải là CLN, BHK
Mình sài thêm cột phụ để giải bài này!!!
 

File đính kèm

cột I và J: copy cột A và B dán vào và dùng Remove Duolicates
ô K3
=IFERROR(OFFSET($C$1,INDEX(LARGE(($I3&$J3=INDEX($A$1:$A$3100&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
copy cho L3 và N3
ô N3
=IFERROR(OFFSET($D$1,INDEX(LARGE(($I3&$J3=INDEX($A$1:$A$3100&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
Copy cho O3 và P3
copy cho các dòng còn lại
Copy công thức cho hết vùng kết quả là máy chạy đơ luôn, mà không rõ có vấn đề gì mà tôi thấy có một số chỗ sai kết quả, chẳng hạn tờ 1, thửa 11 chỉ có 2 lô tại dòng 17, 18 nhưng công thức lại cho ra 3 lô và diện tích cũng sai. Bạn kiểm tra lại công thức thử xem.
 
Viết đại. Thấy code không được đẹp như bài trên, mà kết quả cũng không giống nữa cơ. (cái nào đúng thì bạn lấy cái đó xài, vì cũng không hiểu cho lắm).
Tôi hiểu đây là dữ liệu cấp giấy chứng nhận sử dụng đất, gồm các cột: Tờ, Thửa, Loại đất và Diện tích. Theo cách hiểu này thì kết quả của anh sai rồi, chẳng hạn tờ 1, thửa 11 có 2 lô: ODT, CLN với diện tích tương ứng là 250 và 428.2, còn trong kết quả của anh thì không phải vậy.
 
Tôi hiểu đây là dữ liệu cấp giấy chứng nhận sử dụng đất, gồm các cột: Tờ, Thửa, Loại đất và Diện tích. Theo cách hiểu này thì kết quả của anh sai rồi, chẳng hạn tờ 1, thửa 11 có 2 lô: ODT, CLN với diện tích tương ứng là 250 và 428.2, còn trong kết quả của anh thì không phải vậy.
Đã sửa lại file nhưng không hiểu sao vẫn ít dòng kết quả hơn của anh nhỉ?
 
Đã sửa lại file nhưng không hiểu sao vẫn ít dòng kết quả hơn của anh nhỉ?
Anh thử dùng công thức sau cho F3 và fill xuống: =A3&"_"&B3. Sau đó Paste Value và Remove Duplicate đi, sẽ thấy có 2304 kết quả. Như vậy kết quả của anh là bị thiếu rồi.
 
Anh thử dùng công thức sau cho F3 và fill xuống: =A3&"_"&B3. Sau đó Paste Value và Remove Duplicate đi, sẽ thấy có 2304 kết quả. Như vậy kết quả của anh là bị thiếu rồi.
À. Mình đã hiểu lý do tại sao thiếu rồi. Hehe. Nhưng làm biếng sửa. Code #3 chắc ok rồi. Cảm ơn nhiều.
 
sửa lại công thức
K3 =IFERROR(OFFSET($C$1,INDEX(LARGE(($I3&" "&$J3=INDEX($A$1:$A$3100&" "&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
N3 =IFERROR(OFFSET($D$1,INDEX(LARGE(($I3&" "&$J3=INDEX($A$1:$A$3100&" "&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
 
sửa lại công thức
K3 =IFERROR(OFFSET($C$1,INDEX(LARGE(($I3&" "&$J3=INDEX($A$1:$A$3100&" "&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
N3 =IFERROR(OFFSET($D$1,INDEX(LARGE(($I3&" "&$J3=INDEX($A$1:$A$3100&" "&$B$1:$B$3100,0))*ROW($1:$3100),COLUMN(A:A)),0)-1,),"")
Sử dụng hàm Large là không ra kết quả đúng được đậu bạn, sử dụng hàm Small+Ctrl+Shift+Enter mới được bạn!!!
K3=IFERROR(OFFSET($C$1,SMALL(IF(($I3&" "&$J3=$A$1:$A$3100&" "&$B$1:$B$3100),ROW($1:$3100)),COLUMN(A:A))-1,),"")
 
Lần chỉnh sửa cuối:
Sử dụng hàm Large là không ra kết quả đúng được đậu bạn, sử dụng hàm Small+Ctrl+Shift+Enter mới được bạn!!!
K3=IFERROR(OFFSET($C$1,SMALL(IF(($I3&" "&$J3=$A$1:$A$3100&" "&$B$1:$B$3100),ROW($1:$3100)),COLUMN(A:A))-1,),"")
Dù sao thì bài này xài công thức vẫn ì ạch, mỗi lần nhập, sửa dữ liệu là lại mất một khoảng thời gian để máy tính lại kết quả. Vụ này xài VBA với Dictionary và mảng có vẻ ngon ăn nhất.
 

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

Back
Top Bottom