nghiank09
Thành viên hoạt động



- Tham gia
- 1/3/12
- Bài viết
- 143
- Được thích
- 30
Lời bài hát thì nó có ý nghĩa theo từng câu sao bạn lại muốn gộp 5 chữ là 1 dòng.Chào mọi người, em có một đoạn text lời bài hát (cột A), có cách nào để Excel sẽ nối các dòng có dữ liệu với nhau và xuống dòng theo số lượng từ cho trước (ô B1). Kết quả trả về ô C1. Em gửi kèm file ạ. Cám ơn mọi người rất nhiều.
Đây là hình ví dụ ạ:
Đầu tiên bạn dùng AutoFilter lọc tất cả dòng trắng (blank) sau đó xóa toàn bộ những dòng trắng này cho nó dồn hàng lên toàn bộ.Chào mọi người, em có một đoạn text lời bài hát (cột A), có cách nào để Excel sẽ nối các dòng có dữ liệu với nhau và xuống dòng theo số lượng từ cho trước (ô B1). Kết quả trả về ô C1. Em gửi kèm file ạ. Cám ơn mọi người rất nhiều.
Đây là hình ví dụ ạ:
View attachment 265392
Tại vì mình sẽ chép vào máy nghe nhạc (máy đời cũ). Máy nghe nhạc này đọc được file .txt mỗi dòng trong máy chỉ hiển thị tối đa 5 ký tự. Nếu để đoạn lyric không chỉnh sửa chép vào máy thì rất khó đọc, nên mình phải chủ động xuống dòng (mỗi dòng 5 ký tự)Lời bài hát thì nó có ý nghĩa theo từng câu sao bạn lại muốn gộp 5 chữ là 1 dòng.
5 chữ (từ đơn) chứ bạn.mỗi dòng 5 ký tự
Function Fivewords(MyStr As String)
Dim tmp As String, Res As String, k As Long
For i = 1 To Len(MyStr)
tmp = Mid(MyStr, i, 1)
If tmp <> " " Then
Res = Res & tmp
Else
k = k + 1
If k Mod 5 <> 0 Then
Res = Res & tmp
Else
Res = Res & Chr(10)
End If
End If
Next
Fivewords = Res
End Function
Này thì cho dễ hiểu.Code đơn giản cho dễ hiểu
Function Fivewords2(ByVal MyStr As String) As String
Const numWordsWrap = 5
Dim tmp As String, Res As String, k As Long
MyStr = WorksheetFunction.Trim(MyStr) 'de sau moi tu la 1 khoang trang '
For i = 1 To Len(MyStr)
tmp = Mid(MyStr, i, 1)
If tmp <> " " Then
Res = Res & tmp
Else 'tim thay khoang trang " " '
k = k + 1 'dem khoang trang = so tu '
If k < numWordsWrap Then 'so khoang trang < so tu can ngat dong '
Res = Res & tmp
Else 'so khoang trang = so tu can ngat dong '
Res = Res & Chr(10)
k = 0 'dat lai gia tri dem ve 0, de dem tu dau '
End If
End If
Next
Fivewords2 = Res
End Function
Public Function SplitTextX(ByVal rng As Range, ByVal num As Long) As String
Dim arrData, v, i&, temp$
arrData = rng.Value
For i = 1 To UBound(arrData, 1)
If arrData(i, 1) <> "" Then temp = temp & " " & arrData(i, 1)
Next i
v = Split(Application.Trim(temp), " ")
For i = num To UBound(v) Step num
v(i) = ChrW(10) & v(i)
Next i
SplitTextX = Join(v, " ")
End Function
Tóm tắt cách này là gộp vào, tách ra, rồi lại gộp vàoGóp vui một cách khác:.
Trong đó có tôi 1 nửa. Nếu dữ liệu rất nhiều tôi mới quan tâm tốc độ, và tiết kiệm từng 1/1000 giây bao gồm "không nối chuỗi".Dân GPE ngoài thói quen thích tốc độ còn có tật mâu thuẫn với tốc độ là dùng phép cộng chuỗi & bất cứ nơi nào.
Chỗ này chắc anh gõ nhầm. Lúc này Len(Fivewords2) = 0For i = 1 to Len(Fivewords2)
Bác Vẹt thử dùng hàm MID để thay thế cho cái ký tự & trong bài này xem:Dân GPE ngoài thói quen thích tốc độ còn có tật mâu thuẫn với tốc độ là dùng phép cộng chuỗi & bất cứ nơi nào.
Mid không phải tìm " " lấy gì sửa " " thành thứ khác? Hai trường hợp khác nhau.Bác Vẹt thử dùng hàm MID để thay thế cho cái ký tự & trong bài này xem:
![]()
Tách chữ bị dính trong excel
Nhờ mọi người giúp mình với, mình có 1 file excel khoảng 1700 dòng nhưng chữ có chỗ bị dính có chỗ không, mình đã tham khảo nhiều cách trên mạng nhưng không thành công. Nhờ mọi người giúp mình hàm/ công thức để tách phần chữ bị dính đó với. Mình gửi file mẫu ạ Xin cảm ơnwww.giaiphapexcel.com
Ủa đang hỏi bác Vẹt mà bác! Do bác Vẹt nói "dùng phép cộng chuỗi & bất cứ nơi nào" nên hỏi xem bác Vẹt có cao kiến gì không.Mid không phải tìm " " lấy gì sửa " " thành thứ khác? Hai trường hợp khác nhau.
Trường hợp bài trong chủ đề này là sau khi chạy code, len không đổi, nên thay Mid 1 bằng Mid 1 (" " thay bằng ký tự 10)
Trường hợp bên kia sau khi chạy code thì len thay đổi (tăng lên). Mid tìm 1 ký tự viết hoa, thay bằng khoảng trắng & ký tự hoa đó (2 ký tự) trong khi Mid(1 ký tự) làm sao Mid này bằng mid kia được! Cố mà dùng Mid thay vào là mất ký tự liền kề ký tự viết hoa
Tôi đang hiểu ngược với "bất cứ nơi nào" không có nghĩa là "không nơi nào cả", mà là "không phải bất cứ nơi nào", hoặc nghĩa là "có nơi nào đó". Trong diễn đàn này đâu có cấm việc trả lời việc hỏi đích danh?Ủa đang hỏi bác Vẹt mà bác! Do bác Vẹt nói "dùng phép cộng chuỗi & bất cứ nơi nào" nên hỏi xem bác Vẹt có cao kiến gì không.
Function DichChu(ByVal chu As String) As String
Const so = 5
Dim demso As Integer
For demso = 1 To 10
Dim Vetmini
Next
chu = WorksheetFunction.Trim(chu)
With CreateObject("VBScript.RegExp")
.Global = True
.Pattern = "(\S+\s){" & so & "}"
DichChu = .Replace(chu, "$&" & vbCrLf)
End With
End Function
1. Theo chuỗi ví dụ thì tương đối có thể gọi là nhiều.Trong đó có tôi 1 nửa. Nếu dữ liệu rất nhiều tôi mới quan tâm tốc độ, và tiết kiệm từng 1/1000 giây bao gồm "không nối chuỗi".
Nếu dữ liệu không nhiều, hoặc dữ liệu cục bộ cần nối chuỗi không nhiều, tôi hy sinh tốc độ để viết code đơn giản, hoặc cố tình đơn giản. Nhất là khi viết cho người mới học. Còn befaint chắc là đang trêu ghẹo tôi thôi.
Chỗ này chắc anh gõ nhầm. Lúc này Len(Fivewords2) = 0
Rất nhiều đối với tôi là hàng trăm ngàn dòng kết quả trở lên (những dự án khác). Còn trong bài tôi viết thì chỉ vài trăm khoảng trắng cần xử lý, vì hàm đánh cho chuỗi đã gộp nhiều cells thành 1 bằng công thức.1. Theo chuỗi ví dụ thì tương đối có thể gọi là nhiều.
2. Fivewords2 tương đương với MyStr trong code bài #7. Chỉ hơi khác chút là tôi có chuẩn chuỗi lại: loại bỏ các dấu xuống hàng bằng cách đổi chúng thành dấu cách trước khi trim.
Chú về việc ChrW hay Chr gì gì đó: code tôi đưa lên chỉ có tính chất minh hoạ thuật toán. Có thể ophair chỉnh sửa thêm khi thực sự ứng dụng.
Anh muốn tiết kiệm ms thì đã là gì. Nhiều người chạy code VBA còn muốn tiết kiệm μs và ns kìa.Trong đó có tôi 1 nửa. Nếu dữ liệu rất nhiều tôi mới quan tâm tốc độ, và tiết kiệm từng 1/1000 giây bao gồm "không nối chuỗi".
Chỗ này chắc anh gõ nhầm. Lúc này Len(Fivewords2) = 0
Fivewords2 = Application.Trim(Replace(MyStr, dấu xuóng hàng, " "))
...
For i = 1 To Len(Fivewords2)