Gộp 2 danh sách lại thế nào ? (1 người xem)

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

duong_nam_dao

Thành viên chính thức
Tham gia
2/3/08
Bài viết
89
Được thích
44
Mình có 2 danh sách tên ở 2 cột B và C(danh sách có thể thay đổi). Dùng công thức nào để gộp 2 danh sách đó vào 1 cột theo thứ tự hết cột B rồi đến cột C. Chờ tin các bạn !
 

File đính kèm

bạn làm như sau: tại E4 gõ công thức: =B4&" "&C4, sau đó cứ tiếp tục cho những ô còn lại.
thân.
 
Mình có 2 danh sách tên ở 2 cột B và C(danh sách có thể thay đổi). Dùng công thức nào để gộp 2 danh sách đó vào 1 cột theo thứ tự hết cột B rồi đến cột C. Chờ tin các bạn !
Ô E3 gõ công thức:
=IF(ROW()>COUNTA(B:B)+2,INDEX(C:C,ROW()-COUNTA(B:B),1),INDEX(B:B,ROW(),1))
Sau đó copy down công thức xuống dưới nhé!
Bạn xem thêm file đính kèm!

To whitemouse: Bạn xem kỹ lại câu hỏi xem. Không đơn giản vậy đâu!
 

File đính kèm

Tôi đã viết Macro trong file đính kèm. Hãy nhập địa chỉ vùng cần gộp vô ô tiếp nhận kết quả gộp và đặt lại ô hoạt động về ô đó và thực hiện Macro.
Sub Macro1()
dc = ActiveCell
Set xx = Range(dc)
For Each xxi In xx
If xxi <> "" Then
ActiveCell = xxi
ActiveCell.Offset(1, 0).Range("A1").Select
End If
Next
End Sub

CT sẽ lấy địa chỉ vùng cần gộp và chuyển vào ô hoạt động và các ô ở dưới, bỏ qua các ô
gốc rỗng.
 

File đính kèm

Theo mình, mình chưa hiểu ứng dụng của việc này để làm gì! Tuy nhiên, nếu 3,4 cột hoặc hơn thì ta dùng VBA cho gọn.
Mình cũng chưa rõ ứng dụng của tác giả topic. Còn thực tế thì mình thỉnh thoảng phải xử lý dữ liệu của người khác làm để lại do họ để hơi lộn xộn ở nhiều cột... sau khi gộp vào một cột chắc sau đó dùng để làm đầu vào cho các hàm như VLOOKUP() ... Trong trường hợp đó mình cứ bôi đen rồi copy dần thôi
 
Tôi đã viết Macro trong file đính kèm. Hãy nhập địa chỉ vùng cần gộp vô ô tiếp nhận kết quả gộp và đặt lại ô hoạt động về ô đó và thực hiện Macro.
Sub Macro1()
dc = ActiveCell
Set xx = Range(dc)
For Each xxi In xx
If xxi <> "" Then
ActiveCell = xxi
ActiveCell.Offset(1, 0).Range("A1").Select
End If
Next
End Sub

CT sẽ lấy địa chỉ vùng cần gộp và chuyển vào ô hoạt động và các ô ở dưới, bỏ qua các ô
gốc rỗng.
For Each xxi In xx là quét toàn bộ danh sách, như vậy rất dở! Theo tôi thì sẽ quét theo cột. Cụ thể file này chỉ quét có 2 lần, mổi lần copy 1 cột, paste vào cell dưới cell cuối có dử liệu của vùng đích
Ví dụ:
PHP:
 With Range("B3").CurrentRegion
   For i = 1 To .Columns.Count
     Range(.Cells(1, i), .Cells(1, i).End(xlDown)).Copy _
     Destination:=[E65536].End(xlUp).Offset(1)
   Next
 End With
Bảo đảm cực nhanh! Các bạn có thể thử với dử liệu lớn hơn để kiểm tra
----------------------------------------
Vì trong code có dùng End(xlDown), ngầm hiểu dử liệu trong từng cột không có dòng rổng!
Nếu thật sự dử liệu của các bạn có dòng rổng ở đâu đó thì để chắc ăn hơn ta dùng code này:
PHP:
Sub CopyMultiCol()
 Dim i As Long
 Range([E3], [E3].End(xlDown)).Clear
 With Range("B3").CurrentRegion
   For i = 1 To .Columns.Count
     Range(.Cells(1, i), .Cells(65536 - .Row, i).End(xlUp)).SpecialCells(2, 23).Copy _
     Destination:=[E65536].End(xlUp).Offset(1)
   Next
 End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Các bác cho hỏi: Tôi cũng có 2 danh sách ở 2 sheet, mỗi danh sách gồm 2 cột, cột đầu là tên và cột thứ 2 là giá trị (ký tự). Để cho dễ, giả sử danh sách sheet2 cột giá trị chưa có gì mà chỉ có cột tên, sheet1 thì có cả tên và giá trị. Vậy tôi muốn gộp 2 danh sách từ sheet 1 sang sheet2 lại với nhau sao cho các dòng có cùng tên gộp lại thành 1 (kèm theo cả giá trị của cột đó; các dòng không trùng tên thì được chèn thêm vào bên dưới(cùng cả giá trị tương ứng).

Các bác chỉ giúp hộ trường hợp này.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Các bác chỉ giúp hộ trường hợp này.
Tôi nghĩ nếu làm bằng tay, tôi sẽ:
- Copy cột tên của sheet 1 (DS1) nối vào cột tên của sheet 2 (DS2)
- Dùng Advanced Filter để lọc ra 1 DS tên duy nhất (tạm gọi là DS3)
- Dùng hàm VLOOKUP để lấy giá trị
Làm chắc không có vấn đề, tuy nhiên bạn nên đưa file giã lập lên cho dể hình dung nhé
 
Sheet1 và sheet2 gộp lại thành sheet 3. Số thứ tự của sheet3 không quan trọng phải đúng thứ tự. Các bác xem hộ.
 

File đính kèm

Sheet1 và sheet2 gộp lại thành sheet 3. Số thứ tự của sheet3 không quan trọng phải đúng thứ tự. Các bác xem hộ.
Chào bạn!
Cái này dùng Advanced Filter cũng không khó lắm, tuy nhiên dử liệu ở các sheet phải đồng nhất về cấu trúc (tôi đã sửa lại cho tất cả bắt đầu từ dòng thứ 6)
Bạn xem file nha:
PHP:
Sub TongHop()
  Dim Sh As Worksheet
  Application.ScreenUpdating = False
  Sheets("TongHop").[A6].CurrentRegion.Offset(1).ClearContents
  For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> "TongHop" Then
      With Sh.[A6].CurrentRegion.Offset(1)
        .Copy: Sheets("TongHop").[B65536].End(xlUp).Offset(1, -1).PasteSpecial 3
      End With
    End If
  Next
  With Sheets("TongHop").[A6].CurrentRegion
    .Offset(, 1).Resize(, 1).AdvancedFilter 1, , , 1
    .SpecialCells(12).Copy Destination:=Sheets("TongHop").[AA6]
    Sheets("TongHop").ShowAllData
    .ClearContents
    .Value = Sheets("TongHop").[AA6].CurrentRegion.Value
    Sheets("TongHop").[AA6].CurrentRegion.Clear
    .SpecialCells(2, 16).ClearContents
    .Cells(1, 1).Select
 End With
 Application.ScreenUpdating = True
End Sub
Tôi nghĩ còn có thể tối ưu hóa code thêm nữa đấy!
Chú ý: Nếu sửa tên sheet TongHop này thành tên khác thì phải sửa luôn trong code nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Code trên còn "củ chuối" quá... xin sửa lại tí:
PHP:
Sub TongHop()
  Dim Sh As Worksheet
  Application.ScreenUpdating = False
  With Sheets("TongHop").[A6].CurrentRegion
    .Offset(1).ClearContents
    .Resize(1).Copy Destination:=Sheets("TongHop").[AA6]
  End With
  For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> "TongHop" Then
      Sh.[A6].CurrentRegion.Offset(1).Copy
      With Sheets("TongHop").[AA6].CurrentRegion
        .Offset(.Rows.Count).PasteSpecial 3
      End With
    End If
  Next
  With Sheets("TongHop").[AA6].CurrentRegion
    .Offset(, 1).Resize(, 1).AdvancedFilter 1, , , 1
    .Offset(1).SpecialCells(12).Copy: Sheets("TongHop").[A7].PasteSpecial 3
    Sheets("TongHop").ShowAllData
    .Clear
  End With
  Sheets("TongHop").[A6].Select
  Application.ScreenUpdating = True
End Sub
--------------------------------
Hiện nay Office 2007 đang dần thay thế các phiên bản củ... Chúng ta cũng nên từng bước nghiên cứu, ít nhất là sử dụng những tuyệt chiêu chuyên biệt của nó ----> RemoveDuplicates là 1 trong các tuyệt chiêu mà tôi muốn đề cập trong bài này ---> Giãi pháp cực nhanh, cực kỳ hiệu quả
PHP:
Sub TongHop_2007()
  Dim Sh As Worksheet
  If Application.Version < 12 Then Exit Sub
  Application.ScreenUpdating = False
  Sheets("TongHop").[A6].CurrentRegion.Offset(1).ClearContents
  For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> "TongHop" Then
      Sh.[A6].CurrentRegion.Offset(1).Copy
      With Sheets("TongHop").[A6].CurrentRegion
         .Offset(.Rows.Count).PasteSpecial 3
       End With
    End If
  Next
  With Sheets("TongHop").[A6].CurrentRegion
     .RemoveDuplicates 2, 1
     .Cells(1).Select
  End With
 Application.ScreenUpdating = True
End Sub
Để ý sẽ thấy với RemoveDuplicates ta chẳng cần phải dùng bất cứ vùng tạm nào... Đơn giãn là... RemoveDuplicates... rồi ra ngay kết quả
Chú ý: Phải mở file bằng Excel 2007 mới chạy được code thứ 2
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn ca_dafi phát triển lên, nếu muốn gộp 3-4 cột thì thế nào ?
Topic này là Hỏi đáp về Công thức! Vậy ta làm bằng công thức nhé
1> Quét chọn vùng dử liệu và đặt name cho nó là DS (trong file tôi DS =Sheet1!$B$3:$G$100)
2> Thêm 1 name nữa:
PHP:
VT =IF(DS="","",TRANSPOSE(ROW(INDIRECT("1:"&COLUMNS(DS))))+ROW(INDIRECT("1:"&ROWS(DS)))/1000)
3> Cuối cùng là công thức:
PHP:
=IF(ROWS($1:1)>COUNT(VT),"",INDEX(DS,MOD(SMALL(VT,ROWS($1:1)),1)*1000,INT(SMALL(VT,ROWS($1:1)))))
DS của bạn muốn bao nhiêu cột, bao nhiêu dòng cũng ko có vấn đề (chỉ sợ dử liệu quá lớn sẽ nặng file thôi)
 

File đính kèm

Cái VT đó viết vào đâu hả bạn, mình xem file của bạn mà kiếm ko thấy cái VT đó. giúp mình với nha, cám ơn nhìu!
 
anh cho em hỏi với là tại sao khi kéo công thức xuống lại không được mà cứ phải copy công thức xuống mới đúng ạ. Em cảm ơn
 
Topic này là Hỏi đáp về Công thức! Vậy ta làm bằng công thức nhé
1> Quét chọn vùng dử liệu và đặt name cho nó là DS (trong file tôi DS =Sheet1!$B$3:$G$100)
2> Thêm 1 name nữa:
PHP:
VT =IF(DS="","",TRANSPOSE(ROW(INDIRECT("1:"&COLUMNS(DS))))+ROW(INDIRECT("1:"&ROWS(DS)))/1000)
3> Cuối cùng là công thức:
PHP:
=IF(ROWS($1:1)>COUNT(VT),"",INDEX(DS,MOD(SMALL(VT,ROWS($1:1)),1)*1000,INT(SMALL(VT,ROWS($1:1)))))
DS của bạn muốn bao nhiêu cột, bao nhiêu dòng cũng ko có vấn đề (chỉ sợ dử liệu quá lớn sẽ nặng file thôi)

anh cho em hỏi với là tại sao khi kéo công thức xuống lại không được mà cứ phải copy công thức xuống mới đúng ạ. Em cảm ơn

 
Ô E3 gõ công thức:

Sau đó copy down công thức xuống dưới nhé!
Bạn xem thêm file đính kèm!

To whitemouse: Bạn xem kỹ lại câu hỏi xem. Không đơn giản vậy đâu!
Bài này cũng phải copy công thức xuống từng ô mới được, chứ nếu kéo thẳng xuống thì cũng không được là sao vậy?
 

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

Back
Top Bottom