lặp từ đầu chuỗi đến cuối chuỗi trong ô

Liên hệ QC

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 ?
 
N­hư thế này cũng được

Mã:
Sub Test()
Dim i
For i = 1 To [a1].Characters.Count
MsgBox Range("a1").Characters(i, 1).Text
Next
End Sub
 
Upvote 0
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"
 
Upvote 0

Cũng không khó, nhưng tôi không biết mục đích của bạn là để làm gì.

PHP:
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

Bạn test lại nó như sau:
PHP:
Sub Kegiaumat()
  MsgBox ChuyenSauKyTuO("Toi khong phai la ke giau mat so.1")
End Sub
 
Upvote 0
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"
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ự
PHP:
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
Đương nhiên còn nhiều cách khác cho tốc độ nhanh hơn nhưng đương nhiên code sẽ phức tạp hơn
 
Upvote 0
Upvote 0
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ế.

Đú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???
 
Upvote 0
Đú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???
Vậy thì sửa câu lệnh thành 2 câu lệnh này:
PHP:
Selection.Replace What:="O?", Replacement:="O", LookAt:=xlPart, MatchCase:=True
Selection.Replace What:="o?", Replacement:="o", LookAt:=xlPart, MatchCase:=True
 
Upvote 0
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ế.

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
 
Upvote 0
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
Tóm lại là như vầy:
PHP:
With Selection
    .Replace "O?", "O", 2, , True
    .Replace "o?", "o", 2, , True
End With
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ỉ?
Như vậy đúng là yêu cầu của tác giả đấy chứ gì nữa?
 
Upvote 0
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)
PHP:
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
 
Lần chỉnh sửa cuối:
Upvote 0
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)
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.
Kiểu như vầy nè: Textbox1 chứa chuỗi cần thay thế, CommandButton1 để chạy code thay thế. Code cho CommandButton1 như sau:
PHP:
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
 

File đính kèm

Upvote 0
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
 
Lần chỉnh sửa cuối:
Upvote 0
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

Hay quá SƯ PHỤ ơi! Em chuyển thành Hàm lẹ hơn nhiều! Cám ơn SƯ PHỤ!
PHP:
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
 
Lần chỉnh sửa cuối:
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom