bỏ các khoảng trắng dư thừa

Liên hệ QC

gakon001

Thành viên mới
Tham gia
24/9/11
Bài viết
34
Được thích
1
Mình mới vào nghề được mấy bữa, mấy bạn coi giúp mình bài này với, đánh code xong chay tầm bậy hoài

Public Function khoangtrang(ByRef chuoi As String)


Dim c1, c2 As String
n = Len(chuoi)


'cat khoang trang o 2 dau
While Mid(chuoi, 1, 1) = " "
chuoi = Mid(chuoi, 2, n - 1)
Wend


k = Len(chuoi)
While Right(chuoi, 1) = " "
chuoi = Left(chuoi, k - 1)
Wend


m = Len(chuoi)
j = 2
'cat nhung khoang trang du thua o trong
For i = j To m - 1 Step 1
If Mid(chuoi, i, 2) = " " Then
c1 = Left(chuoi, 1, i - 1)
c2 = Mid(chuoi, i + 1, m)
'ghép chuổi
chuoi = c1 & " " & c2
'sửa lại chiều dài chuổi
m = Len(chuoi)
j = j - 1
End If
Exit For
Next i


khoangtrang = chuoi




End Function
 
Mình mới vào nghề được mấy bữa, mấy bạn coi giúp mình bài này với, đánh code xong chay tầm bậy hoài

Public Function khoangtrang(ByRef chuoi As String)

Dim c1, c2 As String
n = Len(chuoi)


'cat khoang trang o 2 dau
While Mid(chuoi, 1, 1) = " "
chuoi = Mid(chuoi, 2, n - 1)
Wend


k = Len(chuoi)
While Right(chuoi, 1) = " "
chuoi = Left(chuoi, k - 1)
Wend


m = Len(chuoi)
j = 2
'cat nhung khoang trang du thua o trong
For i = j To m - 1 Step 1
If Mid(chuoi, i, 2) = " " Then
c1 = Left(chuoi, 1, i - 1)
c2 = Mid(chuoi, i + 1, m)
'ghép chuổi
chuoi = c1 & " " & c2
'sửa lại chiều dài chuổi
m = Len(chuoi)
j = j - 1
End If
Exit For
Next i


khoangtrang = chuoi




End Function
"Chời" ơi! Code "khủng" thật.
Excel có hàm Substitute(), Trim()...
Chỉ cần Substitute(A1," ";"") là A1 chẳng còn khoảng trắng nào.
 
Upvote 0
/(/ếu đúng là mới tập tành viết code, thì. . . . .

Mình vẫn khuyên mọi người khi mới bắt đầu thì đừng tự chuốc rắc rối vào thân; Nên là:

Khai báo các biến 1 cách tường minh, tạo thoái quen dễ thương.

Trong đoạn mã trên biến n chưa được khai báo & như vậy nó mang kiểu Variant không cần thiết; Ta nên khai báo cho nó 1 troing 2 lựa chọn sau:
1 Dim N As Long (Như các nhà lập trình căn cơ khuyên)
2 Dim N As Byte

& với câu lệnh này sẽ không gì sai:

Dim c1, c2 As String

Nhưng như vậy c1 sẽ lại mang kiểu không fải kiểu chuỗi, tự dưng bạn chuốc khổ vào thân

(/ấn đề nữa là trong VBA ta có thể xài hàm Replace với cú fáp sau
(Trong của sổ Immediate)
Mã:
?Replace("GPE COM"," ",".")

Vấn đề thứ ba sẽ là: Khi bạn xài hàm, là khi bạn cần trả về 1 tham số của hàm, còn không cần trả về tham số nào, thì ta nên xài thủ tục (nôm na là 1 macro đơn thuần thôi, như
PHP:
 Sub ThayKhoangTrang()

 End Sub

Chúc nhiều thành công nay mai!
 
Upvote 0
"Chời" ơi! Code "khủng" thật.
Excel có hàm Substitute(), Trim()...
Chỉ cần Substitute(A1," ";"") là A1 chẳng còn khoảng trắng nào.
người ta đang tập viết code để trở thành bờ rô rối rắm mà bác BATE. đâu như chúng ta chỉ thích cái đơn giản.
 
Upvote 0
Cần phải nghe theo lời HYen17. Ngoài ra:

... đánh code xong chay tầm bậy hoài
Tầm bậy là phải rồi:
PHP:
k = Len(chuoi)
While Right(chuoi, 1) = " "
chuoi = Left(chuoi, k - 1)
Wend
k = Len(chuoi) để ngoài vòng lặp nên không bị thay đổi. Trong khi đó trong vòng lặp chiều dài chuỗi giảm dần, cứ thế mà k - 1 nên ... Nó không la làng cũng là may.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình mới vào nghề được mấy bữa, mấy bạn coi giúp mình bài này với, đánh code xong chay tầm bậy hoài
Chỉ vầy là đủ:
PHP:
Function khoangtrang(ByVal chuoi As String) As String
  Dim Tmp As String
  Tmp = Trim(chuoi)
  Do While InStr(Tmp, Space(2))
    Tmp = Replace(Tmp, Space(2), Space(1))
  Loop
  khoangtrang = Tmp
End Function
 
Upvote 0
ko phải vậy đâu bạn ơi. ví dụ, chuỗi ban đầu như sau:
" con ga" --có 2 khoảng trắng bên trái
k=len(chuoi)= 8
sau 1 vòng lập
=> " con ga"---còn 1 khoảng trắng bên trái---> chiều dài chuỗi giảm lại
k= len(chuoi)=7
vì mục đích cuối cùng của mình là cắt các khoảng dư thừa 2 bên chuỗi trước. Mình kiểm thấy đoạn này chạy đúng. Chỉ sai đối với các khoảng trắng dư thừa trong chuỗi thôi :D
Tương tự đối với bên phải
 
Upvote 0
Code của bạn đây:

1. Bên trái
PHP:
n = Len(chuoi)
While Mid(chuoi, 1, 1) = " "
chuoi = Mid(chuoi, 2, n - 1)
Wend
Chỗ nào làm cho n giảm từ 8 còn 7?
May là chỗ này dùng hàm mid, tham số thứ 3 có là 1 ngàn cũng tính được.

2. Bên phải

PHP:
k = Len(chuoi)
While Right(chuoi, 1) = " "
chuoi = Left(chuoi, k - 1)
Wend
Chỗ nào làm cho k giảm?
Chỗ này dùng hàm Left, trong khi chuoi đã giảm từ 8 xuống 7, mà cứ lấy left 7 hoài?

Tóm lại, muốn cho n hoặc k giảm, thì câu lệnh tính lại n và k = len(chuoi) phải để trong vòng lặp và đặt sau câu lệnh cắt 1 ký tự.

3. Ở giữa:

PHP:
m = Len(chuoi)
j = 2
For i = j To m - 1 Step 1
   If Mid(chuoi, i, 2) = "  " Then
     c1 = Left(chuoi, 1, i - 1)
     c2 = Mid(chuoi, i + 1, m)
     'ghép chuổi'
     chuoi = c1 & " " & c2
     'sửa lại chiều dài chuổi'
     m = Len(chuoi)
     j = j - 1
   End If
Exit For
Next i

Ở đây bạn có sửa lại chiều dài chuỗi, câu lệnh tính m = Len(chuoi) đã để trong vòng lặp. Nhưng vẫn sai ít nhất 3 chỗ:

a. c1 = Left(...) dư 1 tham số.
b. câu lệnh j = j -1 dư, không có tác dụng gì
c. Mới chạy 1 vòng bạn cho Exit For, nên không xử được khoảng trắng nào
 
Upvote 0
ko phải vậy đâu bạn ơi. ví dụ, chuỗi ban đầu như sau:
" con ga" --có 2 khoảng trắng bên trái
k=len(chuoi)= 8
sau 1 vòng lập
=> " con ga"---còn 1 khoảng trắng bên trái---> chiều dài chuỗi giảm lại
k= len(chuoi)=7
vì mục đích cuối cùng của mình là cắt các khoảng dư thừa 2 bên chuỗi trước. Mình kiểm thấy đoạn này chạy đúng. Chỉ sai đối với các khoảng trắng dư thừa trong chuỗi thôi :D
Tương tự đối với bên phải
Không biết bạn đang nói đến code nào? Code của tôi chăng?
Code của tôi cắt tất tần tật, cư thừa là cắt, bất kể nó nằm bên trái, bên phải hay ở giữa? Bạn kiểm tra chưa?
Mà quan trọng là cắt khoảng trắng ở giữa thôi, trái hay phải cần quái gì quan tâm ---> Hàm TRIM để làm gì?
 
Upvote 0
Hàm loại bỏ khoảng trắng có rất nhiều cách, nhưng tốt nhất không nên làm vòng lặp:

MyText = ___Hoàng___Trọng___Nghĩa___

1) Hàm loại bỏ khoảng trắng toàn bộ:

PHP:
Function SpaceReplaceAll(MyText As String) As String
  SpaceReplaceAll = Replace(MyText, " ", "")
End Function

Kết quả: HoàngTrọngNghĩa

2) Hàm loại bỏ khoảng trắng trái, phải, giữa, nhưng chừa 1 khoảng trắng hợp lý:

PHP:
Function AllTrim(MyText As String) As String
  AllTrim = Application.WorksheetFunction.Trim(MyText)
End Function

Kết quả: Hoàng_Trọng_Nghĩa

3) Hàm loại khoảng trắng bên trái:

PHP:
Function LeftTrim(MyText As String) As String
  LeftTrim = LTrim(MyText)
End Function

Kết quả: Hoàng___Trọng___Nghĩa___

4) Hàm loại khoảng trắng bên phải:

PHP:
Function RightTrim(MyText As String) As String
  RightTrim = RTrim(MyText)
End Function

Kết quả: ___Hoàng___Trọng___Nghĩa

5) Hàm loại khoảng trắng bên phải và bên trái, không loại bỏ khoảng trắng ở giữa:

PHP:
Function AsTrim(MyText As String) As String
  AsTrim = Trim(MyText)
End Function

Kết quả: Hoàng___Trọng___Nghĩa
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm loại bỏ khoảng trắng có rất nhiều cách, nhưng tốt nhất không nên làm vòng lặp:
2) Hàm loại bỏ khoảng trắng trái, phải, giữa, nhưng chừa 1 khoảng trắng hợp lý:

PHP:
Function AllTrim(MyText As String) As String
  AllTrim = Application.WorksheetFunction.Trim(MyText)
End Function

Kết quả: Hoàng_Trọng_Nghĩa
Khi nào ta chắc chắn 100% rằng hàm mình viết ra chỉ hoạt động trên Excel thì mới dùng WorksheetFunction Nghĩa à
Hàm ta viết ra có thể dùng cho Excel, cũng có thể dùng cho Word, Access.. thậm chỉ là trên VB ---> WorksheetFunction.Trim ở đâu ra?
Còn nếu hàm này viết để xài trên Excel thì thật sự không cần thiết ---> Hàm TRIM trên bảng tính để làm cái gì?
(Từ khi biết nhiều về VBA, tôi rất hạn chế dùng WorksheetFunction)
 
Upvote 0
1. Bên trái
n = Len(chuoi)
While Mid(chuoi, 1, 1) = " "
chuoi = Mid(chuoi, 2, n - 1)
wend

Chỗ nào làm cho n giảm từ 8 còn 7?
May là chỗ này dùng hàm mid, tham số thứ 3 có là 1 ngàn cũng tính được.<<<

Cho chuỗi là " abc" --> có 3 khảng trắng phía trước
Em nghĩ đoạn này chạy như sau:
vòng 1: phát hiện 1 khoảng trắng bên trái-->chuoi = " abc" --->còn 2 khoảng trắng bên trái
vòng 2: phát hiện 1 khoảng trắng bên trái-->chuoi = " abc" --->còn 1 khoảng trắng bên trái
vòng 3: phát hiện 1 khoảng trắng bên trái-->chuoi = "abc" --->không còn khoảng trắng bên trái
chỉ chạy 3 vòng
 
Upvote 0
/-)ó là bạn nghỉ, nhưng máy nó có làm như bạn nghỉ không?

Em nghĩ đoạn này chạy như sau:
vòng 1: phát hiện 1 khoảng trắng bên trái-->chuoi = " abc" --->còn 2 khoảng trắng bên trái
vòng 2: phát hiện 1 khoảng trắng bên trái-->chuoi = " abc" --->còn 1 khoảng trắng bên trái
vòng 3: phát hiện 1 khoảng trắng bên trái-->chuoi = "abc" --->không còn khoảng trắng bên trái
chỉ chạy 3 vòng

Bạn cho rằng chạy 3 vòng là thoát khỏi vòng lặp ư?

Vậy trước dòng lệnh Wend gì, gì đó bạn thêm dùm tui dòng lệnh sau xem nó sẽ đưa ra thông tin giao tiếp với bạn ra sao?:
Mã:
 MsgBox Chuoi,, Len(Chuoi)
 
Upvote 0
Khi nào ta chắc chắn 100% rằng hàm mình viết ra chỉ hoạt động trên Excel thì mới dùng WorksheetFunction Nghĩa à
Hàm ta viết ra có thể dùng cho Excel, cũng có thể dùng cho Word, Access.. thậm chỉ là trên VB ---> WorksheetFunction.Trim ở đâu ra?
Còn nếu hàm này viết để xài trên Excel thì thật sự không cần thiết ---> Hàm TRIM trên bảng tính để làm cái gì?
(Từ khi biết nhiều về VBA, tôi rất hạn chế dùng WorksheetFunction)

Đúng là mục 2, nếu ai phản biện thì em sẽ nói là hàm của Thầy NDU là chuẩn rồi, không cần thêm nữa!

Nhưng lắm lúc lại Trim trong Form thì làm vậy cho lẹ, hihihi
 
Upvote 0
Nhưng lắm lúc lại Trim trong Form thì làm vậy cho lẹ, hihihi
Thì tôi nói rõ rồi mà: Nếu code làm việc trên Excel thì ta WorksheetFunction không có vấn đề
Ở đây người ta đã viết hẳn 1 hàm cắt bỏ khoảng trắng, bạn nghĩ xem hàm này sẽ dùng ở đâu?
Tôi nghĩ đến 2 trường hợp:
- Một là hàm này viết để xài cho ứng dụng khác (Excel không cần đến hàm này)
- Hai là hàm này dùng để làm.. bài tập
===> Dù là trường hợp nào thì dùng WorksheetFunction cũng rất... kỳ cục! Tôi suy luận hợp lý chứ?
 
Upvote 0
hihi sẵn nhắc tới form, thì thầy NDU với bạn Minhthien cho mình xin cái cấu trúc của form với. Có phải các hàm + sub trong form chạy với sự kết hợp lẫn nhau ( cái này gọi cái kia) hay là cần có 1 "anh đại", nơi có tất cả các "em út" được gọi. MOng nhận dc sự giúp đỡ. Chân thành cảm ơn và hậu tạ...thêm nhiều câu hỏi ngớ ngẩn khác :D
 
Upvote 0
hihi sẵn nhắc tới form, thì thầy NDU với bạn Minhthien cho mình xin cái cấu trúc của form với. Có phải các hàm + sub trong form chạy với sự kết hợp lẫn nhau ( cái này gọi cái kia) hay là cần có 1 "anh đại", nơi có tất cả các "em út" được gọi. MOng nhận dc sự giúp đỡ. Chân thành cảm ơn và hậu tạ...thêm nhiều câu hỏi ngớ ngẩn khác :D

Tôi chẳng biết bạn hỏi xin cái cấu trúc gì đó của Form, tuy nhiên theo hiểu biết của tôi, cũng như các control khác, Form cũng là 1 control, code/ macro là thủ tục để điều khiển, hàm là chức năng tính toán xuất ra kết quả nào đó. Bản thân Form có các sự kiện, khi sự kiện được kích hoạt thì sẽ thực hiện các thủ tục mà ta định ra. Cái nào điều khiển cái nào là do thủ tục của ta quy định, dĩ nhiên phải theo khuôn khổ của "Anh Bill", chứ không phải do anh "đại" hay anh "tiểu" gì đó quy định.

Nếu bạn muốn tìm hiểu thêm, bạn gửi một file giả định nào đó lên và yêu cầu những gì thực hiện trên form đó, mọi người hướng dẫn trực tiếp trên đó sẽ dễ hiểu hơn.
 
Upvote 0
Web KT

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

Back
Top Bottom