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

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

  • xếp lại thành cột số.xlsx
    16.5 KB · Đọc: 11
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

  • xếp lại thành cột số.xlsx
    20.4 KB · Đọc: 18
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

  • W_Thanh Son_1990-2019 - Copy.xls
    41 KB · Đọc: 15
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

  • W_Thanh Son_1990-2019 - Copy.xls
    196 KB · Đọc: 24
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 ạ !
 
Web KT
Back
Top Bottom