Xin Hướng Dẫn Chuyển Cột Thành Dòng. (1 người xem)

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

sử dụng công thức của anh ndu giải cho bạn nha
còn mấy ô bằng 0, điền số vào chắc ko khó
=INDEX(mydata;INT((ROWS($1:1)-1)/COLUMNS(mydata))+1;MOD((ROWS($1:1)-1);COLUMNS(mydata))+1)

p/s: tại vì khi giải đúng hết là bạn đi lun ko bao giờ hồi âm hết, nên phải để chổ để bạn hồi âm
 

File đính kèm

Lần chỉnh sửa cuối:
sử dụng công thức của anh ndu giải cho bạn nha
còn mấy ô bằng 0, điền số vào chắc ko khó
=INDEX(mydata;INT((ROWS($1:1)-1)/COLUMNS(mydata))+1;MOD((ROWS($1:1)-1);COLUMNS(mydata))+1)

p/s: tại vì khi giải đúng hết là bạn đi lun ko bao giờ hồi âm hết, nên phải để chổ để bạn hồi âm

Không đi luôn đâu bạn ơi, thành viên này là một trong những thành viên có thâm niên lâu đời đấy (1/2007), nếu mà đi luôn thì không gắn bó lâu đến như vậy!
 
Không đi luôn đâu bạn ơi, thành viên này là một trong những thành viên có thâm niên lâu đời đấy (1/2007), nếu mà đi luôn thì không gắn bó lâu đến như vậy!

hì hì, ko có đi lun, nhưng giải xong chẳng có hồi âm, nên chắc bit là đúng hay sai
nói vui thôi, nhờ mod xoá spam

tks
 
hì hì, ko có đi lun, nhưng giải xong chẳng có hồi âm, nên chắc bit là đúng hay sai
nói vui thôi, nhờ mod xoá spam

tks

Thì kệ họ chứ biết làm sao bây giờ, mình giải bài chắc là đúng ý nên họ không trả lời nữa thôi, còn không đúng chắc chắn rồi sẽ quay lại, hơi đâu mà bận tâm, vì đó là quyền lợi của họ mà!
 
Mình có File Muốn chuyển cột thành dòng theo thời gian.

Xài code đi cho sướng khỏi nhức đầu. Công thức sao khó quá.
PHP:
Sub ngang_doc()
Dim data(), i, j, kq(1 To 10000, 1 To 2), k
data = Range([C2], [C65536].End(3)).Resize(, 2).Value
For i = 1 To UBound(data)
   For j = 1 To UBound(data, 2)
      If data(i, j) <> "" Then
         k = k + 1
         kq(k, 1) = i
         kq(k, 2) = data(i, j)
      End If
   Next
Next
[g2].Resize(k) = kq
End Sub
 
Xài code đi cho sướng khỏi nhức đầu. Công thức sao khó quá.
PHP:
Sub ngang_doc()
Dim data(), i, j, kq(1 To 10000, 1 To 2), k
data = Range([C2], [C65536].End(3)).Resize(, 2).Value
For i = 1 To UBound(data)
   For j = 1 To UBound(data, 2)
      If data(i, j) <> "" Then
         k = k + 1
         kq(k, 1) = i
         kq(k, 2) = data(i, j)
      End If
   Next
Next
[g2].Resize(k) = kq
End Sub

Có một đặc điểm mà QuangHai thường bị là khai báo một mảng với số phần tử cho trước [ kq(1 To 10000, 1 To 2) ], đó là một thói quen không tốt:

1) Nếu dữ liệu quá ít sẽ bị thừa phần tử (có thể chấp nhận)

2) Nếu dữ liệu nhiều hơn số phần tử khai báo chắc chắn sẽ phát sinh lỗi.

Tại sao mình không khai báo là một biến Variant bình thường rồi sau đó ReDim chúng với chiều dài (lớn nhất) của mảng bằng Ubound(Array,1) nhỉ?

Một kinh nghiệm mà mình đã từng phát hiện nếu dùng:

data = Range([C2], [C65536].End(3)).Resize(, 2).Value

Sẽ chậm hơn cái này:

data = Range([C2], [C65536].End(3)).Resize(, 2)

Đã từng thử nghiệm với 65536 và kết quả nhanh hơn gần gấp đôi thời gian.
 
Có một đặc điểm mà QuangHai thường bị là khai báo một mảng với số phần tử cho trước [ kq(1 To 10000, 1 To 2) ], đó là một thói quen không tốt:

1) Nếu dữ liệu quá ít sẽ bị thừa phần tử (có thể chấp nhận)

2) Nếu dữ liệu nhiều hơn số phần tử khai báo chắc chắn sẽ phát sinh lỗi.

Tại sao mình không khai báo là một biến Variant bình thường rồi sau đó ReDim chúng với chiều dài (lớn nhất) của mảng bằng Ubound(Array,1) nhỉ?

Một kinh nghiệm mà mình đã từng phát hiện nếu dùng:

data = Range([C2], [C65536].End(3)).Resize(, 2).Value

Sẽ chậm hơn cái này:

data = Range([C2], [C65536].End(3)).Resize(, 2)

Đã từng thử nghiệm với 65536 và kết quả nhanh hơn gần gấp đôi thời gian.
Máy tính của mình thuộc dạng siêu tốc độ thì không lo về tốc độ

Sau khi viết code nếu bị lỗi thì viết tiếp, nhiều bài mau lên sao.. ha ha ha

Dạo này thất nghiệp quá mà

Nói thế thôi chứ nếu bài nào có cung cấp đủ thông tin thì mình cũng nên mần ăn cho đàng hoàng tí giống như anh góp ý
 
Lần chỉnh sửa cuối:
Máy tính của mình thuộc dạng siêu tốc độ thì không lo về tốc độ

Sau khi viết code nếu bị lỗi thì viết tiếp, nhiều bài mau lên sao.. ha ha ha

Dạo này thất nghiệp quá mà

Nói thế thôi chứ nếu bài nào có cung cấp đủ thông tin thì mình cũng nên mần ăn cho đàng hoàng tí giống như anh góp ý

Trời, mình xài mình viết sao thì chỉ mình mình biết, còn gửi trả lời cho người hỏi bài mà người đó chẳng biết ất giáp gì cứ thế mà phang vô file thì tội lỗi lắm thay! Hic hic...
 
Xài code đi cho sướng khỏi nhức đầu. Công thức sao khó quá.
PHP:
Sub ngang_doc()
Dim data(), i, j, kq(1 To 10000, 1 To 2), k
data = Range([C2], [C65536].End(3)).Resize(, 2).Value
For i = 1 To UBound(data)
   For j = 1 To UBound(data, 2)
      If data(i, j) <> "" Then
         k = k + 1
         kq(k, 1) = i
         kq(k, 2) = data(i, j)
      End If
   Next
Next
[g2].Resize(k) = kq
End Sub
nếu công thức thì thế này Anh Hải : cũng đơn giản thôi mà "để gọn biểu thức dưới ta đạt name
Dkk=INDIRECT(ADDRESS(INT(ROW(C2)/2)+1,3+MOD(ROW(C2),2)))
nó sẽ cho gia con so 0 nếu ô bị rỗng
nên thêm hàm if để điền giá trị nếu ô rỗng lấy giá trị ô trên
làm cho vui thôi chứ chủ thới đâu cần nưa;;;;;;;;;;;
 

File đính kèm

Lần chỉnh sửa cuối:
Có một đặc điểm mà QuangHai thường bị là khai báo một mảng với số phần tử cho trước [ kq(1 To 10000, 1 To 2) ], đó là một thói quen không tốt:

1) Nếu dữ liệu quá ít sẽ bị thừa phần tử (có thể chấp nhận)

2) Nếu dữ liệu nhiều hơn số phần tử khai báo chắc chắn sẽ phát sinh lỗi.

Tại sao mình không khai báo là một biến Variant bình thường rồi sau đó ReDim chúng với chiều dài (lớn nhất) của mảng bằng Ubound(Array,1) nhỉ?

Một kinh nghiệm mà mình đã từng phát hiện nếu dùng:

data = Range([C2], [C65536].End(3)).Resize(, 2).Value

Sẽ chậm hơn cái này:

data = Range([C2], [C65536].End(3)).Resize(, 2)

Đã từng thử nghiệm với 65536 và kết quả nhanh hơn gần gấp đôi thời gian.

Em có thắc mắc về việc xác định chính xác độ lớn mảng khi thực hiện các phép toán lọc nhưng vẫn chưa có câu trả lời. Nhân đây em muốn hỏi anh xem có cách nào để Redim Preserve theo chiều ngang được không? Chứ cứ khai báo Ubound(..) cũng không chính xác với vùng dữ liệu mình trích xuất.
 
Em có thắc mắc về việc xác định chính xác độ lớn mảng khi thực hiện các phép toán lọc nhưng vẫn chưa có câu trả lời. Nhân đây em muốn hỏi anh xem có cách nào để Redim Preserve theo chiều ngang được không? Chứ cứ khai báo Ubound(..) cũng không chính xác với vùng dữ liệu mình trích xuất.

Với mảng 2 chiều thì chỉ cho resize được chiều "cột" còn chiều "hàng" thì pó tay nhé! Vì không thể xác định chắc chắn là bao nhiêu nên cứ lấy số lớn nhất là tổng số hàng của mảng đầu vào cho chắc ăn, sau đó ta thêm biến phụ n = n + 1, khi gán xuống range thì resize theo n chiều "hàng".
 
Em có thắc mắc về việc xác định chính xác độ lớn mảng khi thực hiện các phép toán lọc nhưng vẫn chưa có câu trả lời. Nhân đây em muốn hỏi anh xem có cách nào để Redim Preserve theo chiều ngang được không? Chứ cứ khai báo Ubound(..) cũng không chính xác với vùng dữ liệu mình trích xuất.
Trong bài này mình có dùng Redim Preserve. Bạn tham khảo xem
 

File đính kèm

- Vấn đề sử dụng Redim Preserve em cũng Vooc qua và cũng đã dùng, nhưng chỉ vì cái giới hạn Resize "cột" đó nên thắc mắc cách để resize "hàng" thui anh à.

Cảm ơn các anh!
Bác Bill nói vầy nè
If you use the Preserve keyword, you can resize only the last array dimension and you can't change the number of dimensions at all. For example, if your array has only one dimension, you can resize that dimension because it is the last and only dimension. However, if your array has two or more dimensions, you can change the size of only the last dimension and still preserve the contents of the array.

Cho nên anh em mình chỉ có thế Redim Preserve chiều cột thôi
 
- Vấn đề sử dụng Redim Preserve em cũng Vooc qua và cũng đã dùng, nhưng chỉ vì cái giới hạn Resize "cột" đó nên thắc mắc cách để resize "hàng" thui anh à.

Cảm ơn các anh!

Nếu chơi "đểu" một tí thì đầu vào mình Transpose anh mảng trước rồi mình xử lý theo "cột", muốn bao nhiêu tùy ý, sau đó mình lại Transpose lại. Với dữ liệu nhỏ nhỏ thì làm vậy được!

Có lẽ vì điều này nên khi xuất lấy mảng từ ADO (GetRows) thì toàn là mảng ngược (phải xử lý lại), nên cách thức tính toán của ADO nó có vẽ như nhanh hơn mình viết code thì phải.
 
Lần chỉnh sửa cuối:
Mình có File Muốn chuyển cột thành dòng theo thời gian.

Ôi vui quá, tham gia tí.


̣Đặt name
Mã:
[COLOR=#ff0000]data[/COLOR] =OFFSET($C$2:$D$2;0;0;COUNTA($C:$C))

Chọn ô F2 rồi đặt name
Mã:
[COLOR=#ff0000]pos[/COLOR] =SMALL(IF(data<>"";(ROW(data)-1)*[COLOR=#ff0000]10[/COLOR]+COLUMN(data)-2;"");ROWS($1:1))


Công thức cho ô F2
Mã:
=INDEX(data;INT(pos/[COLOR=#ff0000]10[/COLOR]);MOD(pos;[COLOR=#ff0000]10[/COLOR]))

Kéo xuống dưới.
------------
Nếu thích thì gộp 2 name thành 1 name pos

Công thức ở trên đúng với số cột dữ liệu tới 9 cột. Nếu số cột > 9 và <= 99 thì sửa 10 thành 100. Nếu số cột > 99 và <= 999 thì sửa 10 thành 1000
 
sử dụng công thức của anh ndu giải cho bạn nha
còn mấy ô bằng 0, điền số vào chắc ko khó
=INDEX(mydata;INT((ROWS($1:1)-1)/COLUMNS(mydata))+1;MOD((ROWS($1:1)-1);COLUMNS(mydata))+1)

p/s: tại vì khi giải đúng hết là bạn đi lun ko bao giờ hồi âm hết, nên phải để chổ để bạn hồi âm

Nếu dùng công thức xong lại phải dò để xóa các ô có 0 rồi dồn cột thì bạn giết người ta rồi còn gì. Mà bạn định dồn cột như thế nào? Và nữa: nếu cột nguồn (cột D) có số 0 thì lấy còn nếu rỗng thì bỏ, nếu đk là thế thì bạn định giải quyết thế nào?
Đã công thức thì kéo là xong chứ ai lại làm "bán cơ giới" như thế.
 
Nếu dùng công thức xong lại phải dò để xóa các ô có 0 rồi dồn cột thì bạn giết người ta rồi còn gì. Mà bạn định dồn cột như thế nào? Và nữa: nếu cột nguồn (cột D) có số 0 thì lấy còn nếu rỗng thì bỏ, nếu đk là thế thì bạn định giải quyết thế nào?
Đã công thức thì kéo là xong chứ ai lại làm "bán cơ giới" như thế.
hình như bài của chủ thớt yêu cầu nếu ô rỗng thì lấy giá trị của ô trước nữa đó Bác, "nhận xét theo ví du"
nhưng có điều kỳ kỳ là ko hiểu chủ thớt làm thế nào hay có nhầm lẫn gì không, mà phần đầu dòng 1 xong tới dòng 2 nhưng ở phần gần cuối ô rỗng thì lấy 2 dòng liên tiếp rồi tới cột
123.jpg
 
Lần chỉnh sửa cuối:
hình như bài của chủ thớt yêu cầu nếu ô rỗng thì lấy giá trị của ô trước nữa đó Bác, "nhận xét theo ví du"
nhưng có điều kỳ kỳ là ko hiểu chủ thớt làm thế nào hay có nhầm lẫn gì không, mà phần đầu dòng 1 xong tới dòng 2 nhưng ở phần gần cuối ô rỗng thì lấy 2 dòng liên tiếp rồi tới cột
View attachment 100680

Có lẽ bạn không hiểu tôi viết gì thì đúng hơn.
Bạn chạy code của tôi thì thấy như đúng yêu cầu của chủ thớt.
Yêu cầu là phải liệt kê các ô dữ liệu nguồn theo cách sau: chạy từng dòng của dữ liệu nguồn. Nếu ô nào trong dòng rỗng thì không lấy.
Ví dụ có 3 dòng
dòng 1: a, b
dòng 2: c,
dòng 3: d, e

Ta đi từng dòng:
dòng 1: lấy a, b
dòng 2: lấy c
dòng 3: lấy d, e
Kết quả là lấy: a, b, c, d, e
-----------------

View attachment 100685

Bạn nhìn vào hình minh họa của chủ topic
Bạn nhìn vào cách đánh số trong cột E nhé: 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10

Bạn sẽ thấy là dòng dữ liệu thứ 4 và 7 (tức dòng 5 và 8 của bảng tính) chỉ được liệt kê 1 lần vì chỉ có 1 ô được lấy còn ô rỗng bỏ. Ô rỗng này không được thay thế bởi ô nào cả.

Bạn nhìn ô F18 nên bạn tưởng ô rỗng D10 được thay thế bởi ô C10? Nếu đúng qui luật là thế thì phải có
4 17600000
4 17600000
...
7 17600000
7 17600000

Nhưng nhìn hình minh họa thì làm gì có? Và chỉ số 4, 7 chỉ được liệt kê 1 lần

Vậy tôi cho là: các ô rỗng thì bỏ và không được thay thế bởi gì cả. Ô F18 là do chủ thớt chóng mặt viết thêm mà thôi.
-----------------
Tôi không nói là chủ thớt chắc chắn muốn như tôi nói. Vì chuyện chủ thớt có gì trong đầu thì tôi, bạn đều không thể biết được. Cái mà ta có thể chắc chắn chỉ có thể là cái nhìn thấy được, ngửi được, nếm được, nghe được, hoặc sờ được, tức tập tin cùng cái minh họa trong đó. Mọi nỗ lực "đoán ý đồng đội" theo tôi là vô nghĩa. Tất nhiên có 2 khả năng:

1: Ô F18 là do nhìn hình rối rắm chóng mặt nên chủ thớt viết thêm (nhầm) còn cách hiểu như tôi. Như thế thì có 1 chỗ sai
2. Ô F18 là đúng qui luật. Như thế thì có 4 chỗ sai - thiếu 2 dòng 4 và 7 với dữ liệu là 17600000 và thiếu 2 chỉ số 4 và 7 trong cột E

Tôi chọn cách hiểu 1 vì chỉ phạm 1 chỗ sai, xác suất cao hơn. Cách hiểu 2 đòi hỏi chủ thớt phải phạm lỗi 4 lần, khả năng theo tôi thấp hơn.
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom