Hỏi về nối 2 mảng trong excel (1 người xem)

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

minhxaydungvinh

Thành viên chính thức
Tham gia
25/12/10
Bài viết
85
Được thích
7
Các bác cho em hỏi là có cách nào nối 2 hay nhiều mảng thành 1 mảng giống như hàm concatenate nối các chuỗi lại không nhỉ? Ví dụ như nối 3 mảng {0;0;0;0;0} ; {2;2;2;2;2} ; {3;3;3;3;3} thành {0;0;0;0;0;2;2;2;2;2;3;3;3;3;3}
 
Tôi đã viết một module chuyển về xử lý mảng tốc độ nhanh, không dùng vòng lặp, cho phép ghép nối các mảng lại với nhau. Nếu bạn biết lập trình VBA thì xem mã nguồn tại đây:
http://www.giaiphapexcel.com/diendan/threads/tặng-các-bạn-module-modfastarray-các-hàm-xử-lý-mảng-trong-bộ-nhớ-tốc-độ-nhanh.77981/
Cảm ơn bác. VBA em kém lắm. Có Công thức nào cho vấn đề này không bác
 
Cảm ơn bác. VBA em kém lắm. Có Công thức nào cho vấn đề này không bác

Nếu bạn không biết gì về VBA, chỉ cần một hàm làm được thì bạn cài Add-in A-Tools sau đó dùng công thức sau:

Giả thiết bạn có 3 vùng giá trị A4:A10,B4:B10,C4:C10

Bạn bôi đen một vùng, ví dụ D1:D21, sau đó nhập công thức (trong khi vùng vẫn bôi đen)
=TRANSPOSE(bs_JoinArrayRows(A4:A10,B4:B10,C4:C10))

Kết thúc bạn nhấn CTRL+SHIFT+ENTER
 
Các bác cho em hỏi là có cách nào nối 2 hay nhiều mảng thành 1 mảng giống như hàm concatenate nối các chuỗi lại không nhỉ? Ví dụ như nối 3 mảng {0;0;0;0;0} ; {2;2;2;2;2} ; {3;3;3;3;3} thành {0;0;0;0;0;2;2;2;2;2;3;3;3;3;3}
Thử: Chọn A1:A15, dán công thức:
PHP:
A1=INDEX(AGGREGATE(15,6,CHOOSE({1,2,3},{0;0;0;0;0},{2;2;2;2;2},{3;3;3;3;3}),ROW(1:15)),)
Ctrl+Shift+Enter

Nếu dùng trong công thức tính toán thì chỉ cần: = AGGREGATE(15,6,CHOOSE({1,2,3},{0;0;0;0;0},{2;2;2;2;2},{3;3;3;3;3}),ROW(1:15)), dùng thêm Index(......,) xem cho dễ hơn vì Cell không thể chứa kết quả là 1 mảng.

Chúc bạn ngày vui.
p/s: Bạn nên phân biệt rõ 'Mảng' và 'Vùng' nha, vì có giống và khác nhau đó.
 
Lần chỉnh sửa cuối:
Thử: Chọn A1:A15, dán công thức:
PHP:
A1=INDEX(AGGREGATE(15,6,CHOOSE({1,2,3},{0;0;0;0;0},{2;2;2;2;2},{3;3;3;3;3}),ROW(1:15)),)
Ctrl+Shift+Enter

Nếu dùng trong công thức tính toán thì chỉ cần: = AGGREGATE(15,6,CHOOSE({1,2,3},{0;0;0;0;0},{2;2;2;2;2},{3;3;3;3;3}),ROW(1:15)), dùng thêm Index(......,) xem cho dễ hơn vì Cell không thể chứa kết quả là 1 mảng.

Chúc bạn ngày vui.
p/s: Bạn nên phân biệt rõ 'Mảng' và 'Vùng' nha, vì có giống và khác nhau đó.
Sao nó báo #NAME bác nhỉ
 

File đính kèm

  • Hoi Ham Noi Mang.jpg
    Hoi Ham Noi Mang.jpg
    263.2 KB · Đọc: 31
Nếu bạn không biết gì về VBA, chỉ cần một hàm làm được thì bạn cài Add-in A-Tools sau đó dùng công thức sau:

Giả thiết bạn có 3 vùng giá trị A4:A10,B4:B10,C4:C10

Bạn bôi đen một vùng, ví dụ D1:D21, sau đó nhập công thức (trong khi vùng vẫn bôi đen)
=TRANSPOSE(bs_JoinArrayRows(A4:A10,B4:B10,C4:C10))

Kết thúc bạn nhấn CTRL+SHIFT+ENTER
Cảm ơn bác. Để em thử ạ
 
Sao nó báo #NAME bác nhỉ
Chắc là Excel của bạn <2010.
Vậy thì vầy:
1. Nếu là 'Mảng': chọn A2:A16, dán công thức:
PHP:
A2=INDEX(SMALL(CHOOSE({1,2,3},{0;0;0;0;0},{2;2;2;2;2},{3;3;3;3;3}),ROW(1:15)),)
Ctrl+Shift+Enter

2. Nếu là 'Vùng': chọn D2: D16, dán công thức:
PHP:
D2=INDEX(SMALL((A2:A6,B7:B11,C12:C16),ROW(1:15)),)
Ctrl+Shift+Enter

Chúc bạn ngày vui.
 

File đính kèm

Lần chỉnh sửa cuối:
Chắc là Excel của bạn <2010.
Vậy thì vầy:
1. Nếu là 'Mảng': chọn A2:A16, dán công thức:
PHP:
A2=INDEX(SMALL(CHOOSE({1,2,3},{0;0;0;0;0},{2;2;2;2;2},{3;3;3;3;3}),ROW(1:15)),)
Ctrl+Shift+Enter

2. Nếu là 'Vùng': chọn D2: D16, dán công thức:
PHP:
D2=INDEX(SMALL((A2:A6,B7:B11,C12:C16),ROW(1:15)),)
Ctrl+Shift+Enter

Chúc bạn ngày vui.
Cảm ơn bác nhiều ạ. Sẵn đây bác cho em hỏi là tại sao dùng Công thức INDEX(SMALL(CHOOSE({1\2\3};{0;0;0;0;0};{2;2;2;2;2};{3;3;3;3;3});ROW(1:15));) thì được mà dùng INDEX(SMALL(CHOOSE({1;2;3};{0;0;0;0;0};{2;2;2;2;2};{3;3;3;3;3});ROW(1:15));) lại báo lỗi #NA nhỉ? Bác cho em hỏi dấu \ và dấu ; trong công thức mảng khác nhau như thế nào ạ
 
Cảm ơn bác nhiều ạ. Sẵn đây bác cho em hỏi là tại sao dùng Công thức INDEX(SMALL(CHOOSE({1\2\3};{0;0;0;0;0};{2;2;2;2;2};{3;3;3;3;3});ROW(1:15));) thì được mà dùng INDEX(SMALL(CHOOSE({1;2;3};{0;0;0;0;0};{2;2;2;2;2};{3;3;3;3;3});ROW(1:15));) lại báo lỗi #NA nhỉ? Bác cho em hỏi dấu \ và dấu ; trong công thức mảng khác nhau như thế nào ạ
Cái đó là do Control Panel máy bạn định dạng theo hệ thống Vietnamese nên nó thay đổi dấu ngăn cách số khác với hệ thống Anh Mỹ, và dấu "," phân cách côt trong công thức 'Mảng' bị thay bằng "\".

Chúc bạn ngày vui.
 
Cái đó là do Control Panel máy bạn định dạng theo hệ thống Vietnamese nên nó thay đổi dấu ngăn cách số khác với hệ thống Anh Mỹ, và dấu "," phân cách côt trong công thức 'Mảng' bị thay bằng "\".

Chúc bạn ngày vui.
Giờ thì em hiểu rồi. Tks bác lần nữa nhá :D
 
Giờ thì em hiểu rồi. Tks bác lần nữa nhá :D
Nếu bạn đã hiểu rồi, tôi muốn hỏi thêm: do trường hợp bạn đưa ra là các 'Mảng 1 chiều' bằng nhau về độ dài (5 dòng), vậy nếu nó không đồng đều thì bạn sẽ xử lý như thế nào?
Ví dụ: 3 mảng {0;0;0;0;0;0;0}, {2;2;2}; {3;3;3;3;3;3;3;3;3;3}

Chúc bạn học tập vui với đại gia đình GPE.
 
Nếu bạn đã hiểu rồi, tôi muốn hỏi thêm: do trường hợp bạn đưa ra là các 'Mảng 1 chiều' bằng nhau về độ dài (5 dòng), vậy nếu nó không đồng đều thì bạn sẽ xử lý như thế nào?
Ví dụ: 3 mảng {0;0;0;0;0;0;0}, {2;2;2}; {3;3;3;3;3;3;3;3;3;3}

Chúc bạn học tập vui với đại gia đình GPE.
Em sử dụng hàm IFERROR như sau: INDEX(SMALL(IFERROR(CHOOSE({1\2\3};{0;0;0;0;0;0;0};{2;2;2};{3;3;3;3;3;3;3;3;3;3});1000);ROW(1:20));). Không biết có cách nào hay hơn nữa không? Mà sẵn đây em hỏi bác luôn là có hàm nào xóa phần tử trong mảng không bác? VD như {0;0;0;0;0;2;2;2;2;2;3;3;3;3;3} xóa các phần tử 2 đi chỉ còn lại: {0;0;0;0;0;3;3;3;3;3}. hoặc tổng quát hơn là xóa n phần tử từ vị trí thứ k ạ?
 
Em sử dụng hàm IFERROR như sau: INDEX(SMALL(IFERROR(CHOOSE({1\2\3};{0;0;0;0;0;0;0};{2;2;2};{3;3;3;3;3;3;3;3;3;3});1000);ROW(1:20));). Không biết có cách nào hay hơn nữa không? Mà sẵn đây em hỏi bác luôn là có hàm nào xóa phần tử trong mảng không bác? VD như {0;0;0;0;0;2;2;2;2;2;3;3;3;3;3} xóa các phần tử 2 đi chỉ còn lại: {0;0;0;0;0;3;3;3;3;3}. hoặc tổng quát hơn là xóa n phần tử từ vị trí thứ k ạ?
1. Em sử dụng hàm IFERROR như sau: INDEX(SMALL(IFERROR(CHOOSE({1\2\3};{0;0;0;0;0;0;0};{2;2;2};{3;3;3;3;3;3;3;3;3;3});1000);ROW(1:20));). Không biết có cách nào hay hơn nữa không?
Chính xác, phải dùng Small(Iferror()), nhưng thay vì bạn điền 1000 thì chỉ cần "" thôi vì hàm Small() 'phớt lờ' giá trị chuỗi.
Chính vì lẽ đó lúc đầu tôi giới thiệu hàm Aggregate() cho bạn, với nó dù cho có đồng đều hay không đồng đều trong các 'Mảng' nó vẫn luôn nối các 'Mảng' như yêu cầu mà không cần dùng thêm Iferror(). Khuyên bạn nên 'nâng cấp' Excel lên phiên bản cao hơn để có hàm 'hay' hỗ trợ khi nghiên cứu công thức mảng.​

2. Mà sẵn đây em hỏi bác luôn là có hàm nào xóa phần tử trong mảng không bác? VD như {0;0;0;0;0;2;2;2;2;2;3;3;3;3;3} xóa các phần tử 2 đi chỉ còn lại: {0;0;0;0;0;3;3;3;3;3}. hoặc tổng quát hơn là xóa n phần tử từ vị trí thứ k ạ?
Việc xóa 'Mảng' bằng công thức rất 'khó khăn' không như VBA. Do vậy, tùy nghi mà ứng biến: như dùng cột phụ, hay kết hợp nhiều hàm......
Một trong cách để loại trừ là dùng hàm LOOKUP(), như ví dụ của bạn tôi sẽ làm như sau:
Chọn A1:A10
PHP:
A1=INDEX(LOOKUP({1;2;3;4;5;11;12;13;14;15},ROW(1:100),{0;0;0;0;0;2;2;2;2;2;3;3;3;3;3}),)
Ctrl+Shift+Enter (nhớ thay đổi dấu "," thành ";" để phù hợp hệ thống Vietnamese của bạn).
Bạn thấy Lookup() này 'kỳ lạ' không?​

3. Bạn đã trả lời tốt về các Mảng không đều kích thước, nhưng đó là số nên dùng Small() hoặc Aggregate() được, vậy nếu nó là chuỗi 'Mảng' như 3 Mảng: {"a";"b";"c";"d";"e"}, {"f";"g";"h";"i";"j";"w"}), {"k";"l";"m";"n";"o";"p";"q";"r"} thì bạn làm sao để nối chuỗi đó thành: {"a";"b";"c";"d";"e";"f";"g";"h";"i";"j";"w";"k";"l";"m";"n";"o";"p";"q";"r"} !?
Nhớ là 'Mảng' nha, không phải 'Vùng'.

Chúc bạn học tập vui với công thức 'Mảng' của GPE.
 
Lần chỉnh sửa cuối:
1. Em sử dụng hàm IFERROR như sau: INDEX(SMALL(IFERROR(CHOOSE({1\2\3};{0;0;0;0;0;0;0};{2;2;2};{3;3;3;3;3;3;3;3;3;3});1000);ROW(1:20));). Không biết có cách nào hay hơn nữa không?
Chính xác, phải dùng Small(Iferror()), nhưng thay vì bạn điền 1000 thì chỉ cần "" thôi vì hàm Small() 'phớt lờ' giá trị chuỗi.
Chính vì lẽ đó lúc đầu tôi giới thiệu hàm Aggregate() cho bạn, với nó dù cho có đồng đều hay không đồng đều trong các 'Mảng' nó vẫn luôn nối các 'Mảng' như yêu cầu mà không cần dùng thêm Iferror(). Khuyên bạn nên 'nâng cấp' Excel lên phiên bản cao hơn để có hàm 'hay' hỗ trợ khi nghiên cứu công thức mảng.​

2. Mà sẵn đây em hỏi bác luôn là có hàm nào xóa phần tử trong mảng không bác? VD như {0;0;0;0;0;2;2;2;2;2;3;3;3;3;3} xóa các phần tử 2 đi chỉ còn lại: {0;0;0;0;0;3;3;3;3;3}. hoặc tổng quát hơn là xóa n phần tử từ vị trí thứ k ạ?
Việc xóa 'Mảng' bằng công thức rất 'khó khăn' không như VBA. Do vậy, tùy nghi mà ứng biến: như dùng cột phụ, hay kết hợp nhiều hàm......
Một trong cách để loại trừ là dùng hàm LOOKUP(), như ví dụ của bạn tôi sẽ làm như sau:
Chọn A1:A10
PHP:
A1=INDEX(LOOKUP({1;2;3;4;5;11;12;13;14;15},ROW(1:100),{0;0;0;0;0;2;2;2;2;2;3;3;3;3;3}),)
Ctrl+Shift+Enter (nhớ thay đổi dấu "," thành ";" để phù hợp hệ thống Vietnamese của bạn).
Bạn thấy Lookup() này 'kỳ lạ' không?​

3. Bạn đã trả lời tốt về các Mảng không đều kích thước, nhưng đó là số nên dùng Small() hoặc Aggregate() được, vậy nếu nó là chuỗi 'Mảng' như 3 Mảng: {"a";"b";"c";"d";"e"}, {"f";"g";"h";"i";"j";"w"}), {"k";"l";"m";"n";"o";"p";"q";"r"} thì bạn làm sao để nối chuỗi đó thành: {"a";"b";"c";"d";"e";"f";"g";"h";"i";"j";"w";"k";"l";"m";"n";"o";"p";"q";"r"} !?
Nhớ là 'Mảng' nha, không phải 'Vùng'.

Chúc bạn học tập vui với công thức 'Mảng' của GPE.
Cái này khó quá bác ah. Em thử nhiều cách rồi mà vẫn không được? Phần mảng này bao la và khó hiểu quá. :( Bác cho em hỏi là trong mảng thì thứ tự các phần tử được đếm như thế nào ạ? Có phả là đếm từ trái qua phải, từ trên xuống dưới, tức là đếm theo cột trước rồi mới đến hàng phải không ạ
 
Cứ từ từ suy nghĩ và tìm hiểu, GPE sẽ không phụ lòng người có công.

Chúc bạn ngày vui.
Bác cho em hỏi trong mảng {"a","b",'"c";"d","e","f";"g","h","j"} thì phần tử "e" có số thứ tự là 5 phải không ạ? tức là đếm theo cột trước rồi mới đến hàng?
 
Bác cho em hỏi là trong mảng thì thứ tự các phần tử được đếm như thế nào ạ? Có phả là đếm từ trái qua phải, từ trên xuống dưới, tức là đếm theo cột trước rồi mới đến hàng phải không ạ
Muốn đếm cái nào trước là tùy nơi mình.
  • Muốn Dòng trước thì đưa nó lên ưu tiên hơn Cột
  • Muốn Cột trước thì đưa nó lên ưu tiên hơn Hàng
Tất cả do mình điều khiển nó!

Thời gian đầu tiếp xúc với 'Mảng' thì "Nó' điều khiển mình, vì lúc đó nó như con ngựa chứng vậy, dần dà khi bạn đã biết các 'tính khí' của nó rồi, tức ngựa đã thuần phục, thì bạn sẽ điều khiển lại nó, sớm hay muộn là do tài năng và sự đầu tư của bạn.

Chúc bạn ngày vui.
 
Bác cho em hỏi trong mảng {"a","b",'"c";"d","e","f";"g","h","j"} thì phần tử "e" có số thứ tự là 5 phải không ạ? tức là đếm theo cột trước rồi mới đến hàng?
Nếu là 'Vùng' do có địa chỉ tồn tại hẵn hoi trên sheet nên rất dễ dàng gọi nó ra Vd: B15, AW21, hay C1:Z1500.....

Riêng 'Mảng' nằm trên 'bộ nhớ' nên nó không có địa chỉ cụ thể như 'Vùng', chính vì vậy bạn phải lấy được 'tọa độ' của nó, tức cũng phải chỉ ra được Dòng xxx Cột yyy cho các thành phần của 'Mảng' cần lấy, chứ không thể như bạn nói nó ở vị trí thứ 5 được.

Rất thú vị! vì nó kích thích trí tưởng tượng của bạn rất nhiều.

Chúc bạn ngày thiệt vui.
 
Nếu là 'Vùng' do có địa chỉ tồn tại hẵn hoi trên sheet nên rất dễ dàng gọi nó ra Vd: B15, AW21, hay C1:Z1500.....

Riêng 'Mảng' nằm trên 'bộ nhớ' nên nó không có địa chỉ cụ thể như 'Vùng', chính vì vậy bạn phải lấy được 'tọa độ' của nó, tức cũng phải chỉ ra được Dòng xxx Cột yyy cho các thành phần của 'Mảng' cần lấy, chứ không thể như bạn nói nó ở vị trí thứ 5 được.

Rất thú vị! vì nó kích thích trí tưởng tượng của bạn rất nhiều.

Chúc bạn ngày thiệt vui.
Cảm ơn bác vì những chia sẻ rất bổ ích. Để em tìm hiểu thêm về mảng vì em chỉ mới bắt đầu tìm hiểu sâu về excel thôi ạ.
 
Muốn đếm cái nào trước là tùy nơi mình.
  • Muốn Dòng trước thì đưa nó lên ưu tiên hơn Cột
  • Muốn Cột trước thì đưa nó lên ưu tiên hơn Hàng
Tất cả do mình điều khiển nó!

Thời gian đầu tiếp xúc với 'Mảng' thì "Nó' điều khiển mình, vì lúc đó nó như con ngựa chứng vậy, dần dà khi bạn đã biết các 'tính khí' của nó rồi, tức ngựa đã thuần phục, thì bạn sẽ điều khiển lại nó, sớm hay muộn là do tài năng và sự đầu tư của bạn.

Chúc bạn ngày vui.
Thấy bài này kéo dài ghê... Em thì nghĩ bài thực tế không tới mức xài mảng "khủng long" như thế này, đó chỉ là "ý tưởng" bất chợt đến như "cơn mưa cuối hè..." ;)
Ở chỗ em vừa có cơn mưa rào anh ạ. Híc.

Chúc anh ngày vui!
 
Thấy bài này kéo dài ghê... Em thì nghĩ bài thực tế không tới mức xài mảng "khủng long" như thế này, đó chỉ là "ý tưởng" bất chợt đến như "cơn mưa cuối hè..." ;)
Ở chỗ em vừa có cơn mưa rào anh ạ. Híc.

Chúc anh ngày vui!
Đúng như em nói! bài lẽ ra cũng đã xong theo yêu cầu.

Tuy nhiên, như em biết, 'Công thức Mảng' như một thứ gây nghiện khi mình cố tình thử và dấn sâu vào nó, càng 'dấn thân' càng lạ lùng vì những cái nó tạo ra nên càng 'cuốn hút' thành ra 'nghiện'. Cái chính qua bài này anh cũng muốn tỏ đến anh em đang trên đường nghiên cứu 'Mảng' phải phân biệt được:
  • 'Vùng' là gì?
  • 'Mảng' là gì?
  • Sự giống và khác nhau của 'Mảng' và 'Vùng'.
  • Các bài toán cơ bản 'tác động' cấu thành từ những tổ hợp 'Mảng'
Giống như em vậy, 'nghiện' VBA nên chuyên tâm nghiên cứu và hiện nay có một loạt bài về 'VBA' gửi lên diễn đàn mà anh rất hoan nghênh, vui mừng, thầm phục và ngưỡng mộ em lắm lắm.

Cảm ơn em nhiều.

Chúc em thành công và hỗ trợ thêm cho anh em GPE.
/-*+//-*+//-*+/
 

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

Back
Top Bottom