Đếm ?từ trong chữ

  • Thread starter Thread starter ThuNghi
  • Ngày gửi Ngày gửi
Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Tôi lập một hàm cho số từ cần đếm trong 1 Cell như sau:
Các bạn giải thích hộ sai chỗ nào mà nó o chịu chạy.
Cám ơn nhiều
Mã:
Private Function DemTu(Chu As String, Tu As String)
Dim j, count As Integer
     Text1 = Trim(Chu)
     Text2 = Trim(Tu)
     Dem = 0
     For j = 1 To Len(Text1) - 1
     If Worksheet.Function.Find(Text1, Text2, j) > 0 Then
     Dem = Dem + 1
     End If
    Next
  Exit For
  DemTu = Dem
End Function
 
Ý tưởng về giải thuật của bác là thế nào ấy nhỉ, em đọc mà không hiểu được. Nếu em hiểu theo thì giải thuật của bác cũng chưa đúng với yêu cầu mà bác đưa ra.
Riêng về phần bác bảo là hàm không chạy được thì em phát hiện ra 2 nguyên nhân:
1. Dư một cái "Exit for"
2. worksheet.function khong chạy được, cái này không có mà đúng ra là worksheetfunction
Tuy nhiên trong môi trường VBA có một hàm mạnh hơn hàm find trong Excel là hàm instr
Bác thử xem lại những điểm em nói xem sao đi ạh
 
Upvote 0
Mình cũng xin góp ý như sau:
Ngoài các lỗi như OverAC chỉ thì bạn cần xem lại cú pháp của hàm Find trong MS Excel (bạn cần phải đảo lại hai thông số đấu cho nhau - nếu không hàm find sẽ trả về #VALUE!)
Cú pháp đúng phải là:
WorksheetFunction.Find(Text2, Text1, j) (tìm kiếm Text2 trong Text1)
Và khi đã thay đổi đúng cú pháp của hàm find rồi thì bạn cần phải đặt bẫy lỗi để tránh trả về giá trị #Value....
Bạn dùng hàm For như vậy là bị lặp lại rất nhiều lần
Bạn sửa lại như sau:
Mã:
Public Function DemTu1(chu As String, tu As String)
On Error Resume Next
Dim j As Integer, dem As Integer
Dim Text1 As String, Text2 As String
Text1 = Trim(chu)
Text2 = Trim(tu)
dem = 0
Dim KQ
For j = 1 To Len(Text1) - Len(Text2) + 1
    Err.Clear
    'Chu y ham Find co phan biet chu Hoa va chu thuong
    KQ = WorksheetFunction.Find(Text2, Mid(Text1, j, Len(Text2)))
    If Err.Number = 0 Then dem = dem + 1
Next j
'
DemTu1 = dem
End Function
Và thêm một đoạn code nữa để bạn tham khảo
Mã:
Public Function DemTu_GPE(chu As String, tu As String) As Integer
Dim dem As Integer
Dim i As Integer
'
For i = 1 To Len(chu) - Len(tu) + 1
    'Khong phan biet chu HOA va chu thuong
    If UCase(Mid(chu, i, Len(tu))) = UCase(tu) Then
        dem = dem + 1
    End If
Next i
'
DemTu_GPE = dem
End Function
Chú ý:
Kết quả hai hàm trên sẽ khác nhau vì một hàm phân biệt chữ Hoa và chữ thường, một hàm thì không!
 
Upvote 0
Bạn giải thích hộ, phần Bold
Dim KQ
For j = 1 To Len(Text1) - Len(Text2) + 1
Err.Clear
KQ = WorksheetFunction.Find(Text2, Mid(Text1, j, Len(Text2)))
If Err.Number = 0 Then dem = dem + 1
Cách thứ 2 hay hơn nhiều
Học VBA khó quá, nhất là chỉ "xào nấu" mà chưa có căn bản
Xin cám ơn
 
Upvote 0
Em thấy cách dùng hàm Find của anh nvson có vẻ khó hiểu.
Em dùng Instr thay cho Find và cách làm của em như sau:
Mã:
Private Function DemTu(chu As String, tu As String)
Dim j, count As Integer
    text1 = Trim(chu)
    text2 = Trim(tu)
    dem = 0
    Do
        If InStr(1, text1, text2) > 0 Then
            dem = dem + 1
            text1 = Right(text1, Len(text1) - InStr(1, text1, text2) - Len(text2) + 1)
        Else
            Exit Do
        End If
    Loop
    DemTu = dem
End Function
 
Upvote 0
Sao biến khai báo lại không xài, mà ngược lại vậy các bạn?

Theo mình thì như vầy:
Mã:
[b]Private Function DemTu(chu As String, tu As String) As Integer[/b]
[color="Blue"]'Dim j, count As Integer [/color]
    chu = Trim(chu):            tu = Trim(tu)
[color="Blue"]'    dem = 0 [/color]
    Do
        If InStr(1, chu, tu) > 0 Then
            demTu = demTu + 1
            chu = Right(chu, Len(chu) - InStr(1, chu, tu) - Len(tu) + 1)
        Else
            Exit Do
        End If
    Loop
[color="Blue"]'    DemTu = dem[/color][b]
End Function[/b]
 
Upvote 0
Web KT

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

Back
Top Bottom