Em muốn nối dữ liệu các ô với nhau ( bỏ qua ô trắng)

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Salem999999999

Thành viên mới
Tham gia
5/11/14
Bài viết
15
Được thích
6
Anh chị giúp em nối dữ liệu các ô với nhau ( bỏ qua ô trắng) với ạ
VD:
X1X2X3Nối dữ liệu 3 cột với nhau để được như sau (tự loại bỏ ô trống)
AT1A+T1
BFB+F
VV
DH2D+H+2
SFS+F
 

File đính kèm

  • Nối dữ liệu.xlsx
    8.3 KB · Đọc: 15
Anh chị giúp em nối dữ liệu các ô với nhau ( bỏ qua ô trắng) với ạ
VD:
X1X2X3Nối dữ liệu 3 cột với nhau để được như sau (tự loại bỏ ô trống)
AT1A+T1
BFB+F
VV
DH2D+H+2
SFS+F
theo dữ liệu thì textjoin("+",,vùng cần nối) Quan trọng là excel phiên bản nào
 
Anh chị giúp em nối dữ liệu các ô với nhau ( bỏ qua ô trắng) với ạ
VD:
X1X2X3Nối dữ liệu 3 cột với nhau để được như sau (tự loại bỏ ô trống)
AT1A+T1
BFB+F
VV
DH2D+H+2
SFS+F
=BYROW(F5:H9, LAMBDA(x, TEXTJOIN("+",,x))). 365 nhé ^^. Không thì thử cái này =))
=IF(F5<>"", F5, "") & IF(AND(F5<>"", G5<>""), "+", "") & IF(G5<>"", G5, "") & IF(AND(H5<>"", OR(F5<>"", G5<>"")), "+", "") & IF(H5<>"", H5, "")
 
Công thức làm cái này có hơi khủng, tuy nhiên chỉ dùng toàn hàm giản dị:
- Đầu tiên hết =$A1 & "|" & $B1 & "|" $C1
- Đổi các khoảng trắng trong kết quả trên thành "!":
=Substitute($A1 & "|" & $B1 & "|" $C1, " ", "!")
- Đổi các "|" trong kết quả trên thành khoảng trắng, và trim
=Trim(Substitute(Substitute($A1 & "|" & $B1 & "|" $C1, " ", "!"), "|", " "))
- Đổi các khoảng trắng trong kết quả trên thành "+"
- Đổi các "!" trong kết quả trên thành khoảng trắng
=SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE($F5 & "|" & $G5 & "|" & $H5, " ", "!"), "|", " ")), " ", "+"), "!"," ")

Về hiệu quả thì hàm IF luôn luôn là cao nhất. Khong cần bàn thêm.
Về dễ thêm bớt thì hàm trên khá dễ thêm bớt ô
 
Lần chỉnh sửa cuối:
Thêm một cách:

=REPLACE(IF(F5<>"","+"& F5, "") &IF( G5<>"","+"&G5,"")&IF( H5<>"", "+"& H5, ""),1,1,"")
 
Lần chỉnh sửa cuối:
Tạo hàm (Function ở dưới) khi đó excel sẽ dùng ví dụ tại ô D2 =jnoi(A2:C2,"+"), nối bao nhiêu cũng được, "+" thay ký tự khác cũng OK.
Cách làm:
Bạn save file dạng xlsb hoặc xlsm và vào Option-Trustcenter-TrustCenterSetting-MessageBar bỏ chọn Show Policy..., rồi Alt F8 sau đó Insert 1 Module rồi chép đoạn dưới vào:

Function jNoi(ByVal Rng As Range, ByVal KyTu As String) As String
Dim Temp() As Variant
Dim i As Long
Dim KetQua() As String
Dim count As Long

On Error GoTo Stp1

With WorksheetFunction
Temp = .Transpose(Rng)
GoTo Stp2
Stp1:
Temp = .Transpose(.Transpose(Rng))
Stp2:

For i = LBound(Temp) To UBound(Temp)
If Temp(i) <> 0 Then
ReDim Preserve KetQua(count)
KetQua(count) = Temp(i)
count = count + 1
End If
Next i

jNoi = Join(KetQua, KyTu)
End With
End Function
 
Lần chỉnh sửa cuối:
...

Function jNoi(ByVal Rng As Range, ByVal KyTu As String) As String
...
Trời đất chỉ có công việc nhỏ xíu, hàm bự như hàm cá voi.

Function NoiTam(rg As Range, Optional tam As String = "") As String
If rg.Cells(1) <> "" Then tam = tam & IIf(tam = "", "", "+") & rg.Cells(1)
If rg.Cells.Count <= 1 Then
NoiTam = tam
Else
NoiTam = NoiTam(rg.Offset(, 1).Resize(, rg.Cells.Count - 1), tam)
End If
End Function
 
Trời đất chỉ có công việc nhỏ xíu, hàm bự như hàm cá voi.

Function NoiTam(rg As Range, Optional tam As String = "") As String
If rg.Cells(1) <> "" Then tam = tam & IIf(tam = "", "", "+") & rg.Cells(1)
If rg.Cells.Count <= 1 Then
NoiTam = tam
Else
NoiTam = NoiTam(rg.Offset(, 1).Resize(, rg.Cells.Count - 1), tam)
End If
End Function
Hàm của thầy chắc là chỉ nối 1 vùng ngang, nối 1 vùng dọc thì sao, dấu + chỉ là 1 trường hợp nên chỉ ứng dụng cho bài toán trên. Em muốn nối 1 vùng này theo điều kiện của 1 vùng khác để ứng dụng vào việc gửi Mail đến những người nào nợ (việc, tiền, dateLine...) và thiết kế Form,... rất mong thầy viết ra (nếu không tổng quát thì so với 0 cũng được). Cảm ơn thầy cho em hiểu về Optional.
 
Lần chỉnh sửa cuối:
Hàm bạn chắc là chỉ nối Range ngang, nối Range dọc thì sao? Tôi gà mờ vọc nên yếu. Nhờ bạn phát triển thêm code trên cho nối dọc. Tôi cũng muốn nối Range (này) theo điều kiện của Range (khác) nhưng không tưởng tượng ra cách viết. Ứng dụng vào việc gửi Mail đến những người nào nợ (việc, tiền...), việc dùng hàm excel thông thường cũng ra nhưng mất thời gian lắm, nhất là các ACE cty tôi đa phần cực yếu excel.
Tôi đến với Excel và VBA từ kiến thức lập trình.
Theo luật chung của lập trình thì tôi chỉ viết những hàm căn bản. Hàm chinh dùng để gọi những hàm ấy mà làm việc đúng chỗ, đúng nhiệm vụ. LTHĐT thì đại khái cũng vậy thôi, công việc là những phương thức nhỏ được lôi ra đúng lúc, đúng chỗ.

Điều này ngược với những bạn đi thuần túy theo VBA thì có khuynh hướng viết một hàm rồi cứ IF-THEN-ELSE thành nhiều công việc.

Thói quen của tôi thì cái nào làm việc được thì để yên, trừ phi phải chỉnh rất it để share code.
Trong trường hợp này, tuy hàm có thể thêm để nó có thể làm việc cả ngang lẫn dọc lẫn nhiều nhóm ranges, nhưng tôi tính ra code thì chỉ có một vài dòng để share mà IF-THEN-ELSE cả đống cho nên thây kệ. Lúc cần dọc thì viết cái hàm nhỏ khác.

Đại khái cấu trúc sẽ như vầy:

Public Function GopText(rg As Rnge, Optional delim As String = "+")
If (rg là nhóm ranges) Then
' gọi hàm gộp nhiều ranges, hàm này có thể sẽ gọi hai hàm kia
ElseIf (rg là 1 nhóm ngang) Then
' gọi hàm gộp nhóm ngang
ElseIf (rg là nhóm dọc) Then)
' gọi hàm gộp nhóm dọc
End If
End Function

Private Function GopDuThu(....)
...
End Function

Private Function GopRangeNgang(...)
' là hàm ở bài #8, sửa tên lại. Hặc lười thì cho hàm này gọi hàm ở bài #8
End Function

Private Function GopRangeDoc(...)
' viết code như bài #8, chỉnh cho chạy theo range dọc
End Function

Chú thích:
- Bạn để ý sẽ thấy chỉ có hàm chính là public, các thứ còn lại là private. Tôi viết theo chiều hướng của LT cấu trúc. Người dùng không cần biết đến các hàm phụ, họ chỉ cần biết hàm chính.
- Tôi chưa tính đến cái vụ Optional Delim.
Muốn thực hiện, bạn đặt thêm một biến toàn cục DELM (tức là trước hàm đầu tiên) cho Module. Vì cần chỉ toàn cục cho module (các Modules khác không thấy nó) cho nên bạn phải đặt nó là Private.
Hàm chính chỉ cần xét câu lệnh ngay dòng code đầu:
DELM = IIF(delim <> "", delim, "+")
Các hàm còn lại sẽ dùng cái DELM này.
 
Web KT
Back
Top Bottom