kegiaumat055
Thành viên chính thức
- Tham gia
- 22/4/11
- Bài viết
- 91
- Được thích
- 2
Để lặp từ đầu chuỗi đến cuối chuỗi trong một ô ( ví dụ A1) thì code vba như thế nào vậy các bạn ?
Thì vầyĐể lặp từ đầu chuỗi đến cuối chuỗi trong một ô ( ví dụ A1) thì code vba như thế nào vậy các bạn ?
Dim i as Long
For i = 1 to Len(Range("A1"))
MsgBox Mid(Range("A1").Value, i,1)
Next
chữ "o" bạn à .
Function ChuyenSauKyTuO(chuoi As String) As String
Dim stt As Long, Ham
Set Ham = Application.WorksheetFunction
chuoi = " " & Ham.Trim(chuoi)
stt = Len(chuoi)
If stt > 1 Then
Do
stt = InStrRev(chuoi, "o", stt)
chuoi = Ham.Replace(chuoi, stt + 1, 1, "")
stt = stt - 1
Loop While stt > 0
ChuyenSauKyTuO = chuoi
End If
End Function
Sub Kegiaumat()
MsgBox ChuyenSauKyTuO("Toi khong phai la ke giau mat so.1")
End Sub
Có rất nhiều cách và cách đơn giản là duyệt từng ký tự, nếu tìm thấy chữ "o" thì nhảy qua 1 ký tựGiờ trong ô A1 có 1 chuỗi :" hello everybody"
Giờ mình tìm từ đầu đến cuối chuỗi, cứ thấy ký tự: "o" là sẽ xóa ký tự đằng sau nó thì mình phải làm như thế nào ?
Kết quả chuỗi trên sau khi chạy: "helloeveryboy"
Sub Test()
Dim i As Long, Tmp As String, Text As String
Text = Range("A1").Value
Do
i = i + 1
Tmp = Tmp & Mid(Text, i, 1)
If Right(Tmp, 1) = "o" Then i = i + 1
Loop Until i >= Len(Text)
MsgBox Tmp
End Sub
Chỉ cần như vầy là đủ: Selection.Replace What:="o?", Replacement:="o", LookAt:=xlPartchữ "o" bạn à .
Chỉ cần như vầy là đủ: Selection.Replace What:="o?", Replacement:="o", LookAt:=xlPart
Chỗ Selection có thể thay bởi Cells, [A1], [A:A], [1:1], Range("A1:B10") hay một vùng nào đó cho phù hợp với thực tế.
Vậy thì sửa câu lệnh thành 2 câu lệnh này:Đúng, lúc đầu tôi cũng làm vậy, nhưng xét lại, khi O (viết hoa) và o (viết thường) sẽ như thế nào???
Selection.Replace What:="O?", Replacement:="O", LookAt:=xlPart, MatchCase:=True
Selection.Replace What:="o?", Replacement:="o", LookAt:=xlPart, MatchCase:=True
Chỉ cần như vầy là đủ: Selection.Replace What:="o?", Replacement:="o", LookAt:=xlPart
Chỗ Selection có thể thay bởi Cells, [A1], [A:A], [1:1], Range("A1:B10") hay một vùng nào đó cho phù hợp với thực tế.
Sub Macro1()
Selection.Replace "o?", "o", 2
End Sub
Tóm lại là như vầy:Sao không viết thế này cho gọn (không phân biệt O hay o)
Mã:Sub Macro1() Selection.Replace "o?", "o", 2 End Sub
With Selection
.Replace "O?", "O", 2, , True
.Replace "o?", "o", 2, , True
End With
Như vậy đúng là yêu cầu của tác giả đấy chứ gì nữa?Các cách đều hay, nhưng nếu chuỗi là những chữ O thì sao ta? Ví dụ "OOOOOOOOOOOOooooooo", chắc ra "O" là cuối cùng quá nhỉ?
Function ChuyenSauKyTuO(chuoi As String) As String
Dim stt As Long, Ham
Set Ham = Application.WorksheetFunction
chuoi = " " & Ham.Trim(chuoi)
stt = Len(chuoi)
If stt > 1 Then
Do
stt = InStrRev(chuoi, "o", stt)
chuoi = Ham.Replace(chuoi, stt + 1, 1, "")
stt = stt - 1
Loop While stt > 0
End If
chuoi = " " & chuoi
stt = Len(chuoi)
If stt > 1 Then
Do
stt = InStrRev(chuoi, "O", stt)
chuoi = Ham.Replace(chuoi, stt + 1, 1, "")
stt = stt - 1
Loop While stt > 0
End If
ChuyenSauKyTuO = chuoi
End Function
Vậy thì ta "ăn gian" một xíu: Gán giá trị của chuỗi vào cell --> thay thế trên cell --> gán kết quả ngược lại cho chuỗi.Cái Function của mình sau khi test vẫn không phân biệt được Hoa hay Thường (ẹc... ẹc...), tuy nhiên nếu mình Do... Loop 2 lần thì OK, như vậy thì nó tổng quát hơn. Nếu với Selection.Replace "o?", "o", 2 thì không thể làm trên Form hay đại loại thứ gì khác ngoài thao tác trên Sheet (ẹc... ẹc... luôn).
(mình vẫn đang học vòng lặp nên code còn lủng củng, xin được các Anh, Chị và các Bạn rút gọn lại dùm)
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
With Sheet1.[A1]
.Value = TextBox1
.Replace "O?", "O", 2, , True
.Replace "o?", "o", 2, , True
TextBox1 = .Value
.ClearContents
End With
Application.ScreenUpdating = True
End Sub
Private Sub TextBox1_AfterUpdate()
For i = 1 To Len(TextBox1)
tmp = tmp & Mid(TextBox1, i, 1)
If UCase(Mid(TextBox1, i, 1)) = "O" Then i = i + 1
Next
TextBox2 = tmp
End Sub
Vói textbox trên form: 1 vòng lặp, không dùng cell trung gian:
PHP:Private Sub TextBox1_AfterUpdate() For i = 1 To Len(TextBox1) tmp = tmp & Mid(TextBox1, i, 1) If UCase(Mid(TextBox1, i, 1)) = "O" Then i = i + 1 Next TextBox2 = tmp End Sub
Function ThayThe(chuoi As String) As String
Dim i As Long, tmp As String
For i = 1 To Len(chuoi)
tmp = tmp & Mid(chuoi, i, 1)
If UCase(Mid(chuoi, i, 1)) = "O" Then i = i + 1
Next
ThayThe = Trim(tmp)
End Function