Cần giúp viết Code xóa chữ "hoàn ứng" tại vị trí thứ 5 và thứ 6 tính từ trái qua phải (1 người xem)

Người dùng đang xem chủ đề này

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
934
Được thích
240
Giới tính
Nam
Cần giúp viết Code xóa chữ "hoàn ứng" ở vị trí thứ 5 và thứ 6 tính từ trái qua phải

Chào các bạn GPE!
Nhờ các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Có Code nào xóa
chữ "hoàn ứng" tại vị trí thứ 5 và thứ 6 tính từ trái qua phải trong ô ở cột 4 (Xóa trực tiếp trong ô tại cột 4)?
Ví dụ:
- Ô D10 có
chữ "hoàn ứng" tại vị trí thứ 5 và thứ 6 tính từ trái qua phải trong ô => Đủ điều kiện để xóa.
- Ô D11 có chữ "hoàn ứng" tại vị trí thứ 6 và thứ 7 tính từ trái qua phải trong ô => Không đủ điều kiện để xóa.
Mong các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.
 

File đính kèm

  • 1.xls
    1.xls
    24.5 KB · Đọc: 18
Lần chỉnh sửa cuối:
Mình viết cho bạn macro này để thử xài xem sao:

PHP:
Option Explicit
Sub XoaHoanUng()
 Dim Rng As Range, sRng As Range, rRg As Range
 Dim fAdd As String, HUng As String, StrC As String
 Dim VTr As Byte
 Set Rng = Range([d5], [d5].End(xlDown))
 HUng = Range("HUng").Value
 Set rRg = [d65500]
 Set sRng = Rng.Find(HUng, , xlFormulas, xlPart)
 If Not sRng Is Nothing Then
    fAdd = sRng.Address
    Do
        VTr = InStr(1, sRng.Value, HUng) + 2
        If So5(Left(sRng.Value, VTr)) Then
            Set rRg = Union(sRng, rRg)
1           sRng.Interior.ColorIndex = 36
        End If
        Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> fAdd
 End If
2 Exit Sub
 For Each sRng In rRg
    'Cau Lenh Thay Chuoi Viét Tai Day:'
 Next sRng
End Sub
Mã:
[B]Function So5(StrC As String) As Boolean
[/B] Dim Tmp As String
 
 Tmp = Replace(StrC, " ", "")
 If Len(StrC) - Len(Tmp) = 4 Then So5 = True
[B]End Function[/B]

Hướng dẫn cách dùng:

B1: Lấy 1 ô trống nào đó thuộc vùng sâu vùng xa của trang tính& ta nhập vô nó chuỗi "hoàn ứng" & gán cho nó cái tên cúng cơm là "HUng"
B2: Chạy macro & kiểm tra số liệu theo màu
Khi macro hoàn thành 1 lần chạy, lúc này nó sẽ tô màu các ô mà bạn cần thay thế; (Lúc này macro chưa làm công việc thay thế)
B3 Vô hiệu hóa 2 dòng lệnh & viết tiếp 1 dòng lệnh 1 khi đã kiểm tra đúng iêu cầu của bạn:
Khi đã kiểm & thấy đúng là những ô có màu cần thay (xóa) cụm từ thì:
3.1 Vô hiệu hóa 2 dòng lệnh có mang số
3.2 Tham khảo từ hàm tự tạo để thay cụm từ cần thiết bằng chuỗi rỗng

Chúc bạn thành công ngay cả việc mình chưa đưa file lên.
 
Upvote 0
Mình viết cho bạn macro này để thử xài xem sao:

PHP:
Option Explicit
Sub XoaHoanUng()
 Dim Rng As Range, sRng As Range, rRg As Range
 Dim fAdd As String, HUng As String, StrC As String
 Dim VTr As Byte
 Set Rng = Range([d5], [d5].End(xlDown))
 HUng = Range("HUng").Value
 Set rRg = [d65500]
 Set sRng = Rng.Find(HUng, , xlFormulas, xlPart)
 If Not sRng Is Nothing Then
    fAdd = sRng.Address
    Do
        VTr = InStr(1, sRng.Value, HUng) + 2
        If So5(Left(sRng.Value, VTr)) Then
            Set rRg = Union(sRng, rRg)
1           sRng.Interior.ColorIndex = 36
        End If
        Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> fAdd
 End If
2 Exit Sub
 For Each sRng In rRg
    'Cau Lenh Thay Chuoi Viét Tai Day:'
 Next sRng
End Sub
Mã:
[B]Function So5(StrC As String) As Boolean
[/B] Dim Tmp As String
 
 Tmp = Replace(StrC, " ", "")
 If Len(StrC) - Len(Tmp) = 4 Then So5 = True
[B]End Function[/B]

Hướng dẫn cách dùng:

B1: Lấy 1 ô trống nào đó thuộc vùng sâu vùng xa của trang tính& ta nhập vô nó chuỗi "hoàn ứng" & gán cho nó cái tên cúng cơm là "HUng"
B2: Chạy macro & kiểm tra số liệu theo màu
Khi macro hoàn thành 1 lần chạy, lúc này nó sẽ tô màu các ô mà bạn cần thay thế; (Lúc này macro chưa làm công việc thay thế)
B3 Vô hiệu hóa 2 dòng lệnh & viết tiếp 1 dòng lệnh 1 khi đã kiểm tra đúng iêu cầu của bạn:
Khi đã kiểm & thấy đúng là những ô có màu cần thay (xóa) cụm từ thì:
3.1 Vô hiệu hóa 2 dòng lệnh có mang số
3.2 Tham khảo từ hàm tự tạo để thay cụm từ cần thiết bằng chuỗi rỗng

Chúc bạn thành công ngay cả việc mình chưa đưa file lên.
Cảm ơn bạn đã nhiệt tình giúp đỡ. Nghe có vẻ phức tạp nhi?.
Tôi đã làm đến đoạn 3.2 ở trên, nhưng chưa hiểu phải làm tiếp sao nữa, cụ thể:
PHP:
 'Cau Lenh Thay Chuoi Viét Tai Day:'
Mã:
3.2 Tham khảo từ hàm tự tạo để thay cụm từ cần thiết bằng chuỗi rỗng
=> Mong bạn nói rõ hơn (Tôi đầu đất nên chậm hiểu, bạn thông cảm.)
 
Upvote 0
[thongbao]
sRng.Value = Replace(sRng.Value, HUng, "")
[/thongbao]
 
Upvote 0
Chào các bạn GPE!
Nhờ các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Có Code nào xóa
chữ "hoàn ứng" tại vị trí thứ 5 và thứ 6 tính từ trái qua phải trong ô ở cột 4 (Xóa trực tiếp trong ô tại cột 4)?
Ví dụ:
- Ô D10 có
chữ "hoàn ứng" tại vị trí thứ 5 và thứ 6 tính từ trái qua phải trong ô => Đủ điều kiện để xóa.
- Ô D11 có chữ "hoàn ứng" tại vị trí thứ 6 và thứ 7 tính từ trái qua phải trong ô => Không đủ điều kiện để xóa.
Mong các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.
Bài này chỉ cần 1 vòng For duyệt từ trên xuống dưới
Dùng hàm Split tách chuỗi đang duyệt
Dùng If để xét dk là có thể gán kết quả, code cực ngắn gọn.
 
Upvote 0
Nếu bạn luôn luôn biết cặp từ cần kiếm là "hoàn ứng" thì dùng giải thuật của bài trên (bài #5)
Cách split để định vị trí từ là cách giản dị nhất.
Tuy nhiên nếu cụm từ có thể thay đổi (3 từ chẳng hạn) thì bạn phải thay cụm từ kia bằng một nhóm ký tự đăc biệt trước khi thực hiện.

Có một cách khác là dùng RegEx để tìm và thay thế. Tôi lười viết code này lắm vì RegEx hơi khó chịu với Unicode.

Có một cách tổng quát hơn. Tôi viết cho bạn hàm "xoá từ đơn giản". banj dùng một vòng lặp và Find cụm từ, cứ ô nào tìm được thì gọi hàm này ra để xoá. Hàm này gọi là đơn giản vì nó sẽ trim chuỗi của bạn. Không cho trim chuõi viết rắc rối lắm. Toi không có thì giờ.

Mã:
Function XoaTuDonGian(ByVal str As String, ByVal tu As String, ByVal p As Integer) As String
[COLOR=#008000]' hàm xoá cụm từ "tu" xuất hiện ở vị trí p trong chuỗi "str"
' các cụm xuất hiện ở vi trí khác p sẽ được giữ nguyên
' nếu có 2 cụm đi liền nhau, và sau khi xoá, cụm ở vị trí p+1 trở thành p thì ráng chịu, không xoá 2 lần
[/COLOR]XoaTuDonGian = str
str = " " & Application.Trim(str) & " "[COLOR=#008000] ' chuẩn các chuõi để so sánh[/COLOR]
tu = " " & Application.Trim(tu) & " "
vitri = InStr(str, tu) [COLOR=#008000]' vị trí tính theo ký tự[/COLOR]
Do While vitri
Select Case vitri - Len(Replace(Left(str, vitri - 1), " ", "")) [COLOR=#008000]' vị trí tính theo từ[/COLOR]
Case Is > p [COLOR=#008000]' quá vị trí muốn tìm[/COLOR]
    Exit Function
Case p [COLOR=#008000]' đúng vị trí[/COLOR]
    Mid(str, vitri) = Space(Len(tu))[COLOR=#008000] ' xoá cụm từ[/COLOR]
    XoaTuDonGian = Application.Trim(str)
    Exit Function
Case Else [COLOR=#008000]' chưa tới vị trí, tiếp tục tìm[/COLOR]
    vitri = InStr(vitri + 1, str, tu)
End Select
Loop
End Function
 
Upvote 0
Chào các bạn GPE!
Nhờ các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Có Code nào xóa
chữ "hoàn ứng" tại vị trí thứ 5 và thứ 6 tính từ trái qua phải trong ô ở cột 4 (Xóa trực tiếp trong ô tại cột 4)?
Ví dụ:
- Ô D10 có
chữ "hoàn ứng" tại vị trí thứ 5 và thứ 6 tính từ trái qua phải trong ô => Đủ điều kiện để xóa.
- Ô D11 có chữ "hoàn ứng" tại vị trí thứ 6 và thứ 7 tính từ trái qua phải trong ô => Không đủ điều kiện để xóa.
Mong các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.

Bạn thử dùng code này xem:

Mã:
Sub Xoatu()    
    Dim rCells As Range, rRng As Range
    Dim i As Long, n As Long, lPos As Long
    Dim sReplacedStr As String, sRepStr As String, sStr As String, sTmp As String
    
    Set rRng = Sheet1.Range(Sheet1.Range("D6"), Sheet1.Range("D65000").End(xlUp))
    sReplacedStr = Sheet1.Range("H1").Value
    sRepStr = Sheet1.Range("I1").Value
    
    For Each rCells In rRng
        sStr = Application.Trim(rCells.Value)
        lPos = InStr(1, sStr, sReplacedStr)
        If lPos Then
            sTmp = Left(sStr, lPos - 1)
            n = 0
            For i = 1 To Len(sTmp)
                If Mid(sTmp, i, 1) = " " Then
                    n = n + 1
                End If
            Next i
            If n = 4 Then rCells = Application.Replace(sStr, lPos, Len(sReplacedStr) + 1, sRepStr)
        End If
    Next rCells
    
End Sub
 

File đính kèm

Upvote 0
Bạn thử dùng code này xem:

Mã:
Sub Xoatu()    
    Dim rCells As Range, rRng As Range
    Dim i As Long, n As Long, lPos As Long
    Dim sReplacedStr As String, sRepStr As String, sStr As String, sTmp As String
    
    Set rRng = Sheet1.Range(Sheet1.Range("D6"), Sheet1.Range("D65000").End(xlUp))
    sReplacedStr = Sheet1.Range("H1").Value
    sRepStr = Sheet1.Range("I1").Value
    
    For Each rCells In rRng
        sStr = Application.Trim(rCells.Value)
        lPos = InStr(1, sStr, sReplacedStr)
        If lPos Then
            sTmp = Left(sStr, lPos - 1)
            n = 0
            For i = 1 To Len(sTmp)
                If Mid(sTmp, i, 1) = " " Then
                    n = n + 1
                End If
            Next i
            If n = 4 Then rCells = Application.Replace(sStr, lPos, Len(sReplacedStr) + 1, sRepStr)
        End If
    Next rCells
    
End Sub
Tính mình đơn giản nên code cũng đơn giản theo. Không biết code có lỗi gì không.
Không Trim vì cứ coi như chủ thớt có dữ liệu chuẩn và không cần trim chuỗi kết quả
PHP:
Sub Xoa()
Dim data(), Dk, i, Tem
data = Range("D6", [D65536].End(3)).Value
Dk = "ho" & ChrW(224) & "n" & ChrW(7913) & "ng"
For i = 1 To UBound(data)
   Tem = Split(data(i, 1), Space(1))
   If Tem(4) & Tem(5) = Dk Then
      Tem(4) = Empty: Tem(5) = Empty
      data(i, 1) = Join(Tem)
   End If
Next
[F6].Resize(i - 1) = data
End Sub
Nếu Trim thì nhét thêm hắn vào
PHP:
Sub Xoa()
Dim data(), Dk, i, Tem
data = Range("D6", [D65536].End(3)).Value
Dk = "ho" & ChrW(224) & "n" & ChrW(7913) & "ng"
For i = 1 To UBound(data)
   Tem = Split(Application.Trim(data(i, 1)), Space(1))
   If Tem(4) & Tem(5) = Dk Then
      Tem(4) = Empty: Tem(5) = Empty
      data(i, 1) = Application.Trim(Join(Tem))
   End If
Next
[F6].Resize(i - 1) = data
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử dùng code này xem:

Mã:
Sub Xoatu()    
    Dim rCells As Range, rRng As Range
    Dim i As Long, n As Long, lPos As Long
    Dim sReplacedStr As String, sRepStr As String, sStr As String, sTmp As String
    
    Set rRng = Sheet1.Range(Sheet1.Range("D6"), Sheet1.Range("D65000").End(xlUp))
    sReplacedStr = Sheet1.Range("H1").Value
    sRepStr = Sheet1.Range("I1").Value
    
    For Each rCells In rRng
        sStr = Application.Trim(rCells.Value)
        lPos = InStr(1, sStr, sReplacedStr)
        If lPos Then
            sTmp = Left(sStr, lPos - 1)
            n = 0
            For i = 1 To Len(sTmp)
                If Mid(sTmp, i, 1) = " " Then
                    n = n + 1
                End If
            Next i
            If n = 4 Then rCells = Application.Replace(sStr, lPos, Len(sReplacedStr) + 1, sRepStr)
        End If
    Next rCells
    
End Sub
Sao tôi chạy Code mà chả thấy gì nhỉ?
Tôi Dowload File rồi mà chả thấy Code gì cả. Giống như File ở #1 (Không có gì bên trong cả, như ban đầu lúc Up File).
 
Upvote 0
Tính mình đơn giản nên code cũng đơn giản theo. Không biết code có lỗi gì không.
PHP:
Sub Xoa()
Dim data(), Dk, i, Tem
data = Range("D6", [D65536].End(3)).Value
Dk = "ho" & ChrW(224) & "n" & ChrW(7913) & "ng"
For i = 1 To UBound(data)
   Tem = Split(data(i, 1), Space(1))
   If Tem(4) & Tem(5) = Dk Then
      Tem(4) = Empty: Tem(5) = Empty
      data(i, 1) = Join(Tem)
   End If
Next
[F6].Resize(i - 1) = data
End Sub

Cần thêm phần
If Ubound(Tem) >= 5 Then
...
End If
Để tránh bị crash.
 
Upvote 0
Sao tôi chạy Code mà chả thấy gì nhỉ?
Tôi Dowload File rồi mà chả thấy Code gì cả. Giống như File ở #1 (Không có gì bên trong cả, như ban đầu lúc Up File).

Lạ nhỉ, mình thấy nó chạy bình thường mà. Hay bạn down nhầm file nào chăng ?
 
Upvote 0
Cần thêm phần
If Ubound(Tem) >= 5 Then
...
End If
Để tránh bị crash.
Mình có cái tật xấu thấy gớm là chưa lần nào viết 1 đoạn code cho hoàn thiện.
...................
Phải chi hàm Filter mà làm việc được với Unicode thì bài này còn ngắn nữa...
 
Upvote 0
Tính mình đơn giản nên code cũng đơn giản theo. Không biết code có lỗi gì không.
Không Trim vì cứ coi như chủ thớt có dữ liệu chuẩn và không cần trim chuỗi kết quả
PHP:
Sub Xoa()
Dim data(), Dk, i, Tem
data = Range("D6", [D65536].End(3)).Value
Dk = "ho" & ChrW(224) & "n" & ChrW(7913) & "ng"
For i = 1 To UBound(data)
   Tem = Split(data(i, 1), Space(1))
   If Tem(4) & Tem(5) = Dk Then
      Tem(4) = Empty: Tem(5) = Empty
      data(i, 1) = Join(Tem)
   End If
Next
[F6].Resize(i - 1) = data
End Sub
Nếu Trim thì nhét thêm hắn vào
PHP:
Sub Xoa()
Dim data(), Dk, i, Tem
data = Range("D6", [D65536].End(3)).Value
Dk = "ho" & ChrW(224) & "n" & ChrW(7913) & "ng"
For i = 1 To UBound(data)
   Tem = Split(Application.Trim(data(i, 1)), Space(1))
   If Tem(4) & Tem(5) = Dk Then
      Tem(4) = Empty: Tem(5) = Empty
      data(i, 1) = Application.Trim(Join(Tem))
   End If
Next
[F6].Resize(i - 1) = data
End Sub
Tôi muốn xóa trực tiếp tại cột D luôn. Tôi thử sửa
PHP:
[F6].Resize(i - 1) = data
thành
PHP:
[D6].Resize(i - 1) = data
mà chả thấy gì cả. Mong bạn chỉ rõ với ạ.
 
Upvote 0
Nếu bạn luôn luôn biết cặp từ cần kiếm là "hoàn ứng" thì dùng giải thuật của bài trên (bài #5)
Cách split để định vị trí từ là cách giản dị nhất.
Tuy nhiên nếu cụm từ có thể thay đổi (3 từ chẳng hạn) thì bạn phải thay cụm từ kia bằng một nhóm ký tự đăc biệt trước khi thực hiện.

Có một cách khác là dùng RegEx để tìm và thay thế. Tôi lười viết code này lắm vì RegEx hơi khó chịu với Unicode.

Có một cách tổng quát hơn. Tôi viết cho bạn hàm "xoá từ đơn giản". banj dùng một vòng lặp và Find cụm từ, cứ ô nào tìm được thì gọi hàm này ra để xoá. Hàm này gọi là đơn giản vì nó sẽ trim chuỗi của bạn. Không cho trim chuõi viết rắc rối lắm. Toi không có thì giờ.

Mã:
Function XoaTuDonGian(ByVal str As String, ByVal tu As String, ByVal p As Integer) As String
[COLOR=#008000]' hàm xoá cụm từ "tu" xuất hiện ở vị trí p trong chuỗi "str"
' các cụm xuất hiện ở vi trí khác p sẽ được giữ nguyên
' nếu có 2 cụm đi liền nhau, và sau khi xoá, cụm ở vị trí p+1 trở thành p thì ráng chịu, không xoá 2 lần
[/COLOR]XoaTuDonGian = str
str = " " & Application.Trim(str) & " "[COLOR=#008000] ' chuẩn các chuõi để so sánh[/COLOR]
tu = " " & Application.Trim(tu) & " "
vitri = InStr(str, tu) [COLOR=#008000]' vị trí tính theo ký tự[/COLOR]
Do While vitri
Select Case vitri - Len(Replace(Left(str, vitri - 1), " ", "")) [COLOR=#008000]' vị trí tính theo từ[/COLOR]
Case Is > p [COLOR=#008000]' quá vị trí muốn tìm[/COLOR]
    Exit Function
Case p [COLOR=#008000]' đúng vị trí[/COLOR]
    Mid(str, vitri) = Space(Len(tu))[COLOR=#008000] ' xoá cụm từ[/COLOR]
    XoaTuDonGian = Application.Trim(str)
    Exit Function
Case Else [COLOR=#008000]' chưa tới vị trí, tiếp tục tìm[/COLOR]
    vitri = InStr(vitri + 1, str, tu)
End Select
Loop
End Function
Cách dùng như thế nào hả bạn? Tôi text mà loay hoay mãi.
 
Upvote 0
Cách dùng như thế nào hả bạn? Tôi text mà loay hoay mãi.

XoaTuDonGian("abc def ghi jkl mno pqr stu vwx", "mno pqr", 5) = "abc def ghi jkl stu vwx" >>> xoá "mno pqr" là 2 từ ở vị trí 5, 6 >>> đúng nên bị xoá

XoaTuDonGian("abc def ghi jkl mno pqr stu vwx", "mno pqr", 3) = "abc def ghi jkl mno pqr stu vwx" >>> xoá "mno pqr" là 2 từ ở vị trí 3,4 >>> không đúng nên không xoá

XoaTuDonGian("abc def mno pqr ghi jkl stu vwx", "mno pqr", 3) = "abc def ghi jkl stu vwx" >>> xoá "mno pqr" là 2 từ ở vị trí 3,4 >>> đúng nên bị xoá

XoaTuDonGian("abc x123 def ghi jkl mno pqr stu vwx", "mno pqr", 5) = "abc x123 def ghi jkl mno pqr stu vwx" >>> xoá "mno pqr" là 2 từ ở vị trí 5,6 >>> không đúng nên không xoá ("mno pqr" ở vị trí 6,7)
 
Upvote 0
XoaTuDonGian("abc def ghi jkl mno pqr stu vwx", "mno pqr", 5) = "abc def ghi jkl stu vwx" >>> xoá "mno pqr" là 2 từ ở vị trí 5, 6 >>> đúng nên bị xoá

XoaTuDonGian("abc def ghi jkl mno pqr stu vwx", "mno pqr", 3) = "abc def ghi jkl mno pqr stu vwx" >>> xoá "mno pqr" là 2 từ ở vị trí 3,4 >>> không đúng nên không xoá

XoaTuDonGian("abc def mno pqr ghi jkl stu vwx", "mno pqr", 3) = "abc def ghi jkl stu vwx" >>> xoá "mno pqr" là 2 từ ở vị trí 3,4 >>> đúng nên bị xoá

XoaTuDonGian("abc x123 def ghi jkl mno pqr stu vwx", "mno pqr", 5) = "abc x123 def ghi jkl mno pqr stu vwx" >>> xoá "mno pqr" là 2 từ ở vị trí 5,6 >>> không đúng nên không xoá ("mno pqr" ở vị trí 6,7)
Tôi copy Code ở #7 vào cửa sổ VBA => Gõ vào ô F6=xoatudongian(D15;"hoàn ứng";5) => Bị lỗi #NAME? => Tôi dốt quá, mong bạn chỉ giúp.
 
Lần chỉnh sửa cuối:
Upvote 0
Chịu thua. Tôi thử thấy bình thường.
Gởi cái file có lỗi #NAME? ấy lên xem thử.

Cũng có thể Project của tôi mặc định Public trong khi của bạn là Private. Thử thêm từ Public trước Function, và kiểm tra hàm này nằm trong một module của nhóm Modules.
 
Upvote 0
Chịu thua. Tôi thử thấy bình thường.
Gởi cái file có lỗi #NAME? ấy lên xem thử.

Cũng có thể Project của tôi mặc định Public trong khi của bạn là Private. Thử thêm từ Public trước Function, và kiểm tra hàm này nằm trong một module của nhóm Modules.
Tôi mở 1 Module trong nhóm Modules của chính File Up ở #1 thì mới chạy thành công. Còn mở 1 Module trong nhóm Mudules của VBAProject (PERSONAL.SLX) hay 1 File Add_Ins thì bị lỗi #NAME? => Không hiểu tại sao nữa?
 
Upvote 0
Chịu thua. Tôi thử thấy bình thường.
Gởi cái file có lỗi #NAME? ấy lên xem thử.

Cũng có thể Project của tôi mặc định Public trong khi của bạn là Private. Thử thêm từ Public trước Function, và kiểm tra hàm này nằm trong một module của nhóm Modules.
Trong cửa sổ VBA, ở bên trái sẽ có VBAProject (PERSONAL.SLX) (Nếu chưa có thì bạn thử Record New Macro => Trong khung Store macro in thì bạn chọn Personal Macro Workbook => Kích OK => Kích Stop Recording) => Bạn mở một Module trong VBAProject (PERSONAL.SLX) đó => Copy Code ở #7 vào Module mới mở đó => Gõ công thức của Code là =xoatudongian(D15;"hoàn ứng";5) => Bị lỗi #NAME? => Bạn thử xem có phải bị lỗi thế không vậy? (Tôi xài Excel 2003).
 
Upvote 0
Trời đất, ai mách cho bạn cách dùng Personal mà không chịu mách cho tới nơi tới chốn.
Dùng UDF chứa trong Personal.xls thì phải cộng thêm phần tiền tố dẫn đường: Personal.xls!HamGiDo(...)
 
Upvote 0
Trời đất, ai mách cho bạn cách dùng Personal mà không chịu mách cho tới nơi tới chốn.
Dùng UDF chứa trong Personal.xls thì phải cộng thêm phần tiền tố dẫn đường: Personal.xls!HamGiDo(...)
Cái vụ
Mã:
Dùng UDF chứa trong Personal.xls thì phải cộng thêm phần tiền tố dẫn đường: Personal.xls!HamGiDo(...)
=> thì tôi mới biết lần đầu (Tôi dốt thật).
Tôi làm theo các bước như trên là gõ công thức:
Mã:
=PERSONAL.XLS!xoatudongian(D10;"hoàn ứng";5)
=> Tuy không gặp phải lỗi #NAME? nhưng lại bị lỗi là không xóa 2 từ "hoàn ứng" (Nghĩa là ô vẫn được giữ nguyên nội dung, không hề bị xóa 2 từ "hoàn ứng") => Mong bạn chỉ giúp.
 
Upvote 0
Tôi đoán già đoán non: với kiểu hỏi hết kỹ xảo (*) này đến kỹ xảo khác như bạn thì có lẽ bạn đang dự tính làm một đồ án nào đó tương đối phức tạp.

Nếu đúng thì tôi khuyên bạn nên tìm hiểu thêm về quy trình đồ án phần mềm. KHởi đầu quy trình là ý tưởng, kế đó là xét khả thi và trắc nghiệm đáp ứng yêu cầu, kế nữa mới tới các giai đoạn giải thuật và thiết kế. Hầu hết các bạn hỏi bài ở đây thiếu hẳn bước thứ 2 cho nên có một ý tuởng mà cứ phải sửa đi sửa lại mãi.

Theo file 1.xls của bạn, tôi thử nghiệm công thức =PERSONAL.XLSB!xoatudongian(D10,"hoàn ứng",5)
thì kết quả như sau:

Mã:
dong 10    ::    Nguyễn Xuân Nam - hoàn ứng tiền thuê máy móc p/v CTTĐ Nậm Nơn    ---->    Nguyễn Xuân Nam - tiền thuê máy móc p/v CTTĐ Nậm Nơn
dong 11    ::    Nguyễn Nam Văn Yên - hoàn ứng tiền thuê máy móc p/v CTTĐ Nậm Nơn    ---->    Nguyễn Nam Văn Yên - hoàn ứng tiền thuê máy móc p/v CTTĐ Nậm Nơn
dong 12    ::    Nguyễn Xuân Nam - hoàn ứng tiền thuê máy móc p/v CTTĐ Nậm Nơn    ---->    Nguyễn Xuân Nam - tiền thuê máy móc p/v CTTĐ Nậm Nơn
dong 13    ::    Nguyễn Xuân Nam - hoàn ứng tiền Internet T09/2014    ---->    Nguyễn Xuân Nam - tiền Internet T09/2014
dong 14    ::    Lê Thành Trung - hoàn ứng tiền tiếp khách    ---->    Lê Thành Trung - tiền tiếp khách
dong 15    ::    Nguyễn Xuân Nam - hoàn ứng tiền thuê máy móc p/v thi công CTTĐ Nậm Nơn    ---->    Nguyễn Xuân Nam - tiền thuê máy móc p/v thi công CTTĐ Nậm Nơn

Ở dòng 11, từ "hoàn ứng" nằm ở vị trí thứ 6 cho nên không bị xoá.
Tôi đã nói trước, đây chỉ là dạng hàm xử lý text đơn giản, cho nên nó chỉ dùng dấu cách để phân biệt từ. Nếu bạn muốn quy định "-" không phải là từ thì xử lý phức tạp hơn nhiều. Đầu tiên hết là phải đưa ra quy luật như thế nào thì kể là từ và như thế nào thì không đếm.

(*) Tôi dùng từ "kỹ xảo" trên để ngụ ý các bạn chỉ muốn học những cái xảo thuật hoa hoè trang điểm chứ cái chính về kết cấu nguyên tắc coding thì chả hề quan tâm đến.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đoán già đoán non: với kiểu hỏi hết kỹ xảo (*) này đến kỹ xảo khác như bạn thì có lẽ bạn đang dự tính làm một đồ án nào đó tương đối phức tạp.

Nếu đúng thì tôi khuyên bạn nên tìm hiểu thêm về quy trình đồ án phần mềm. KHởi đầu quy trình là ý tưởng, kế đó là xét khả thi và trắc nghiệm đáp ứng yêu cầu, kế nữa mới tới các giai đoạn giải thuật và thiết kế. Hầu hết các bạn hỏi bài ở đây thiếu hẳn bước thứ 2 cho nên có một ý tuởng mà cứ phải sửa đi sửa lại mãi.

Theo file 1.xls của bạn, tôi thử nghiệm công thức =PERSONAL.XLSB!xoatudongian(D10,"hoàn ứng",5)
thì kết quả như sau:

Mã:
dong 10    ::    Nguyễn Xuân Nam - hoàn ứng tiền thuê máy móc p/v CTTĐ Nậm Nơn    ---->    Nguyễn Xuân Nam - tiền thuê máy móc p/v CTTĐ Nậm Nơn
dong 11    ::    Nguyễn Nam Văn Yên - hoàn ứng tiền thuê máy móc p/v CTTĐ Nậm Nơn    ---->    Nguyễn Nam Văn Yên - hoàn ứng tiền thuê máy móc p/v CTTĐ Nậm Nơn
dong 12    ::    Nguyễn Xuân Nam - hoàn ứng tiền thuê máy móc p/v CTTĐ Nậm Nơn    ---->    Nguyễn Xuân Nam - tiền thuê máy móc p/v CTTĐ Nậm Nơn
dong 13    ::    Nguyễn Xuân Nam - hoàn ứng tiền Internet T09/2014    ---->    Nguyễn Xuân Nam - tiền Internet T09/2014
dong 14    ::    Lê Thành Trung - hoàn ứng tiền tiếp khách    ---->    Lê Thành Trung - tiền tiếp khách
dong 15    ::    Nguyễn Xuân Nam - hoàn ứng tiền thuê máy móc p/v thi công CTTĐ Nậm Nơn    ---->    Nguyễn Xuân Nam - tiền thuê máy móc p/v thi công CTTĐ Nậm Nơn

Ở dòng 11, từ "hoàn ứng" nằm ở vị trí thứ 6 cho nên không bị xoá.
Tôi đã nói trước, đây chỉ là dạng hàm xử lý text đơn giản, cho nên nó chỉ dùng dấu cách để phân biệt từ. Nếu bạn muốn quy định "-" không phải là từ thì xử lý phức tạp hơn nhiều. Đầu tiên hết là phải đưa ra quy luật như thế nào thì kể là từ và như thế nào thì không đếm.

(*) Tôi dùng từ "kỹ xảo" trên để ngụ ý các bạn chỉ muốn học những cái xảo thuật hoa hoè trang điểm chứ cái chính về kết cấu nguyên tắc coding thì chả hề quan tâm đến.
Tôi đã text lại và đã thành công (Trước đó là do nhầm nhọt sang trồng trọt => Bạn thông cảm). Tôi cảm ơn bạn đã tâm huyết dành cho đề tài này.
 
Upvote 0
Tính mình đơn giản nên code cũng đơn giản theo. Không biết code có lỗi gì không.
Không Trim vì cứ coi như chủ thớt có dữ liệu chuẩn và không cần trim chuỗi kết quả
PHP:
Sub Xoa()
Dim data(), Dk, i, Tem
data = Range("D6", [D65536].End(3)).Value
Dk = "ho" & ChrW(224) & "n" & ChrW(7913) & "ng"
For i = 1 To UBound(data)
   Tem = Split(data(i, 1), Space(1))
   If Tem(4) & Tem(5) = Dk Then
      Tem(4) = Empty: Tem(5) = Empty
      data(i, 1) = Join(Tem)
   End If
Next
[F6].Resize(i - 1) = data
End Sub
Nếu Trim thì nhét thêm hắn vào
PHP:
Sub Xoa()
Dim data(), Dk, i, Tem
data = Range("D6", [D65536].End(3)).Value
Dk = "ho" & ChrW(224) & "n" & ChrW(7913) & "ng"
For i = 1 To UBound(data)
   Tem = Split(Application.Trim(data(i, 1)), Space(1))
   If Tem(4) & Tem(5) = Dk Then
      Tem(4) = Empty: Tem(5) = Empty
      data(i, 1) = Application.Trim(Join(Tem))
   End If
Next
[F6].Resize(i - 1) = data
End Sub
Bạn ơi, nếu Font là VnTime (Không phải là Font Time New Roman) thì Code thay đổi như thế nào hả bạn?
 
Upvote 0

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

Back
Top Bottom