Nối hai cột trong excel thành một cột liên tiếp nhau

Liên hệ QC
Đã 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

  • chuot0106_ghepcot.rar
    940.2 KB · Đọc: 319
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

  • chuot0106_ghepcot.xlsm
    20.4 KB · Đọc: 86
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

  • ghep cot 2.xlsm
    19.8 KB · Đọc: 55
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

  • Gộp NHIỀU CỘT VÀO cột A.rar
    41.3 KB · Đọc: 133
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à.
 
Web KT
Back
Top Bottom