Nối các chuỗi có số lượng ký tự giống nhau (1 người xem)

Liên hệ QC

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

Nhờ anh chị viết giúp hàm VBA như file đính kèm
Cảm ơn các anh chị.
Bạn thử hàm nhé:
Rich (BB code):
Function NoiChuoi(SoKyTu As Long, DauPhanCach As String, VungDuLieu As Range) As String
Dim rg As Range, cll As Range
Dim KetQua As String

For Each cll In VungDuLieu
    If Len(Trim(cll)) = SoKyTu Then
        KetQua = KetQua + Trim(cll) + DauPhanCach
    End If
Next
NoiChuoi = Left(KetQua, Len(KetQua) - 1)
End Function
 
Upvote 0
Bạn thử hàm nhé:
Rich (BB code):
Function NoiChuoi(SoKyTu As Long, DauPhanCach As String, VungDuLieu As Range) As String
Dim rg As Range, cll As Range
Dim KetQua As String

For Each cll In VungDuLieu
    If Len(Trim(cll)) = SoKyTu Then
        KetQua = KetQua + Trim(cll) + DauPhanCach
    End If
Next
NoiChuoi = Left(KetQua, Len(KetQua) - 1)
End Function
DauPhanCach là "-0-" thì sao?
 
Upvote 0
À mà trong vba, string cũng cộng chuỗi được giống python mấy bác nhỉ, nào giờ em mới biết ( trước cứ & và & )
 
Upvote 0
À mà trong vba, string cũng cộng chuỗi được giống python mấy bác nhỉ, nào giờ em mới biết ( trước cứ & và & )
Hic! Tôi cũng hay có thói quen dùng &, nhưng giờ phát hiện thấy dùng & mà gõ dính vào với biến hoặc mã lệnh thì VBA hiểu đó là ký tự nằm chung trong biến/mã đó chứ không phải là toán tử nên báo lỗi. Dùng + thì VBA tự hiểu là toán tử và tách ra giùm mình, tiện hơn.
 
Upvote 0
gõ dính vào với biến hoặc mã lệnh thì VBA hiểu đó là ký tự nằm chung trong biến/mã đó chứ không phải là toán tử nên báo lỗi
Theo em nghĩ là không phải hiểu nằm chung biến, mà tại vì khai báo a as long có thể thay bằng a& nên viết cạnh nhau nó lỗi là vậy. Còn gì thì gì, dùng + có lẽ vẫn nên hạn chế sử dụng hơn, ví dụ khai báo a as string thì + nó nối chuỗi, chứ giả sử quên đuôi as string mà vba hiểu a là một variant nó lại cộng búa lua xua đau đầu hơn ấy :D
 
Upvote 0
Theo em nghĩ là không phải hiểu nằm chung biến, mà tại vì khai báo a as long có thể thay bằng a& nên viết cạnh nhau nó lỗi là vậy. Còn gì thì gì, dùng + có lẽ vẫn nên hạn chế sử dụng hơn, ví dụ khai báo a as string thì + nó nối chuỗi, chứ giả sử quên đuôi as string mà vba hiểu a là một variant nó lại cộng búa lua xua đau đầu hơn ấy :D

Nếu quý vị nghĩ rằng + cũng giống như & là nhầm to rồi. Hai toán tử ấy hoạt động khác nhau. Chạy thử code này sẽ biết:
Sub t()
Debug.Print 1 + "1"
Debug.Print 1 & "1"
End Sub
Kết quả
2
11
Cũng đâu lạm dụng dấu + đâu. Lúc nào cả thủ tục toàn xử lý chuỗi thì mới dùng nó cho tiện thôi.
 
Upvote 0
Nếu quý vị nghĩ rằng + cũng giống như & là nhầm to rồi. Hai toán tử ấy hoạt động khác nhau. Chạy thử code này sẽ biết:
Sub t()
Debug.Print 1 + "1"
Debug.Print 1 & "1"
End Sub
Kết quả
2
11
Khi dùng + thì luôn nhớ các phần tử phải cùng một kiểu dữ liệu là được mà anh.

cstr(1) + "1" = 1 & "1"
 
Upvote 0
Khi dùng + thì luôn nhớ các phần tử phải cùng một kiểu dữ liệu là được mà anh.

cstr(1) + "1" = 1 & "1"
Tôi cho rằng nếu tôi không cảnh báo thì người khác đọc bài #9 và #10 sẽ tưởng bở.

Túm lại: phép + không phải là phép nối chuỗi trong VBA. Khi sử dụng, VBA sẽ dựa vào quy luật ép kiểu của phép cộng.
phép & là phép nối chuỗi. Khi sử dụng, VBA luôn luôn ép kiểu sang chuỗi trước khi nối.
 
Upvote 0
Bạn thử hàm nhé:
Rich (BB code):
Function NoiChuoi(SoKyTu As Long, DauPhanCach As String, VungDuLieu As Range) As String
Dim rg As Range, cll As Range
Dim KetQua As String

For Each cll In VungDuLieu
    If Len(Trim(cll)) = SoKyTu Then
        KetQua = KetQua + Trim(cll) + DauPhanCach
    End If
Next
NoiChuoi = Left(KetQua, Len(KetQua) - 1)
End Function
Cảm ơn bạn và các bạn trên GPE đã giúp đỡ.
Bạn ơi hàm chỉ có chọn được 1 vùng giữ liệu.
bạn làm ơn sửa giúp mình là chọn được nhiều vùng giữ liệu khác nhau với nhé.
 
Upvote 0
Cảm ơn bạn và các bạn trên GPE đã giúp đỡ.
Bạn ơi hàm chỉ có chọn được 1 vùng giữ liệu.
bạn làm ơn sửa giúp mình là chọn được nhiều vùng giữ liệu khác nhau với nhé.
Viết như này:
Mã:
=NoiChuoi(3,"-",(D5:D7,E5:E7,G5:G7))
 
Upvote 0
Viết như này:
Mã:
=NoiChuoi(3,"-",(D5:D7,E5:E7,G5:G7))
Bạn có biết cách viết sao cho cú pháp của hàm là NoiChuoi(KyTu,PhanCach,Range1,Range1,Range3,...) không? Nghĩa là n range, thêm bao nhiêu range thì nhận bấy nhiêu. Tôi định viết như thế nhưng không biết cách.
 
Upvote 0
Upvote 0
Cảm ơn bạn @Nhattanktnn
Hàm còn một lỗi nữa là khi các ô bị trống thì trả kết quả bị lỗi Value...
Bạn xử lý bỏ qua lỗi này giúp mình là khi không có giữ liệu thì sẽ trả về "No"
Cảm ơn bạn.
Bạn thay chỗ dòng kết quả cuối cùng thành:
If Len(NoiChuoi) > 0 Then
NoiChuoi = Left(KetQua, Len(KetQua) - Len(DauPhanCach))
Else
NoiChuoi = "Không có." 'Hoặc NO nay gì đó tùy bạn
End If
 
Upvote 0
Bạn thay chỗ dòng kết quả cuối cùng thành:
If Len(NoiChuoi) > 0 Then
NoiChuoi = Left(KetQua, Len(KetQua) - Len(DauPhanCach))
Else
NoiChuoi = "Không có." 'Hoặc NO nay gì đó tùy bạn
End If
Hàm UDF trả về lỗi là cách thức làm việc đúng. Bẫy lỗi là bẻ tréo tay nó.
Muốn bẫy lỗi thì bẫy trên bảng tính (hàm IFERROR chẳng hạn)
 
Upvote 0
Bạn có biết cách viết sao cho cú pháp của hàm là NoiChuoi(KyTu,PhanCach,Range1,Range1,Range3,...) không? Nghĩa là n range, thêm bao nhiêu range thì nhận bấy nhiêu. Tôi định viết như thế nhưng không biết cách.
Em nghĩ nó là thế này:
Mã:
Option Explicit
Function NoiChuoi(SoKyTu As Long, DauPhanCach As String, ParamArray VungDulieu() As Variant) As String
Dim cll As Range, I As Long, KetQua As String, Rng As Range
If UBound(VungDulieu) < 0 Then Exit Function
For I = 0 To UBound(VungDulieu)
    If Rng Is Nothing Then
        Set Rng = VungDulieu(I)
    Else
        Set Rng = Union(Rng, VungDulieu(I))
    End If
Next
For Each cll In Rng
    If Len(Trim(cll)) = SoKyTu Then
        KetQua = KetQua + Trim(cll) + DauPhanCach
    End If
Next
NoiChuoi = Left(KetQua, Len(KetQua) - 1)
End Function
 
Upvote 0
Hàm UDF trả về lỗi là cách thức làm việc đúng. Bẫy lỗi là bẻ tréo tay nó.
Muốn bẫy lỗi thì bẫy trên bảng tính (hàm IFERROR chẳng hạn)
Em nghĩ chỗ này cũng do mình thiếu bao quát nên gây lỗi không đáng có. Khi không có kết quả nào trả về thì phải thông báo.
 
Upvote 0
Em nghĩ chỗ này cũng do mình thiếu bao quát nên gây lỗi không đáng có. Khi không có kết quả nào trả về thì phải thông báo.
Tôi đâu có xem code, cũng không hiểu hết yêu cầu của đề bài. Tôi không thể nói thêm về "lỗi không đáng có"
Những điều tôi nói ở bài #22 chỉ là chung chung. Thường thì người viết hàm phải có chú thích ở đầu hàm về các điều kiện làm việc và các lỗi trả về.

không có kết quả nào trả về: tuỳ theo bạn chủ đích muốn cho nó làm gì. Điển hình hàm Match của Excel nó đâu có thông báo gì. Kiếm không có thì nó "error" thôi.
 
Upvote 0
Tôi đâu có xem code, cũng không hiểu hết yêu cầu của đề bài. Tôi không thể nói thêm về "lỗi không đáng có"
Những điều tôi nói ở bài #22 chỉ là chung chung. Thường thì người viết hàm phải có chú thích ở đầu hàm về các điều kiện làm việc và các lỗi trả về.

không có kết quả nào trả về: tuỳ theo bạn chủ đích muốn cho nó làm gì. Điển hình hàm Match của Excel nó đâu có thông báo gì. Kiếm không có thì nó "error" thôi.
Bác nói như vậy là chuẩn rồi. (Để còn biết được dữ liệu sai hay đúng)
Nhưng đôi khi phải kết hợp hàm khác vào thấy nó khó chịu.
Bạn @Nhattanktnn và các bạn GPE giúp mình thêm điều kiện "Nếu hàm trả lỗi thì ="No") giúp mình với nhé!
Cảm ơn các bạn!
 
Upvote 0
Bác nói như vậy là chuẩn rồi. (Để còn biết được dữ liệu sai hay đúng)
Nhưng đôi khi phải kết hợp hàm khác vào thấy nó khó chịu.
Bạn @Nhattanktnn và các bạn GPE giúp mình thêm điều kiện "Nếu hàm trả lỗi thì ="No") giúp mình với nhé!
Cảm ơn các bạn!
Tôi đã làm ở bài #21 rồi đó bạn. Chắc bài cấp tập nên không theo kịp?
 
Upvote 0
Em nghĩ nó là thế này:
Mã:
Option Explicit
Function NoiChuoi(SoKyTu As Long, DauPhanCach As String, ParamArray VungDulieu() As Variant) As String
Dim cll As Range, I As Long, KetQua As String, Rng As Range
If UBound(VungDulieu) < 0 Then Exit Function
For I = 0 To UBound(VungDulieu)
    If Rng Is Nothing Then
        Set Rng = VungDulieu(I)
    Else
        Set Rng = Union(Rng, VungDulieu(I))
    End If
Next
For Each cll In Rng
    If Len(Trim(cll)) = SoKyTu Then
        KetQua = KetQua + Trim(cll) + DauPhanCach
    End If
Next
NoiChuoi = Left(KetQua, Len(KetQua) - 1)
End Function
OK. Nay học thêm được cách viết tham số mảng, cảm ơn bạn!
 
Upvote 0

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

Back
Top Bottom