Nối hai cột trong excel thành một cột liên tiếp nhau (1 người xem)

Liên hệ QC

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

trungcad

Thành viên mới
Tham gia
23/11/11
Bài viết
19
Được thích
0
Tình hình là em có một câu hỏi thế này mong các cao thủ giải đáp!

Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau.
Ví dụ : cột A có 3 hàng 1,2,3
Cột B có 3 hàng 4,5,6
Giờ ghép cột B về A thành 1 cột có 6 hàng 1,2,3,4,5,6

Mong các cao thủ giúp em! Em không muốn dùng copy paste vì mất thời gian và có thể nhầm lẫn! Cảm ơn các cao thủ!
 
Tình hình là em có một câu hỏi thế này mong các cao thủ giải đáp!
Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau.
Ví dụ : cột A có 3 hàng 1,2,3
Cột B có 3 hàng 4,5,6
Giờ ghép cột B về A thành 1 cột có 6 hàng 1,2,3,4,5,6
Mong các cao thủ giúp em! Em không muốn dùng copy paste vì mất thời gian và có thể nhầm lẫn! Cảm ơn các cao thủ!
Nếu dữ liệu không nhiều thì có thể dùng toán tử nối (&), kết hợp các hàm INDIRECT, AND, CONCATENATE, ...
Bạn up file và cho vài ví dụ thử xem.
 
Tình hình là em có một câu hỏi thế này mong các cao thủ giải đáp!

Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau.
Ví dụ : cột A có 3 hàng 1,2,3
Cột B có 3 hàng 4,5,6
Giờ ghép cột B về A thành 1 cột có 6 hàng 1,2,3,4,5,6

Mong các cao thủ giúp em! Em không muốn dùng copy paste vì mất thời gian và có thể nhầm lẫn! Cảm ơn các cao thủ!
Bạn xem File đã đúng ý chưa, bạn nhớ Enable Macros trước khi mở File nhé!
Nhấn nút "GHÉP CỘT", xem kết quả.
P/S: Nếu chưa biết Ennab macros thì gọi cho tôi, tôi hướng dẫn cho.
ĐT: 0996.202.66(Thành)
 

File đính kèm

Lần chỉnh sửa cuối:
Tình hình là em có một câu hỏi thế này mong các cao thủ giải đáp!

Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau.
Ví dụ : cột A có 3 hàng 1,2,3
Cột B có 3 hàng 4,5,6
Giờ ghép cột B về A thành 1 cột có 6 hàng 1,2,3,4,5,6
Giả sử vùng dữ liệu cần nối của là A1:B3 (3 dòng). Công thức tại C1:
=INDEX($A$1:$B$3,MOD(ROWS($C$1:C1)-1,3)+1,INT((ROWS($C$1:C1)-1)/3)+1)
Bạn có bao nhiêu cột và dòng thì thay đổi chỗ màu đỏ cho phù hợp.
Thân.
 
Tình hình là em có một câu hỏi thế này mong các cao thủ giải đáp!

Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau.
Ví dụ : cột A có 3 hàng 1,2,3
Cột B có 3 hàng 4,5,6
Giờ ghép cột B về A thành 1 cột có 6 hàng 1,2,3,4,5,6

Mong các cao thủ giúp em! Em không muốn dùng copy paste vì mất thời gian và có thể nhầm lẫn! Cảm ơn các cao thủ!
bạn xem như vậy có đúng ko?
 

File đính kèm

Tình hình là em có một câu hỏi thế này mong các cao thủ giải đáp!

Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau.
Ví dụ : cột A có 3 hàng 1,2,3
Cột B có 3 hàng 4,5,6
Giờ ghép cột B về A thành 1 cột có 6 hàng 1,2,3,4,5,6

Mong các cao thủ giúp em! Em không muốn dùng copy paste vì mất thời gian và có thể nhầm lẫn! Cảm ơn các cao thủ!
Theo mình hiểu thì số liệu của bạn đang thế này
1.JPG
Được nối lại thành thế này
2.JPG
Không biết phải do mình hiểu sai không?
 
Theo mình hiểu thì số liệu của bạn đang thế này
View attachment 121537
Được nối lại thành thế này
View attachment 121538
Không biết phải do mình hiểu sai không?
Nếu đúng dữ liệu như vậy thì công thức tại A4:
Mã:
=OFFSET($B$1,MOD(ROW(A3),3),INT(ROW(A3)/3)-1)
Dữ liệu 300 cột, 600 dòng, vậy nối kiểu gì? 3 dòng đầu nối theo từng cột trả về cột nào? đến khi nào thì dừng? Nên đưa dữ liệu lên (nén file lại và upload lên).
 

File đính kèm

File đính kèm

Nếu dữ liệu bài #26 là dữ liệu thật: 256 cột x 641 dòng = 164096 ô giá trị.
Nếu sử dụng công thức tại A642:
Mã:
=OFFSET($B$1,MOD(ROW()-1,641),INT((ROW()-1)/641)-1)
Kéo xuống đến A164096 (sử dụng Excel 2007 trở lên).
 
Tình hình là em có một câu hỏi thế này mong các cao thủ giải đáp!

Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau.
Ví dụ : cột A có 3 hàng 1,2,3
Cột B có 3 hàng 4,5,6
Giờ ghép cột B về A thành 1 cột có 6 hàng 1,2,3,4,5,6

Mong các cao thủ giúp em! Em không muốn dùng copy paste vì mất thời gian và có thể nhầm lẫn! Cảm ơn các cao thủ!

Nếu theo bạn miêu tả thì:

Bạn không thể dùng excel 2003 vì excel 2003 chỉ có 65536 --> không đủ số dòng trên 1 cột để chứa dữ liệu của bạn (300*600=180000 dòng) --> bạn phải dùng excel 2007 trở lên.

Mình chỉnh lại chút file của bạn chuot0106 và đổi sang excel 2010 (file đính kèm).

Cách dùng:
1. Đặt con trỏ vào cột bạn muốn đặt kết quả (VD: ô A1).
2. Nhấn nút "GHÉP CỘT"
3. Bôi đen các cột cần nối (VD: A1:IV641) --> nhấn nút ok.

@Chuot0106, Xin lỗi đã sửa file của bạn. Nhưng với dữ liệu nhiều như vậy thì nên dùng mảng sẽ nhanh hơn.
Mà hình như kết quả cũng chưa chính xác thì phải %#^#$ (hay bạn đang hiểu sai ý tác giả ?).
 

File đính kèm

Lần chỉnh sửa cuối:
Nếu dữ liệu bài #26 là dữ liệu thật: 256 cột x 641 dòng = 164096 ô giá trị.
Nếu sử dụng công thức tại A642:
Mã:
=OFFSET($B$1,MOD(ROW()-1,641),INT((ROW()-1)/641)-1)
Kéo xuống đến A164096 (sử dụng Excel 2007 trở lên).
Bác ơi ct này đúng chưa ah em làm mà không được.Row() trong ngoặc là ở 642 ah
 
Nếu theo bạn miêu tả thì:

Bạn không thể dùng excel 2003 vì excel 2003 chỉ có 65536 --> không đủ số dòng trên 1 cột để chứa dữ liệu của bạn (300*600=180000 dòng) --> bạn phải dùng excel 2007 trở lên.

Mình chỉnh lại chút file của bạn chuot0106 và đổi sang excel 2010 (file đính kèm).

Cách dùng:
1. Đặt con trỏ vào cột bạn muốn đặt kết quả (VD: ô A1).
2. Nhấn nút "GHÉP CỘT"
3. Bôi đen các cột cần nối (VD: A1:IV641) --> nhấn nút ok.

@Chuot0106, Xin lỗi đã sửa file của bạn. Nhưng với dữ liệu nhiều như vậy thì nên dùng mảng sẽ nhanh hơn.
Mà hình như kết quả cũng chưa chính xác thì phải %#^#$ (hay bạn đang hiểu sai ý tác giả ?).
Em thấy kết quả là chưa chính xác ví dụ : - file bác upload chỉ nối được hai cột cạnh nhau,nối xong không xoá cột vừa nối.Cái cơ bản là em muốn nó nối luôn tất cả các cột về cột A.Cảm ơn các bác!
 
Bác ơi ct này đúng chưa ah em làm mà không được.Row() trong ngoặc là ở 642 ah
Bạn thử công thức chưa?
Hoặc thử code sau:
Mã:
Sub Button1_Click()
Dim MyArr(), RsArr(), iC As Long, iR As Long, kR As Long
MyArr = Sheet1.Range("A1:IV641").Value2
ReDim RsArr(1 To UBound(MyArr) * UBound(MyArr, 2), 1 To 1)
For iC = LBound(MyArr, 2) To UBound(MyArr, 2)
    For iR = LBound(MyArr) To UBound(MyArr)
        kR = kR + 1
        RsArr(kR, 1) = MyArr(iR, iC)
    Next iR
Next iC
Sheet1.Range("A1:IV641").ClearContents
Sheet1.Range("A1").Resize(UBound(MyArr) * UBound(MyArr, 2)) = RsArr
End Sub
Tôi so sánh kết quả công thức và code đều đúng.
Row() tại ô nào thì có số dòng của ô đó.
 
Bạn thử công thức chưa?
Hoặc thử code sau:
Mã:
Sub Button1_Click()
Dim MyArr(), RsArr(), iC As Long, iR As Long, kR As Long
MyArr = Sheet1.Range("A1:IV641").Value2
ReDim RsArr(1 To UBound(MyArr) * UBound(MyArr, 2), 1 To 1)
For iC = LBound(MyArr, 2) To UBound(MyArr, 2)
    For iR = LBound(MyArr) To UBound(MyArr)
        kR = kR + 1
        RsArr(kR, 1) = MyArr(iR, iC)
    Next iR
Next iC
Sheet1.Range("A1:IV641").ClearContents
Sheet1.Range("A1").Resize(UBound(MyArr) * UBound(MyArr, 2)) = RsArr
End Sub
Tôi so sánh kết quả công thức và code đều đúng.
Row() tại ô nào thì có số dòng của ô đó.
Em không biết chạy macro,làm cho em trên bài 26 được không ạ
 
Em không biết chạy macro,làm cho em trên bài 26 được không ạ
Công thức có sẵn ở ô A641 rồi, tôi chưa kéo xuống vì nó làm nặng file gấp đôi, không upload được. Bạn chỉ cần kéo công thức xuống đến dòng 164096 là được.
File nặng quá không tải lên được nên tôi xóa bớt cột, bạn test thử.
 

File đính kèm

Em thấy kết quả là chưa chính xác ví dụ : - file bác upload chỉ nối được hai cột cạnh nhau,nối xong không xoá cột vừa nối.Cái cơ bản là em muốn nó nối luôn tất cả các cột về cột A.Cảm ơn các bác!

Chẳng hiểu bạn test kiểu gì nữa. Mình nghĩ, có thể bạn đã download nhầm file rồi. File ở bài #31 í. Bạn muốn nối bao nhiêu cột tùy ý (nhưng phải bôi đen các cột đó). Nối xong là xóa luôn vùng dữ liệu cũ và gán kết quả vào cột mà bạn muốn đặt kết quả. (Chỉ cần bạn làm đúng như hướng dẫn là đc).
 
Đã test giúp bạn rồi. Nếu dữ liệu y hệt như vậy thì đúng, nhưng nếu các cột có dữ liệu dài ngắn hay nhiều ít khác nhau thì có khoảng trống trong kết quả gộp.
Cảm ơn bạn! Mình làm theo File thật của tác giả thôi. Sai thì tác giả tự chịu vì File mà mình làm chính là File thật của tác giả. Các cột mình thấy có cùng cấu trúc.
 

File đính kèm

Tình hình là em có một câu hỏi thế này mong các cao thủ giải đáp!

Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau.
Ví dụ : cột A có 3 hàng 1,2,3
Cột B có 3 hàng 4,5,6
Giờ ghép cột B về A thành 1 cột có 6 hàng 1,2,3,4,5,6

Mong các cao thủ giúp em! Em không muốn dùng copy paste vì mất thời gian và có thể nhầm lẫn! Cảm ơn các cao thủ!

Bạn dùng code sau
Mã:
Sub noi()
Dim a(), cell As Range
ReDim a(1 To Selection.Count, 1 To 1)
For Each cell In Selection
    If cell <> "" Then
        j = j + 1
        a(j, 1) = cell
    End If
Next
    Sheets.Add after:=Sheets(Sheets.Count)
    [A1].Resize(j, 1) = a
End Sub

Chọn các cột cần nối (hoặc 1 vùng chọn bất kỳ)
 
Bạn dùng code sau
Mã:
Sub noi()
Dim a(), cell As Range
ReDim a(1 To Selection.Count, 1 To 1)
For Each cell In Selection
    If cell <> "" Then
        j = j + 1
        a(j, 1) = cell
    End If
Next
    Sheets.Add after:=Sheets(Sheets.Count)
    [A1].Resize(j, 1) = a
End Sub

Chọn các cột cần nối (hoặc 1 vùng chọn bất kỳ)
Chắc bạn hiểu nhầm ý tác giả rồi, tác giả muốn ghép các cột lại với nhau cơ. Code này của bác nó lại ghép các dòng lại với nhau !
 
Tôi dùng office 2003, tôi test thử với dữ liệu ít hơn dữ liệu thật 1 chút thì đúng nhưng Test với toàn bộ dữ liệu thật nó không xóa các cột từ B1:IV641. Tôi nghĩ trong Excel 2003 nó giới hạn số dòng nên dữ liệu ở đây sau khi gộp chắc là nó vượt quá 65536 dòng nên code chạy sai. Không biết tôi nghĩ vậy có đúng không?
Ở office 2003 bạn xóa đi 1 số dòng nhưng code của bạn vẫn chạy sai là ở chỗ này
PHP:
rng.Offset(0, 1).Resize(j, m).ClearContents
Dữ liệu của bạn đang có 256 cột (số cột tối đa), nên m = 256
Đang ở cột A, bạn Offset(0, 1) di chuyển sang cột B. nên bạn không thể Resize(j, m=256) mở rộng dữ liệu ra 256 cột được nữa.
Nếu bạn sửa thành
PHP:
rng(1,1).Offset(0, 1).Resize(j, m-1).ClearContents
hoặc
PHP:
rng(1,2).Resize(j, m-1).ClearContents

Sẽ không bị lỗi, mình nghĩ vậy.
 
Lần chỉnh sửa cuối:
Tôi đâu có nói là sau khi xóa đi 1 số dòng code của tôi chạy vẫn sai đâu?
......
Bạn không đọc kĩ lại đi phát biểu như vậy.

Bạn chạy file của bạn ở bài #44 mà nó không xóa vùng B1:IV641 sau khi chạy xong, tôi thấy bạn sai ở dòng
PHP:
rng.Offset(0, 1).Resize(j, m).ClearContents
mà bạn không phát hiện ra nên tôi cũng chỉ muốn góp ý cho bạn hoàn thiện hơn thôi.
Vùng rng của bạn hiện đang có 256 cột và 641 dòng
nên bạn dùng rng.Offset(0, 1) để di chuyển vùng rng sang bên phải 1 cột là không được. Bởi vì hiện giờ bạn đã dùng hết 256 cột của office 2003.
Bạn lỗi ở đây là do thiếu cột chứ không phải thiếu dòng.
Tôi test file của bạn ở bài #44 sau khi sửa lại dòng code trên như ở bài #55 trên office 2003 thì vùng B1:IV641 được xóa bình thường
 
Bạn Test thử lại xem chỗ màu đen trong phát biểu của bạn xem nó ghép cột có đúng không nhé.
Tôi tính thử có 256 cột và 641 dòng, làm phép nhân đơn giản:
641 X 256 =164.096
Trong khi Excel 2003 chỉ có 65.536 dòng vậy mà bạn dám bảo là KHÔNG THIẾU DÒNG.
Trời ạ. Tôi chỉ nói code của bạn không xóa vùng B1:IV641 được là do thiếu cột chứ không phải thiếu dòng.
Do bạn nói:
Tôi dùng office 2003, tôi test thử với dữ liệu ít hơn dữ liệu thật 1 chút thì đúng nhưng Test với toàn bộ dữ liệu thật nó không xóa các cột từ B1:IV641. Tôi nghĩ trong Excel 2003 nó giới hạn số dòng nên dữ liệu ở đây sau khi gộp chắc là nó vượt quá 65536 dòng nên code chạy sai. Không biết tôi nghĩ vậy có đúng không?

Bạn chỉ cần chọn lại vùng để xóa không vượt qua khỏi cột IV (cột 256) là vần chạy bình thường.
Còn trong excel 2003 thì file này đương nhiên là thiếu dòng rồi. Nhưng code của bạn vẫn chạy đến 65k dòng là ngưng do bạn có dòng
PHP:
On Error Resume Next
 
Lần chỉnh sửa cuối:
Thực ra là chúng ta tranh luận để hiểu vấn đề thấu đáo hơn thôi, có gì tôi gay gắt quá thì bỏ qua cho tôi nhé!
Ok. Miễn là tôn trọng nhau là được, cùng học hỏi thôi mà. Tôi cũng đã học được 1 số cái ở bạn.
Bạn thử chạy đoạn code sau của bạn (tôi chỉ 1 dòng thôi nhé) ở excel 2003. tôi thấy nó xóa vùng B1:IV641 bình thường. Còn những chỗ khác tôi không có ý kiến.
PHP:
Public Sub ghep_cot()
Dim rng As Range, i As Long, j As Long, k As Double, m As Long
Application.EnableEvents = False
On Error Resume Next
Set rng = Application.InputBox("Chon vung can ghep cot:", "THONG BAO", Type:=8)
j = rng.Rows.Count
m = rng.Columns.Count
k = j
For i = 2 To m
rng(k, 1).Offset(1).Resize(j) = rng(1, i).Resize(j).Value
k = k + j
Next i
Application.EnableEvents = True
rng(1, 2).Resize(j, m - 1).ClearContents
End Sub
 
Ý em là em chưa ghép được cột trên excel 2007 vì file bác viết gửi em chỉ giới hạn ghép trong 2003 thôi,nhiều hơn số đấy là ko chính xác!
Topic này chưa giải quyết xong vấn đề nữa, bạn làm từng bước để khắc phục nhé!
1- Bạn download file của chuot0106 ở bài #44 và giải nén sẽ được file chuot0106_ghepcot.xls
2- Dùng Excel 2010 mở file chuot0106_ghepcot.xls
3- Bấm File->Save as->Save as type: chọn Excel Macro-Enabled Workbook->Bấm Save và Đóng File (sẽ có file chuot0106_ghepcot.xlsm)
4- Mở File dữ liệu thật của bạn lên, copy tất cả dữ liệu thật của bạn
5- Mở file chuot0106_ghepcot.xlsm sau đó Paste vào Sheet1, sau đó Click vào Ghép cột

Hoặc bạn copy dữ liệu của bạn vào đây (Sheet1)

P/s: Dữ liệu của bạn nhiều, bạn nên sử dụng code của Mr.Bum ở bài #36 (sẽ nhanh hơn so sử dụng mảng)
 

File đính kèm

Nếu đúng dữ liệu như vậy thì công thức tại A4:
Mã:
=OFFSET($B$1,MOD(ROW(A3),3),INT(ROW(A3)/3)-1)
Dữ liệu 300 cột, 600 dòng, vậy nối kiểu gì? 3 dòng đầu nối theo từng cột trả về cột nào? đến khi nào thì dừng? Nên đưa dữ liệu lên (nén file lại và upload lên).
Em mới học excel nên còn gà quá,công thức của bác Mr.Bum đúng rồi nhưng có cao thủ nào cắt nghĩa cho em hiểu cái công thức này được không ạ? cảm ơn mọi người!
 
Mình đã thử với dữ liệu demo thấy okei, nhưng chưa xoá tự động như trungcad comments. Hơn nữa, nếu file của mình gồm 12 cột, 31 dòng, nhưng số liệu có thể xuất hiện đủ 31 dòng, hoặc ít hơn, thì chương trình bị lỗi.
 
Tôi dùng office 2003, tôi test thử với dữ liệu ít hơn dữ liệu thật 1 chút thì đúng nhưng Test với toàn bộ dữ liệu thật nó không xóa các cột từ B1:IV641. Tôi nghĩ trong Excel 2003 nó giới hạn số dòng nên dữ liệu ở đây sau khi gộp chắc là nó vượt quá 65536 dòng nên code chạy sai. Không biết tôi nghĩ vậy có đúng không?

Bạn muốn biết có xóa hay không thì bạn bỏ câu OnError resume next, và chỉ thử với 200 dòng. 200 x 256 = 51200 dòng thôi. Và đừng liên tục hối người khác test code của mình.

Đọc câu này là biết không xóa rồi:

rng.Offset(0, 1).Resize(j, m).ClearContents

Tôi Test thử rồi mà, nó đã xóa vùng B1:IV641 . Thực ra thì lỗi này tôi đã phát hiện ra nhưng do tôi đã khuyến cáo chủ topic và các bạn chuyển sang đuôi XLSM nên ngại không sửa lại code nữa.

Vấn đề là biết sai chỗ nào và sẵn sàng sửa sai, dù sửa 100 lần cũng phải sửa. Ngại thì tiến bộ thế nào được?

Tôi sẽ xóa những bài hối thúc và những bài không có ý nghĩa.
 
Lần chỉnh sửa cuối:
Topic này chưa giải quyết xong vấn đề nữa, bạn làm từng bước để khắc phục nhé!
1- Bạn download file của chuot0106 ở bài #44 và giải nén sẽ được file chuot0106_ghepcot.xls
2- Dùng Excel 2010 mở file chuot0106_ghepcot.xls
3- Bấm File->Save as->Save as type: chọn Excel Macro-Enabled Workbook->Bấm Save và Đóng File (sẽ có file chuot0106_ghepcot.xlsm)
4- Mở File dữ liệu thật của bạn lên, copy tất cả dữ liệu thật của bạn
5- Mở file chuot0106_ghepcot.xlsm sau đó Paste vào Sheet1, sau đó Click vào Ghép cột

Hoặc bạn copy dữ liệu của bạn vào đây (Sheet1)

P/s: Dữ liệu của bạn nhiều, bạn nên sử dụng code của Mr.Bum ở bài #36 (sẽ nhanh hơn so sử dụng mảng)

Mình thấy file này rất hợp với cái mình đang cần. Nhưng bạn có thể sửa code lại 1 tí để ghép cột lại thì không có ô trống được không nhỉ. Nếu được thì cảm ơn bạn nhiều lắm :heart:
 

File đính kèm

Mình thấy file này rất hợp với cái mình đang cần. Nhưng bạn có thể sửa code lại 1 tí để ghép cột lại thì không có ô trống được không nhỉ. Nếu được thì cảm ơn bạn nhiều lắm :heart:
Bạn đọc lại topic này và tải File của bạn minhhung1205 nhé. File mình viết chưa tổng quát lắm.
 
Mã:
=offset($b$1,mod(row(a3),3),int(row(a3)/3)-1)

nếu đúng dữ liệu như vậy thì công thức tại a4:
Mã:
=offset($b$1,mod(row(a3),3),int(row(a3)/3)-1)
dữ liệu 300 cột, 600 dòng, vậy nối kiểu gì? 3 dòng đầu nối theo từng cột trả về cột nào? đến khi nào thì dừng? Nên đưa dữ liệu lên (nén file lại và upload lên).




nếu không phải chỉ có 2 cột mà 100 cột thì nối như thế nào bạn, chỉ mình với, hic
 
trungcad
Em có một cái bảng có khoảng trên 300 cột và có trên 600 hàng . Bây giờ em có một câu hỏi là em muốn ghép tất cả các cột này lại thành 1 cột mà liên tiếp nhau, Ví dụ : cột A

Theo yêu cầu, tôi làm đến 400 cột luôn.

Do Excel 2003 không đủ số lượng cột và dòng khi ghép dữ liệu, nên tôi sử dụng Excel 2010 tốc độ thì hơi chậm (tôi chưa tìm ra nguyên nhân), nhưng có dùng còn hơn là không.
 

File đính kèm

Theo yêu cầu, tôi làm đến 400 cột luôn.

Do Excel 2003 không đủ số lượng cột và dòng khi ghép dữ liệu, nên tôi sử dụng Excel 2010 tốc độ thì hơi chậm (tôi chưa tìm ra nguyên nhân), nhưng có dùng còn hơn là không.
Với dữ liệu của bác, tôi test bằng code này thì thời gian rất nhanh(mặc dù code này chưa dùng mảng)
Mã:
Public Sub ghep_cot()
Dim rng As Range, i As Long, j As Long, k As Double, m As Long
    Application.EnableEvents = False
Set rng = Application.InputBox _
("Chon vung can ghep cot:", "THONG BAO", Type:=8)
    j = rng.Rows.Count
    m = rng.Columns.Count
    k = j
For i = 2 To m
    rng(k, 1).Offset(1).Resize(j) = rng(1, i).Resize(j).Value
    k = k + j
Next i
    Application.EnableEvents = True
    rng.Offset(0, 1).Resize(j, m - 1).ClearContents
End Sub
 
Với dữ liệu của bác, tôi test bằng code này thì thời gian rất nhanh(mặc dù code này chưa dùng mảng)
Mã:
Public Sub ghep_cot()
Dim rng As Range, i As Long, j As Long, k As Double, m As Long
    Application.EnableEvents = False
Set rng = Application.InputBox _
("Chon vung can ghep cot:", "THONG BAO", Type:=8)
    j = rng.Rows.Count
    m = rng.Columns.Count
    k = j
For i = 2 To m
    rng(k, 1).Offset(1).Resize(j) = rng(1, i).Resize(j).Value
    k = k + j
Next i
    Application.EnableEvents = True
    rng.Offset(0, 1).Resize(j, m - 1).ClearContents
End Sub
Bài của bạn nếu các cột có số lượng dữ liệu không đồng nhất thì chưa ổn lắm, sẽ tồn tại dòng trống

Bài #37 nếu thêm dòng
Mã:
'Đầu sub
Application.ScreenUpdating = False


'Cuối sub
Application.ScreenUpdating = true
Thì sẽ nhanh hơn được 1 chút.
 
Bài của bạn nếu các cột có số lượng dữ liệu không đồng nhất thì chưa ổn lắm, sẽ tồn tại dòng trống

Bài #37 nếu thêm dòng
Mã:
'Đầu sub
Application.ScreenUpdating = False


'Cuối sub
Application.ScreenUpdating = true
Thì sẽ nhanh hơn được 1 chút.
Anh Ninh có thể giúp em giải thích tại sao code của chú be09 lại chậm như vậy nhỉ. Theo em thì cách thức hoạt động của cả 2 code(của em và chú be09) đều như nhau mà.
 
Anh Ninh có thể giúp em giải thích tại sao code của chú be09 lại chậm như vậy nhỉ. Theo em thì cách thức hoạt động của cả 2 code(của em và chú be09) đều như nhau mà.
Bạn để ý 2 phương thức thực hiện của 2 bài #37 và #38 là hoàn toàn khác nhau
Với #37: đó là cách Copy Paste
#38: đó là gán giá trị

Sự khác nhau của cách thực hiện đó dẫn tới sự chênh lệch về tốc độ. Với những máy cấu hình yếu khi bạn dùng cách Copy Paste tốc độ sẽ giảm đáng kể, ngay cả thực hiện thao tác tay cũng thế, còn cách của bạn đơn thuần tương ứng với việc nhập dữ liệu nên tốc độ sẽ nhanh hơn.
 
Bạn để ý 2 phương thức thực hiện của 2 bài #37 và #38 là hoàn toàn khác nhau
Với #37: đó là cách Copy Paste
#38: đó là gán giá trị

Sự khác nhau của cách thực hiện đó dẫn tới sự chênh lệch về tốc độ. Với những máy cấu hình yếu khi bạn dùng cách Copy Paste tốc độ sẽ giảm đáng kể, ngay cả thực hiện thao tác tay cũng thế, còn cách của bạn đơn thuần tương ứng với việc nhập dữ liệu nên tốc độ sẽ nhanh hơn.
Em nghĩ đơn giản là:
+ Code của em cứ mỗi vòng lặp sẽ lấy được 1 cột và ghép vào cột đầu tiên.
+ Code của chú be09 cũng vậy mỗi lần copy được 1 cột lại dán vào cột đầu tiên.
Nên nghĩ cách thức hoạt động giống nhau, giờ thấy anh giải thích mới biết nó khác nhau ạ. Cảm ơn anh!
 
Em nghĩ đơn giản là:
+ Code của em cứ mỗi vòng lặp sẽ lấy được 1 cột và ghép vào cột đầu tiên.
+ Code của chú be09 cũng vậy mỗi lần copy được 1 cột lại dán vào cột đầu tiên.
Nên nghĩ cách thức hoạt động giống nhau, giờ thấy anh giải thích mới biết nó khác nhau ạ. Cảm ơn anh!
Thử dùng mãng và do loop, nhớ chọn vùng trước khi chạy code.(Mới thử có vài cột không biết đúng không có gì góp ý đùng nặng lời nhé!)
Sub Noi_Cot()
Dim arr(), arr1(), i, j, cot, hang, x, Rg As Range
Set Rg = Selection
arr = Rg
hang = UBound(arr, 1)
cot = UBound(arr, 2)
ReDim arr1(1 To hang * cot, 1 To 1)
i = 1: j = 1
Do

If arr(i, j) <> "" Then
x = x + 1
arr1(x, 1) = arr(i, j)
End If
If i = hang And j = cot Then Exit Do
i = i + 1
If i > hang Then
i = 1
j = j + 1
End If
Loop
Selection.Clear
If x Then Range("a1").Resize(x) = arr1
Set Rg = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Nếu dùng mảng thì mình viết thế này để ghép
PHP:
Sub ghepcot()
Dim arr(), Res(1 To 65536, 1 To 1),  k
arr = [B5].Resize(1000, 500).Value
For Each Item In arr
   If Item <> "" Then
      k = k + 1
      Res(k, 1) = Item
   End If
Next
[A5].Resize(k) = Res
End Sub
 
Theo yêu cầu, tôi làm đến 400 cột luôn.

Do Excel 2003 không đủ số lượng cột và dòng khi ghép dữ liệu, nên tôi sử dụng Excel 2010 tốc độ thì hơi chậm (tôi chưa tìm ra nguyên nhân), nhưng có dùng còn hơn là không.

chép code sau chạy xem như thế nào? xử lý trực tiếp lên sheet là rất chậm, cái này dữ liệu còn ít chứ nhiều một tí xử lý trên sheet là chỉ có đứng máy và đứng máy

Mã:
Sub GPE01(CotCuoi As Integer, DongCuoi As Long, Rng As Range, Arr, ByRef Stt As Long)
    Dim i As Long
    
        For i = 1 To DongCuoi - 4
            Arr(Stt, 1) = Rng(i, 1)
            Stt = Stt + 1
        Next
End Sub

Mã:
Sub GPE()
    Dim L_Col As Integer
    Dim L_Row As Long
    Dim Stt As Long
    Dim Arr(1 To 10480000, 1 To 1)
    Dim Rng As Range
         L_Col = Range("XFD4").End(xlToLeft).Column
         Stt = 1
         For i = 1 To L_Col
            L_Row = Cells(1048000, i).End(xlUp).Row
            
            Set Rng = Range(Cells(5, i), Cells(L_Row, i))
            Call GPE01(L_Col, L_Row, Rng, Arr, Stt)
        Next
         Sheet2.Range("A5").Resize(Stt, 1) = Arr
    
End Sub
 
Lần chỉnh sửa cuối:
chép code sau chạy xem như thế nào? xử lý trực tiếp lên sheet là rất chậm, cái này dữ liệu còn ít chứ nhiều một tí xử lý trên sheet là chỉ có đứng máy và đứng máy

Mã:
Sub GPE01(CotCuoi As Integer, DongCuoi As Long, Rng As Range, Arr, ByRef Stt As Long)
    Dim i As Long
    
        For i = 1 To DongCuoi - 4
            Arr(Stt, 1) = Rng(i, 1)
            Stt = Stt + 1
        Next
End Sub
Hình như tham số Cotcuoi của bạn thừa thì phải.
 
Thêm 1 cách nữa. Nếu cần chỉ việc thay chỗ B5 là được
PHP:
Sub ghepcot()
Dim arr(), Res(1 To 65536, 1 To 1), k, item
With ActiveSheet.UsedRange
   arr = [B5].Resize(.Rows.Count, .Columns.Count).Value
   For Each item In arr
      If item <> "" Then
         k = k + 1
         Res(k, 1) = item
      End If
   Next
   .Parent.[A5].Resize(k) = Res
End With
End Sub
 
Các anh chị cho em hỏi, giờ em có bài toán ngược: có một cột 1000 số mà em muốn xếp thành 100 cột, mỗi cột 10 số như file đính kèm thì làm thế nào? Cảm ơn !
 

File đính kèm

Các anh chị cho em hỏi, giờ em có bài toán ngược: có một cột 1000 số mà em muốn xếp thành 100 cột, mỗi cột 10 số như file đính kèm thì làm thế nào? Cảm ơn !
Góp ý cho bạn:
Yêu cầu của bạn là tách cột khác so với chủ đề của chủ Topic nối cột.
Bạn nên mở Topic trong Box Lập trình với Excel, tiêu đề có thể là "Giúp tách dữ liệu 1 cột ra nhiều cột".
Nội dung cần rõ ràng, cụ thể hơn thì sẽ nhận được kết quả sớm hơn.
 
Các anh chị cho em hỏi, giờ em có bài toán ngược: có một cột 1000 số mà em muốn xếp thành 100 cột, mỗi cột 10 số như file đính kèm thì làm thế nào? Cảm ơn !
Còn cái gì ngược ngược nữa không?
C1 =INDEX($A$1:$A$1000,ROWS($1:1)+COLUMNS($A:A)*10-10,1)
Copy xuống tới C1, copy C1:C10 qua phải tới cột thứ 100
 

File đính kèm

C1 =INDEX($A$1:$A$1000,ROWS($1:1)+COLUMNS($A:A)*10-10,1)
Copy xuống tới C1, copy C1:C10 qua phải tới cột thứ 100
Oh! Excellent! cảm ơn anh HieuCD! Cho em hỏi nếu muốn xếp thành 100 hàng, mỗi hàng 10 số thì làm thế nào ạ?
 
Lần chỉnh sửa cuối:
Nếu dữ liệu không nhiều thì có thể dùng toán tử nối (&), kết hợp các hàm INDIRECT, AND, CONCATENATE, ...
Bạn up file và cho vài ví dụ thử xem.
xin chào ạ, làm ơn hướng dẫn mình nối 30 cột thành một cột số liệu trong bảng sau với ạ, cảm ơn ạ.
 

File đính kèm

Giả sử vùng dữ liệu cần nối của là A1:B3 (3 dòng). Công thức tại C1:
=INDEX($A$1:$B$3,MOD(ROWS($C$1:C1)-1,3)+1,INT((ROWS($C$1:C1)-1)/3)+1)
Bạn có bao nhiêu cột và dòng thì thay đổi chỗ màu đỏ cho phù hợp.
Thân.
cám ơn bạn, đúng công thức mình đang cần.
 

File đính kèm

Lần chỉnh sửa cuối:
Nếu theo bạn miêu tả thì:

Bạn không thể dùng excel 2003 vì excel 2003 chỉ có 65536 --> không đủ số dòng trên 1 cột để chứa dữ liệu của bạn (300*600=180000 dòng) --> bạn phải dùng excel 2007 trở lên.

Mình chỉnh lại chút file của bạn chuot0106 và đổi sang excel 2010 (file đính kèm).

Cách dùng:
1. Đặt con trỏ vào cột bạn muốn đặt kết quả (VD: ô A1).
2. Nhấn nút "GHÉP CỘT"
3. Bôi đen các cột cần nối (VD: A1:IV641) --> nhấn nút ok.

@Chuot0106, Xin lỗi đã sửa file của bạn. Nhưng với dữ liệu nhiều như vậy thì nên dùng mảng sẽ nhanh hơn.
Mà hình như kết quả cũng chưa chính xác thì phải %#^#$ (hay bạn đang hiểu sai ý tác giả ?).

Chào bạn
Mình muốn đưa nội dung này vào hàm function thì làm sao nhỉ
cho nó tiện khi xr lý á

Nhờ vả giúp đỡ

Cảm ơn nhiều nhé
 
Cảm ơn bạn! Mình làm theo File thật của tác giả thôi. Sai thì tác giả tự chịu vì File mà mình làm chính là File thật của tác giả. Các cột mình thấy có cùng cấu trúc.
bác có thể chuyển code của bác thành dạng Funcition để viết với câu lệnh là "=ghep_cot('quét chọn khu vực cần ghép)" - Giá trị nó trả về ngay tại nơi gõ hàm đó được không ạ và thêm cái nữa là nó bỏ đi các giá trị rỗng.
Em cám ơn bác ạ !
 
Cho xin hỏi thêm về việc ghép các cột, vì mình đã sử dụng các code trong sub này nhưng lại không thể ghép khi các ô ghép là các ô có chứa Function (dù bằng thủ công như dùng table/From table hay New Query v...).
(xin xem file minh họa).
Mong các Anh Chị Em giúp đỡ
Xin cám ơn
 

File đính kèm

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

Back
Top Bottom