Cách ghép hai cột (1 người xem)

  • Thread starter Thread starter mrknorr
  • Ngày gửi Ngày gửi
Liên hệ QC

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

mrknorr

Thành viên mới
Tham gia
27/6/08
Bài viết
15
Được thích
0
Tôi đang gặp khó khăn như sau, các bác xem có cách nào giúp tôi không nhé. Tôi đang cần ghép dữ liệu hai cột thành một cột như file đính kèm nhưng dữ liệu rất nhiều có tận 1000 dòng nên em không làm thủ công được. Các bác xem có cách nào giúp em với nhé!
 

File đính kèm

Tôi đang gặp khó khăn như sau, các bác xem có cách nào giúp tôi không nhé. Tôi đang cần ghép dữ liệu hai cột thành một cột như file đính kèm nhưng dữ liệu rất nhiều có tận 1000 dòng nên em không làm thủ công được. Các bác xem có cách nào giúp em với nhé!

Bạn có thể dùng hàm CONCATENATE để nối chuỗi:
Sau đó kéo fill công thức xuống.
 
Nối nhiều chuỗi trong nhiều cột ngăn cách bởi dấu , ??

Nối nhiều chuỗi trong nhiều cột ngăn cách bởi dấu , ??
 
Pa dùng các công thức trên là OK rùi, như file của pa đính kèm thì pa dùng : =A1&" "&B1 rùi sau đó double click góc dưới ô dùng hàm để lặp lại công thức ở các dòng bên dưới là OK rùi ( dù có 2000 dòng dữ liệu cũng thế mà thui :)
 
Với n = 50 trở lên chắc "đói" luôn quá Kiệt ơi (nếu dùng cách này)
Ẹc... Ẹc... Lúc đó chắc phải UDF quá nhỉ?

Vâng, em nghĩ với số lượng cột nhiều như vậy thì dùng UDF (user define function) tốt hơn.
Tuy nhiên, để làm được hàm UDF như thế, em có một bài toán nhỏ nữa, mong các anh giúp đỡ.

Bài toán: Làm sao khai báo tham số cho hàm UDF dạng vô hạn/Không biết trước có bao nhiêu tham số?
Ví dụ: Để có công thức MyConcatenate(Text1, Text2,.......Textn)
Ta viết hàm như sau:
Function MyConcatenate(.....Khai báo cái gì ở đây để khi gõ công thức được như bên trên??)
Đoạn code xử lý
...............
End Function

Mong các anh chị giúp đỡ
 
Có thể khai báo như sau:
Function MyConcatenate(ParamArray Strings() As Variant) As String
.....
End Function
Ví dụ như sau:
Mã:
Function MyConcatenate(ParamArray Strings() As Variant) As String
    Dim i As Byte
    Dim Ketqua As String
    For i = LBound(Strings) To UBound(Strings)
        Ketqua = Ketqua & "," & Strings(i)
    Next i
        Ketqua = Right(Ketqua, Len(Ketqua) - 1)
     MyConcatenate = Ketqua
End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn bác! Nhưng không biết xài bác ơi? Bác có thể chỉ rõ thêm 1 chút được không bác? Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
Thế sao ta không khai báo nguồn dử liệu là RANGE nhỉ? Hàm sẽ có dạng:
Function Noichuoi(Rng As Range)
Đơn giản vậy thôi, lúc xài thì quét chọn vùng dử liệu
 
Nguyên văn bởi ca_dafi
Bài toán: Làm sao khai báo tham số cho hàm UDF dạng vô hạn/Không biết trước có bao nhiêu tham số?
Ví dụ: Để có công thức MyConcatenate(Text1, Text2,.......Textn)
Ta viết hàm như sau:
Trích:
Function MyConcatenate(.....Khai báo cái gì ở đây để khi gõ công thức được như bên trên??)
Đoạn code xử lý
...............
End Function
-Hàm trên chỉ là 1 ví dụ để giải đáp câu hỏi của ca_dafi viết hàm có tham số vô hạn.
-Theo khai báo trên, tham số không phải là 1 vùng nên hàm có dạng như concatenate:
=Myconcatenate(text1,text2,text3......vô hạn), không đến nỗi:
Nguyên văn bởi ndu96081631
Với n = 50 trở lên chắc "đói" luôn quá Kiệt ơi (nếu dùng cách này)
Ẹc... Ẹc... Lúc đó chắc phải UDF quá nhỉ?
 
Em làm với code như sau: Bác thử với hai hoặc ba cột gần nhau xem nó ghép cũng được đấy chứ! Nhưng nếu những cột rời rạt thì bác giúp em nữa nha! Botay rồi!
PHP:
Function Dconcatenate(cel As Range) As String For i = 1 To cel.Rows.Count For j = 1 To cel.Columns.Count If i = 1 And j = 1 Then     Ketqua = cel(i, j) Else     Ketqua = Ketqua & "," & cel(i, j) End If Next Next Dconcatenate = Ketqua End Function
Thân.
 
Lần chỉnh sửa cuối:
Ví dụ như sau:
Mã:
Function MyConcatenate(ParamArray Strings() As Variant) As String
    Dim i As Byte
    Dim Ketqua As String
    For i = LBound(Strings) To UBound(Strings)
        Ketqua = Ketqua & "," & Strings(i)
    Next i
        Ketqua = Right(Ketqua, Len(Ketqua) - 1)
     MyConcatenate = Ketqua
End Function

Xin cảm ơn thầy!
Tuy nhiên, yêu cầu bài toán là: tham số đó (giống hàm SUM() và concatenate()) vừa có thể khai báo dạng text, vừa có thể khai báo dạng Range mới được.

Ví dụ:
= MyConcatenate(A1:C1,"GPE",M1:P1,.....)
= MySum(12,12,34,45,A1:M2)

Xin anh chị dành chút thời gian giúp đỡ. Chân thành cảm ơn!
 
Nguyên văn bởi Po_Pikachu
..........................................
Bạn khai báo như trên, tham số chỉ là 1 vùng. Nếu muốn ghép nhiều vùng khác nhau, ta phải khai báo dạng ParamArray, vì số vùng lúc bấy giờ là không thể xác định là bao nhiêu. Thử kết hợp Myconcatenate và Dconcatenate:
Mã:
Function Dconcatenate(ParamArray cel() As Variant) As String
  For N = LBound(cel) To UBound(cel)
              For i = 1 To cel(N).Rows.Count
                  For j = 1 To cel(N).Columns.Count
                    Ketqua = Ketqua & "," & cel(N)(i, j)
                 Next
             Next
                Ketquachung = Ketquachung & "," & Ketqua
   Next
Ketquachung = Right(Ketquachung, Len(Ketquachung) - 2)
Dconcatenate = Ketquachung
End Function
 
Vậy em xin mạn phép xữa lại như vầy không biết bác ý? He..hee.
PHP:
Function Dconcatenate1(ParamArray cel() As Variant) As String For i = 1 To cel(N).Rows.Count              For N = LBound(cel) To UBound(cel)                  For j = 1 To cel(N).Columns.Count                     Ketqua = Ketqua & "," & cel(N)(i, j)                  Next              Next Next Ketqua = Right(Ketqua, Len(Ketqua) - 1) Dconcatenate1 = Ketqua End Function
Thân.
 
Lần chỉnh sửa cuối:
Vậy em xin mạn phép xữa lại như vầy không biết bác ý? He..hee.
PHP:
Function Dconcatenate1(ParamArray cel() As Variant) As String
For i = 1 To cel(N).Rows.Count
             For N = LBound(cel) To UBound(cel)
                 For j = 1 To cel(N).Columns.Count
                    Ketqua = Ketqua & "," & cel(N)(i, j)
                 Next
             Next
Next
Ketquachung = Ketqua
Ketquachung = Right(Ketquachung, Len(Ketquachung) - 2)
Dconcatenate1 = Ketquachung
End Function
Thân.

Po_Pikacu xem lại giúp: Mình gõ A1= Dconcatenate1(A2:C2) nhưng hàm trả về giá trị rỗng. Không biết có phải lỗi ở tham số N hay không?
 
Bác ơi em muốn đưa nó về hàm mãng để lấy nối theo từng dòng thôi nhưng sao giá trị lại là số 0 vậy! Vậy phải sữa code này như thế nào bác Voda!
PHP:
Function Myconcatenate(ParamArray cel() As Variant)
Dim Ketqua()
ReDim Ketqua(cel(1).Rows.Count)
For i = 1 To cel(N).Rows.Count
             For N = LBound(cel) To UBound(cel)
                 For j = 1 To cel(N).Columns.Count
                    Ketqua(i) = Ketqua(i) & "," & cel(N)(i, j)
                 Next
             Next
Next
Myconcatenate = Ketqua()
End Function
@Ca_Dafi: Em gửi file cho bác xem nha!
Thân.
 

File đính kèm

Viết như trên, mảng sẽ hiển thị theo chiều ngang (dòng). Nếu muốn hiển thị theo chiều dọc (cột), bạn chỉnh lại như sau:
Mã:
Function Myconcatenate(ParamArray cel() As Variant)
Dim Ketqua()
[B]ReDim Ketqua(1 To cel(1).Rows.Count)[/B]
     For i = 1 To cel(N).Rows.Count
             For N = LBound(cel) To UBound(cel)
                 For j = 1 To cel(N).Columns.Count
                    Ketqua(i) = Ketqua(i) & "," & cel(N)(i, j)
                 Next
             Next
    Next
     [B]Myconcatenate = Application.Transpose(Ketqua)[/B]
 End Function
 
Cảm ơn bác nhiều! Em xin sữa thêm 1 chút để hoàn hảo hơn!
PHP:
Function Myconcatenate(ParamArray cel() As Variant)
Dim Ketqua()
ReDim Ketqua(1 To cel(1).Rows.Count)
    For i = 1 To cel(N).Rows.Count
             For N = LBound(cel) To UBound(cel)
                 For j = 1 To cel(N).Columns.Count
                    Ketqua(i) = Ketqua(i) & "," & cel(N)(i, j)
                 Next
             Next
             Ketqua(i) = Right(Ketqua(i), Len(Ketqua(i)) - 1)
    Next
Myconcatenate = Application.Transpose(Ketqua)
End Function
Thank.ss
 
ghép nhiều cột

mrknorr
user_offline.gif

Excel Member
gold.gif


em làm cách này có được không
PHP:
Sub ghep()
Dim i As Variant
i = 1
Application.ScreenUpdating = False
While Cells(i, 1).Value <> ""
    Cells(i, 4).Value = Cells(i, 1).Value & " " & Cells(i, 2).Value
    i = i + 1
Wend
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
mrknorr
user_offline.gif

Excel Member
gold.gif


em làm cách này có được không
PHP:
Sub ghep()
Dim i As Variant
i = 1
Application.ScreenUpdating = False
While Cells(i, 1).Value <> ""
    Cells(i, 4).Value = Cells(i, 1).Value & " " & Cells(i, 2).Value
    i = i + 1
Wend
Application.ScreenUpdating = True
End Sub
OK rồi, chỉ khai lại biến i: Dim i As Long
Và nên khai thêm Sh....select để nó biết làm ở Sh nào.
 
Em thêm Msgbox vào Function (mục đích của em là kiểm tra thử xem UBound(Clls, 1) , LBound(Clls, 1) bằng bao nhiêu ứng với vùng chọn ấy mà) cụ thể;

PHP:
Function Noi(ParamArray Clls() As Variant) As String
For i = 1 To Clls(N).Rows.Count
             For N = LBound(Clls, 1) To UBound(Clls, 1)
             MsgBox UBound(Clls, 1)
                 For j = 1 To Clls(N).Columns.Count
                    Ketqua = Ketqua & "," & Clls(N)(i, j)
                 Next
             Next
Next
Ketqua = Right(Ketqua, Len(Ketqua) - 1)
Noi = Ketqua
End Function

Kết quả tại ô E15=noi(A1:D15) thì Msgbox UBound ra 16 lần số 0 nghĩa là thế nào ah, mong các thày chỉ cho
 
Lần chỉnh sửa cuối:
Em thêm Msgbox vào Function (mục đích của em là kiểm tra thử xem UBound(Clls, 1) , LBound(Clls, 1) bằng bao nhiêu ứng với vùng chọn ấy mà) cụ thể;

PHP:
Function Noi(ParamArray Clls() As Variant) As String
For i = 1 To Clls(N).Rows.Count
             For N = LBound(Clls, 1) To UBound(Clls, 1)
             MsgBox UBound(Clls, 1)
                 For j = 1 To Clls(N).Columns.Count
                    Ketqua = Ketqua & "," & Clls(N)(i, j)
                 Next
             Next
Next
Ketqua = Right(Ketqua, Len(Ketqua) - 1)
Noi = Ketqua
End Function

Kết quả tại ô E15=noi(A1:D15) thì Msgbox UBound ra 16 lần số 0 nghĩa là thế nào ah, mong các thày chỉ cho
Bạn đã khai báo ParamArray Clls() As Variant thì bạn phải nghĩ đến trường hợp các đối số con không phải là Range (có thể chúng là mảng thì sao?) ---> Vậy thì câu lệnh For i = 1 To Clls(N).Rows.Count là rất vô duyên... Vì như vậy thì bạn đang ngầm xem các đối số con trong Clls() là Range à? Như thế cần quái gì cái ParamArray cho rách việc
Thêm nũa, khi áp dụng, bạn viết =noi(A1:D15), chứng tỏ chỉ có duy nhất 1 đối số con, vậy MsgBox UBound(Clls, 1) cho kết quả = 0 là phải rồi (vì mảng Clls() chỉ có 1 phần tử, đó là vùng A1:D15).... Thử sửa thành =Noi(A1:C4, D2:D5, D10:D15) thì MsgBox sẽ cho kết quả = 2 (vì ParamArray có 3 đối số con)
-------------------------------
Nếu bạn thích hàm nối chuổi, tôi tặng bạn cái này, bảo đảm hoàn chỉnh hơn
PHP:
Function JoinText(ByVal Sep As String, ByVal IgnoreBlanks As Boolean, ParamArray sArray()) As String
  Dim tmpArr, SubArr, Arr(), Item, n As Long
  On Error Resume Next
  For Each SubArr In sArray
    tmpArr = SubArr
    If TypeName(tmpArr) <> "Variant()" Then
      If IgnoreBlanks = False Or Len(Trim(CStr(tmpArr))) > 0 Then
        n = n + 1
        ReDim Preserve Arr(1 To n)
        Arr(n) = CStr(tmpArr)
      End If
    Else
      For Each Item In tmpArr
        If IgnoreBlanks = False Or Len(Trim(CStr(Item))) > 0 Then
          n = n + 1
          ReDim Preserve Arr(1 To n)
          Arr(n) = CStr(Item)
        End If
      Next
    End If
  Next
  If n Then JoinText = Join(Arr, Sep)
End Function
- Hàm này cho phép bạn tùy chọn dấu phân cách...
- Hàm cũng cho phép bạn tùy chọn bỏ qua phần tử rổng hay không...
- Ngoài ra hàm có thể hoạt động trên Range hoặc mảng tùy ý (tức có khả năng nối chuổi từ với nguồn dữ liệu là các phần tử trong ListBox chẳng hạn)
------
Xem file
 

File đính kèm

Lần chỉnh sửa cuối:

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

Back
Top Bottom